Ich habe PsExec -d
zum Starten von Konsolenanwendungen in einer Remote-Powershell-Sitzung verwendet, weil ich möchte, dass diese Anwendungen im Hintergrund ausgeführt werden, während ich eine Aufgabe ausführe. Das Problem ist, dass ich möchte, dass die Hintergrundanwendungen weiter ausgeführt werden, selbst wenn ich die Remote-Powershell-Sitzung mit Remove-PSSession
abbringe. Was passiert, ist, wenn die Remote Powershell-Sitzung beendet wird, also alle Prozesse, die mit Hilfe von PsExec -d
gestartet wurden. Ich vermute, es hat etwas mit Prozessbäumen zu tun und wie Windows die Lebensdauer solcher Dinge verwaltet.
Hat jemand eine Idee, wie ich einen Remote-Hintergrundprozess starten kann und diesen Prozess auch nach dem Ende der Remote-Sitzung bestehen bleibt?
Hier ist zuerst eine Erklärung, warum es so funktioniert. Vielleicht kann jemand anders damit eine andere Lösung bringen.
Ich habe meine Antwort mit einer auf WMI basierenden Lösung bearbeitet.
Wenn Sie eine Remote-Sitzung eingeben:
%Vor% Sie erstellen auf dem Server einen Prozess namens wsmprovhost.exe
, wie hier unter
Wenn Sie einfach einen Prozess in dieser Remote-Sitzung starten:
%Vor% Der neue Prozess ist ein Kind von wsmprovhost.exe
, wie hier unter
Wenn Sie die Remote-Sitzung beenden, ist wsmprovhost.exe
verschwunden und damit der untergeordnete Prozess.
Die Erklärung ist, dass wsmprovhost.exe
und alle Prozesse, die von diesem gestartet werden, zum selben Job gehören.
Standardmäßig unterstützt dieser Job NICHT JOB_OBJECT_LIMIT_BREAKAWAY_OK
limit Flag, das es uns nicht erlaubt, einen Prozess mit CREATE_BREAKAWAY_FROM_JOB
flag zu starten, andererseits unterstützt dieser Job JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
limit Flag, das alle Prozesse verursacht ist mit dem Job verknüpft, der beendet wird, wenn das letzte Handle für den Job geschlossen wird.
Möglicherweise gibt es eine Lösung, um WinRM so zu konfigurieren, dass Jobs unterstützt werden, die JOB_OBJECT_LIMIT_BREAKAWAY_OK
unterstützen.
Bearbeitet:
So lesen Microsoft-Dokumentation , Ich habe eine dokumentierte technische Möglichkeit gefunden, ein Programm über WinRM zu starten, aber in einem anderen Job. Standardmäßig werden Prozesse, die mit CreateProcess durch einen Prozess erstellt wurden, der einem Job zugeordnet ist, mit dem Job verknüpft. Prozesse, die mit Win32_Process.Create erstellt wurden, sind jedoch nicht mit dem Job verknüpft .
Wenn Sie also in Ihrer Remote-Sitzung einen Prozess mit WMI wie diesem erstellen:
%Vor%Wenn Sie die Remote-Sitzung stoppen wsmprovhost.exe verschwunden, aber der neue Prozess bleibt auf dem Server, wie hier unter:
Die mit WMI gestarteten Prozesse gehören keinem Job an. Auf Französisch würde ich sagen "Ce qu'il fallait démontrer"
Tags und Links powershell powershell-v2.0 powershell-remoting psexec