Ausführen einer BAT-Datei als Domänenbenutzer von einem Dienst in Windows 7

Ausführen einer BAT-Datei als Domänenbenutzer von einem Dienst in Windows 7

Zunächst ein paar Grundlagen:

  • Ich führe eine Datenbankserveranwendung aus, die als Dienst ServiceA ausgeführt wird.
  • ServiceA ist auf Server1 und Server2 installiert
  • ServiceA läuft immer nur auf einem der beiden Server (es handelt sich um redundante Server, wenn ein Server ausfällt, startet ServiceA auf dem anderen Server automatisch)
  • Ich habe keine Kontrolle über den Code ServiceA
  • ServiceA meldet sich mit dem lokalen Systemkonto an.
  • ServiceB muss sowohl auf Server1 als auch auf Server2 laufen
  • ServiceB meldet sich mit dem lokalen Systemkonto an.
  • Ich kann Konfigurationsobjekte in der ServiceA-Datenbank erstellen. Ein Objekttyp ist wie eine Skriptsprache, die ServiceA ausführt
  • Die Skriptsprache verfügt über Funktionen, die die Dateimanipulation und Ausführung von Befehlen auf dem lokalen System ermöglichen - OPEN_FILE(), WRITE_FILE(), CLOSE_FILE() und SYSTEM()
  • Wenn diese Befehle ausgeführt werden, werden sie mit den Anmeldeinformationen des lokalen Systemkontos ausgeführt.
  • ServiceA generiert Konfigurationsdateien für ServiceB unter Verwendung der oben genannten Dateimanipulationsbefehle
  • ServiceB muss heruntergefahren werden, bevor die neuen Konfigurationsdateien erstellt werden (ich erstelle sie tatsächlich in einem temporären Ordner, fahre ServiceB herunter, kopiere die Dateien und starte dann ServiceB).
  • Server1 und Server2 sind beide Windows 7 Enterprise
  • Server1 und Server2 befinden sich beide in derselben Domäne

Ich versuche, ServiceA dazu zu bringen:

  • Fahren Sie ServiceB sowohl auf Server1 als auch auf Server2 herunter.
  • Kopieren Sie einige Dateien auf Server1 und Server2
  • Starten Sie ServiceB sowohl auf Server1 als auch auf Server2

Was habe ich getan:

  • Ein Domänenkonto (DomainX/UserY) mit einem Passwort (PasswordZ) erstellt
  • Auf beiden Servern eine Freigabe erstellt (ShareW)
  • DomainX/UserY-Berechtigung zum Zugriff auf ShareW auf beiden Servern erteilt
  • Mit OPEN_FILE(), WRITE_FILE() und CLOSE_FILE() wurde eine INSTALL.BAT-Datei erstellt.
  • Verwendet SYSTEM('C:\Temp\INSTALL.BAT >> C:\Temp\INSTALL.LOG 2>&1'), um INSTALL.BAT auszuführen (wird von Dienst A als lokales System ausgeführt) und ein Debug-Protokoll zu erstellen

Was funktioniert innerhalb der BAT-Datei

NET USE \\Server1\ShareW PasswordZ /USER:DomainX/UserY
NET USE \\Server2\ShareW PasswordZ /USER:DomainX/UserY
DEL /F /Q "\\Server1\ShareW\*.*
DEL /F /Q "\\Server2\ShareW\*.*
XCOPY /Y "C:\Temp\*.*" "\\Server1\ShareW\"
XCOPY /Y "C:\Temp\*.*" "\\Server2\ShareW\"
NET USE \\Server1\ShareW /DELETE
NET USE \\Server2\ShareW /DELETE

Damit die Freigabe und Berechtigungen richtig eingerichtet sind

Mein Problem besteht darin, dass ich versuche, Dienst B innerhalb von INSTALL.BAT zu stoppen und zu starten.

Ich habe versucht:

NET USE \\Server1\IPC$ PasswordZ /USER:DomainX/UserY
SC \\Server1 STOP "Service B"
NET USE \\Server1\IPC$ /DELETE
NET USE \\Server2\IPC$ PasswordZ /USER:DomainX/UserY
SC \\Server2 STOP "Service B"
NET USE \\Server2\IPC$ /DELETE

Der SC-Befehl funktioniert auf dem lokalen Rechner, schlägt aber auf dem Remote-Rechner fehl. Dies ist die Ausgabe von INSTALL.BAT, das auf Server2 ausgeführt wird:

C:\Windows\system32>NET USE \\Server1\IPC$ PasswordZ /USER:DomainX/UserY 
The command completed successfully.

C:\Windows\system32>SC \\Server1 STOP ServiceB 
[SC] OpenService FAILED 5:

Access is denied.

(Ich habe es mit ServiceA versucht, das auf Server1 und Server2 ausgeführt wird – gleiches Ergebnis – Funktioniert lokal, schlägt remote fehl)

Wenn ich „Als anderer Benutzer ausführen“ verwende, um CMD.EXE als DomainX/UserY auszuführen, funktioniert der SC-Befehl einwandfrei. Wenn ich also auf Server2 INSTALL.BAT von CMD.EXE als DomainX/UserY ausführe, erhalte ich:

C:\Temp>NET USE \\Server1\IPC$ PasswordZ /USER:DomainX/UserY

The command completed successfully.
C:\Temp>SC \\Server1 START ServiceB

SERVICE_NAME: ServiceB
        TYPE               : 110  WIN32_OWN_PROCESS  (interactive)
        STATE              : 2  START_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x1
        WAIT_HINT          : 0xbb8
        PID                : 4856
        FLAGS              :

DomainX/UserY verfügt also über die erforderlichen Berechtigungen, um den Dienst auf dem Remote-Server zu stoppen und zu starten. Es scheint sich um eine Art Blockierung der Rechteausweitung vom lokalen Systemkonto zu handeln.

Ich habe gelesen, dass man LocalAccountTokenFilterPolicy in HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ auf 1 setzen und neu starten soll. Ich habe das getan, ohne dass sich etwas am Ergebnis geändert hat.

Ich habe versucht, psservice.exe mit praktisch identischen Ergebnissen zu verwenden (Ausgabe von INSTALL.BAT, ausgeführt von ServiceA auf Server2).

C:\Windows\system32>C:\Utilities\psservice.exe \\Server1 -u DomainX/UserY -p PasswordZ -accepteula stop ServiceB 

PsService v2.24 - Service information and configuration utility
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com

Access is denied.
Access is denied.
Error querying services on Server1:
Error opening ServiceB on Server1:

Ich habe dann versucht, psexec zu verwenden (auf eine ziemlich komplizierte Art und Weise, um die gesamte Protokollierung abzufangen).

INSTALL2.BAT

C:\Utilities\psexec -accepteula -u DomainX/UserY -p PasswordZ C:\Temp\INSTALL3.BAT >> C:\Temp\INSTALL3.LOG 2>&1

INSTALL3.BAT

C:\Temp\INSTALL.BAT >> C:\Temp\INSTALL.LOG 2>&1

Wenn ich INSTALL2.BAT von der Befehlszeile aus ausführe (als DomainX/UserY), funktioniert alles einwandfrei.

Beim Ausführen von ServiceA erhalte ich in INSTALL3.LOG Folgendes:

PsExec v2.11 - Execute processes remotely
Copyright (C) 2001-2014 Mark Russinovich
Sysinternals - www.sysinternals.com

Access is denied.

PsExec could not start C:\Temp\INSTALL3.BAT:

Also habe ich DomainX/UserY mit Vollzugriff explizit zur Sicherheit aller drei BAT-Dateien hinzugefügt. Das Ergebnis war das gleiche (Zugriff verweigert. in INSTALL3.LOG)

Ich habe auch versucht, UAC auszuschalten, ohne spürbare Auswirkungen

Jetzt stecke ich also ziemlich fest: Wie kann ich erreichen, dass eine BAT-Datei von einem als lokales System ausgeführten Dienst ausgeführt wird, um die Identität eines anderen Benutzers anzunehmen und das Stoppen und Starten von Diensten auf einem Remotecomputer zu ermöglichen?

Antwort1

Die Antwort ist ganz einfach: Verwenden Sie die Option -h von psexec

Der SYSTEM()-Befehl des von ServiceA ausgeführten Skripts lautet jetzt:

C:\Utilities\psexec -accepteula -h -u DomainX/UserY -p PasswordZ C:\Temp\INSTALL.BAT >> C:\Temp\INSTALL.LOG 2>&1

Funktioniert perfekt

verwandte Informationen