Der Taskplaner beendet nur cmd.exe, nicht jedoch die untergeordneten Prozesse

7

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?

Icelava
quelle
Wir haben das gleiche Problem. Hast du das jemals gelöst?
Bengt
Nein ..... T__T
icelava

Antworten:

2

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

Warren Stevens
quelle
1

Prozesse sind in Windows unabhängig - Wenn Sie einen übergeordneten Prozess beenden, wird ein untergeordneter Prozess nicht automatisch beendet.

Christopher_G_Lewis
quelle
1
Wenn dies der Fall ist, warum beendet der Taskplaner, der cmd.exe beendet, auch die anderen EXE-Prozesse in meinen Testfällen?
Icelava
Warum nicht und wie beendet man eine Aufgabe so, dass auch die untergeordneten Prozesse beendet werden?
Bames53
Siehe @ Warren-Stevens Antwort
Christopher_G_Lewis
0

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.

Adam Brand
quelle
Diese Programme wurden nicht von uns geschrieben und wir dürfen sie nicht ändern, es sei denn, es gibt ernsthafte Probleme, die eine Behebung erfordern. Meine Frage hier bezieht sich nicht auf die Entwicklung von .NET-Anwendungen. Es geht um den Taskplaner und die Prozessbaumsteuerung.
Icelava
Wenn ich die geplante Aufgabe als mein eigenes Benutzerkonto ausführe, das Administrator ist, können sie beendet werden.
Icelava
Richtig, denn Ihre Anwendung startet dann im richtigen Sicherheitskontext. Ich vermute jedoch, dass die anderen Apps ihren Sicherheitskontext eskalieren und es Nicht-Administratorkonten unmöglich machen, sie dann zu töten.
Adam Brand
Ich habe meine Antwort mit einem alternativen Ansatz aktualisiert.
Adam Brand
Aber als ich dies mit einem anderen Administratorkonto getestet habe, taucht das Verhalten auf.
Icelava
0

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.

Bork Blatt
quelle
Ich frage nicht nach Tötungsprozessen. Ich frage, warum ein untergeordneter Prozess verwaist ist oder nicht, nachdem die übergeordnete cmd.exe beendet wurde.
Icelava
0

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 ...

M Aguilar
quelle
Während dies ein interessanter Hinweis ist, frage ich mich, warum ein untergeordneter Prozess verwaist ist oder nicht, nachdem die übergeordnete cmd.exe beendet wurde.
Icelava