Unser Kunde hat einige Windows 2003-Server, auf denen Stapeljobs ausgeführt werden, die vom Taskplaner aktiviert wurden. Die eigentlichen Programme, die die Arbeit ausführen, sind benutzerdefinierte EXE-Prozesse und werden zu CMD-Skripten zusammengefasst, sodass sie vom Taskplaner zusammen gestartet werden, wenn das geplante Intervall verstrichen ist. Die Zeilen in den cmd-Skripten verwenden möglicherweise den Befehl Call, um die separaten EXE-Programme zu starten.
In diesem Setup überwacht der Taskplaner cmd.exe effektiv. Wenn Sie den Prozess-Explorer verwenden, können Sie feststellen, dass die untergeordneten EXE-Prozesse unter dem Prozessbaum cmd.exe geparkt sind. Wenn der Taskplaner jedoch cmd.exe aufgrund eines Überschreitens des zulässigen Zeitlimits beendet, werden die untergeordneten .exe-Prozesse möglicherweise nicht zusammen mit dem übergeordneten Prozess beendet und verwaist. Diese Prozesse bleiben auf unbestimmte Zeit blockiert. Aufgrund des Status der im Prozess-Explorer angezeigten Prozessthreads vermute ich, dass diese Prozesse fehlerhaft sind und ein .NET-Debugger-Dialogfeld (dies sind .NET-Anwendungen) angezeigt wird, das nicht angezeigt wird, da der Stapeljobbenutzer ein separater Benutzer ist Konto.
Als ich dieses Verhalten auf meiner Windows XP-Workstation untersuchte, stellte ich zunächst fest, dass untergeordnete .exe-Prozesse, die über mein .cmd-Testskript gestartet werden, zusammen mit cmd.exe beendet werden, wenn der Taskplaner feststellt, dass die Zeit abgelaufen ist. Ich konnte die untergeordneten Prozesse auf keinen Fall verwaisen.
Aufgrund einer Vermutung wechselte ich schließlich zu einem Windows 2003-Computer, um dies zu testen. Ebenso werden die untergeordneten Prozesse so beendet, dass sie wie auf meiner Workstation beendet werden. Mein zweiter Schritt war dann, ein anderes Benutzerkonto zu verwenden, um die geplante Aufgabe auszuführen. Dieses Mal wird cmd.exe beendet, nachdem das Zeitlimit überschritten wurde, aber die untergeordneten Prozesse bleiben bestehen, genau wie es mein Kunde auf seinen Produktionsservern beobachtet hat.
Wenn ich dieses Batch-Benutzerkonto (das zufällig ein anderes Administratorkonto war) präventiv anmelde, um eine Desktopsitzung zu beanspruchen, werden alle Fehler- oder Info-Popups aus meinen Test-EXE-Programmen weitergeleitet und auf diesem Desktop gerendert, sodass ich dies tun kann Siehe die tatsächliche Benutzerausgabe. Wenn ich mich erst anmelde, nachdem die geplante Aufgabe aufgerufen wurde, "fordert" die Desktopsitzung die Fenster der vorhandenen Prozesse nicht zurück. Sie bleiben für immer verborgen.
Meine Frage ist, welche Bedingung (en) fehlen mir hier, die dazu führen können, dass der Taskplaner die untergeordneten Prozesse unter einer cmd.exe nicht löscht? Was ist das Besondere an der Verwendung eines anderen Kontos, das dieses Verhalten hervorrufen würde, jedoch nicht, wenn mein aktuelles Administratorkonto zum Ausführen der geplanten Aufgabe verwendet wird?
Antworten:
Versuchen Sie es mit "Taskkill / T" in der Befehlszeile. (/ T = "... Beendet den angegebenen Prozess und alle von ihm gestarteten untergeordneten Prozesse ...")
Wenn mehrere Prozesse ausgeführt werden (häufig werden 5 oder mehr "Powershell.exe" ausgeführt), fügen Sie die Spalte "Befehlszeile" zur Registerkarte "Details" im Task-Manager hinzu. Das sollte klar machen, welche Prozess-ID diejenige ist, die Sie abbrechen möchten
quelle
Prozesse sind in Windows unabhängig - Wenn Sie einen übergeordneten Prozess beenden, wird ein untergeordneter Prozess nicht automatisch beendet.
quelle
Wenn Sie glauben, dass eine Debugger-Meldung angezeigt wird, haben Sie versucht, den Code in einen
try{}catch{}
Block zu packen und den Fehler zu protokollieren?Andernfalls können Sie möglicherweise die Prozesse die Ausgabe von schreiben lassen
WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent())
Ich vermute, dass die Kinder irgendwie ihre Berechtigungsstufe zum Administrator eskalieren und dann nicht mit den Eltern getötet werden können.
Um dies zu testen, ohne den Code zu ändern , können Sie eine andere geplante Aufgabe schreiben, die versucht, die anderen Prozesse mit taskkill abzubrechen . Diese geplante Aufgabe sollte als Administrator ausgeführt werden. Wenn das funktioniert, scheint es sich um ein Sicherheitsproblem zu handeln.
quelle
Wie wäre es mit dem Dienstprogramm pskill , das Teil der SysInternals-Suite ist? Dieses Programm kann Prozesse nach Namen beenden. Ich würde eine geplante Aufgabe hinzufügen, die einige Minuten nach dem erwarteten Abschluss der Prozesse ausgeführt wird und pskill ausführt, um sie zu beenden.
PSKill kann auch unter Benutzeranmeldeinformationen ausgeführt werden, die Sie in der Befehlszeile angeben.
quelle
Ich weiß nicht, ob es Ihr Problem lösen wird, aber wenn es mit den Popup-Feldern zusammenhängt (und es könnte sein - die App befindet sich in einem fehlerhaften Zustand und wird angehalten, während der nicht vorhandene Benutzer entscheidet, was dagegen zu tun ist). .
Werfen Sie einen Blick auf http://blogs.msdn.com/shawnfa/archive/2004/07/15/184490.aspx und sehen Sie, ob Sie diese Boxen nicht loswerden können ...
quelle