Windows: Aus dem SYSTEM-Kontext heraus einen Befehl oder ein Skript als anderer Benutzer ausführen

Vor kurzem kam nebenbei bei einer Schulung die ich abgehalten habe die Frage bzw. das Thema auf, wie man aus dem SYSTEM-Kontext heraus einen Befehl oder ein Skript als anderer Benutzer ausführen könnte.

Hintergrund dieser Geschichte ist, das die dort verwendete Systems-Management-Lösung, genauer gesagt der Agent als SYSTEM-Benutzer läuft. Verwendet man stattdessen den Administrator gibt es Ungemach wie z.B. das der Administrator für bestimmte Dinge an- oder abgemeldet sein muss.

Die Frage hat mich nun beschäftigt und im Lab wurde ein wenig getestet. Da ich keinen Zugriff auf die Management-Software habe wurde der Aufruf als SYSTEM-Benutzer kurzerhand mittels

psexec -i -s cmd

simuliert. Der erste Gedanke, das man mit RunAs und Alternativen etwas Bauen könnte klappte nicht. Sowohl mit RunAs, miniRunAs als auch startas kam es immer zu einem „Zugriff verweigert“. Schätzungsweise gibt es für SYSTEM keine sekundäre Anmeldung. Mit AutoIt habe ich es gar nicht erst versucht, da ich annahm, das dort das gleiche Scheitern droht.

Als Plan B griff ich dann auf die Aufgabenplanung genauer ausgedrückt dessen Kommandozeile zurück. Damit kann man sich etwas „basteln“. Ein Skript, das im SYSTEM-Kontext ausgeführt wird, legt eine Aufgabe mit dem auszuführenden Benutzer an, führt diese Aufgabe aus und entfernt sie wieder:

@echo off
schtasks /create /tn "<Aufgabenname>" /tr "Pfad\Skript" /sc once /st 00:00 /ru "<Domäne\Benutzername>" /rp "<Kennwort>" /f /rl highest
schtasks /run /tn "<Aufgabenname>"
schtasks /delete /tn "<Aufgabenname>" /f

Die Parameter „/sc“ und „/st“ sind bei der Arbeit mit schtasks verpflichtend, seltsamerweise kann man via GUI Aufgaben ohne Trigger anlegen (und diese dann manuell starten).

Natürlich kann man die gewünschten Aufgaben auch per Hand in der GUI anlegen und dann nur noch ausführen lassen:

schtasks /run /tn "<Aufgabenname>"

Als weitere Möglichkeit bietet es sich an, Aufgaben auf einem Computer vorzukonfigurieren, zu exportieren und dann mittels Befehl bzw. Skript zu importieren:

schtasks /create /tn "<Aufgabenname>" /xml "Pfad\Dateiname.xml" /ru "<Domäne\Benutzername>" /rp "<Kennwort>"

Entgegen der Auskunft in der Hilfe von schtasks ist die Angabe von /tn“ und „/ru“ verpflichtend. Beim Import klappts dann auch mit Aufgaben ohne Trigger.

Einen Rückgabewert kann man so erhalten:

schtasks /query /tn "Aufgabenname" /v /fo list

„Letztes Ergebnis:“ sollte im Erfolgsfall „0“ und im Fehlerfall „1“ oder größer sein. Via „find“ und mit „exit“ könnte man den Rückgabewert dann sozusagen weiterleiten:

schtasks /query /tn "<Aufgabenname>" /fo list /v | find "Letztes Ergebnis: 0"
if %errorlevel%==0 set ExitCode=0
if %errorlevel% gtr 0 set ExitCode=1
exit /b %ExitCode%

Der Rückgabewert von „find“ wäre bei „0“ gefunden also alles ok, bei „1“ nicht gefunden also Fehler. Das ist allerdings nur ein simples Beispiel. Hinweis: Zwischen „Letztes Ergebnis:“ und der Zahl sind einige Leerstellen, diese fehlen hier.

Wichtig ist, das die Abfrage nicht sofort nach dem Ausführen durchgeführt wird, da dies zu Fehlern führt. Eine kurze Pause z.B. mit „timeout /t 2“ sollte schon sein.

Was fehlt ist sowas wie „start /wait“, also das auf das Ende der Aufgabe gewartet werden kann. Durch Abfragen des Aufgabenstatus liese sich dazu allerdings eine Schleife bauen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.