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.
Verheiratet, Vater von zwei Kindern, eines an der Hand, eines im Herzen. Schon immer Technik-Freund, seit 2001 in der IT tätig und seit über 10 Jahren begeisterter Blogger. Mit meiner Firma IT-Service Weber kümmern wir uns um alle IT-Belange von gewerblichen Kunden und unterstützen zusätzlich sowohl Partner als auch Kollegen.
ich möchte einen Ordner Überwachen, wenn der eine neue Datei bekommt, soll diese gedruckt und dann gelöscht werden.
Diese Überwachung soll mit einem alten DOS Programm gemeinsam gestartet und nach dem Beenden des DOS Programms auch wieder beendet werden.
Dad DOS-Programm läuft mit DOS-Box auf W11.
Wie kann ich das machen?
> ich möchte einen Ordner Überwachen, wenn der eine neue Datei bekommt, soll diese gedruckt und dann gelöscht werden.
Um was für einen Dateityp bzw. um welches Format geht es?
> Diese Überwachung soll mit einem alten DOS Programm gemeinsam gestartet und nach dem Beenden des DOS Programms auch wieder beendet werden.
Was genau hat die alte DOS-Anwendung mit der Datei zu tun?
sorry für die lange Pause, jetzt frohes und gesundes und erfolgreiches und damit glückliches 2024.
es handelt sich um eine Text-Datei, die früher, mit HTML Kopf und Fuß , quasi als Htmldatei direkt vom SystemDrucker gedruckt wurde.
Das alte Dos Programm läuft in DosBox auf W11, damit ist aber kein Drucken möglich. deshalb die Textdatei auf eine anderes Laufwerk schreiben. Um von dort automatisch gedruckt zu werden.
und deshalb dort eine Ordnerüberwachung die im Erfolgsfall druckt und killt.