Einen Prozess killen wenn die Published App geschlossen wird - Ideen?
Servus zusammen,
wir haben eine Published Applikation in der ein Fremdaufruf gestartet wird. Wenn ich jetzt die Applikation beende, ist durch den Fremdaufruf noch ein Prozess gestartet der dann über das Connection Center bzw. im Systray geschlossen werden muss. Ist es möglich diesen Prozess dann mit zu beenden?
Ich stelle mir sowas vor wie hier. Das würde auch funktionieren. Aber da wir inzwischen auf Windows 2008 R2 auf diesen Servern aufgestiegen sind, gibt es vielleicht eine elegantere Methode? Ziel ist es beim Schließen der Applikation auch den Prozess zu beenden so das die Session korrekt abgemeldet ist und nicht noch offen ist :o).
Gruß
Heiko
wir haben eine Published Applikation in der ein Fremdaufruf gestartet wird. Wenn ich jetzt die Applikation beende, ist durch den Fremdaufruf noch ein Prozess gestartet der dann über das Connection Center bzw. im Systray geschlossen werden muss. Ist es möglich diesen Prozess dann mit zu beenden?
Ich stelle mir sowas vor wie hier. Das würde auch funktionieren. Aber da wir inzwischen auf Windows 2008 R2 auf diesen Servern aufgestiegen sind, gibt es vielleicht eine elegantere Methode? Ziel ist es beim Schließen der Applikation auch den Prozess zu beenden so das die Session korrekt abgemeldet ist und nicht noch offen ist :o).
cls
ping -n 3 localhost >nul
set tempdatei=%temp%\TempDatei.txt
tasklist /FI "IMAGENAME eq %ProgEXE%" /FO CSV>%tempdatei%
for /F "skip=2 tokens=1 delims=," %%f in (%tempdatei%) do (
echo Suche Prozess: [%%f]
if "%%f"==""%ProgEXE%"" echo Prozess laeuft
goto abfrage
)
goto ende
Gruß
Heiko
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 276857
Url: https://administrator.de/forum/einen-prozess-killen-wenn-die-published-app-geschlossen-wird-ideen-276857.html
Ausgedruckt am: 24.04.2025 um 06:04 Uhr
21 Kommentare
Neuester Kommentar
Zitat von @pixel0815:
Der Prozess Notepad.exe, wird dieser sichtbar ausgeführt?
Bekomme leider einen Fehler. Anweisungsende erwartet Teile 1 und zeichen 15.
Beachte: @joehuaba schrieb:Der Prozess Notepad.exe, wird dieser sichtbar ausgeführt?
Bekomme leider einen Fehler. Anweisungsende erwartet Teile 1 und zeichen 15.
VB.net
und nicht etwa VBA oder VBscript.E.
Wir schreiben einfach mal das Wort "powershell". Mal sehen, ob der Trigger von @colinardo anschlägt .... 
const StartProgram = "deine.exe ggf. mit Parameter"
const KillProgram = "zu_beenden.exe"
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run StartProgram, 1, True
Dim WMI, Processes
Set WMI= GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Do
Set Processes = WMI.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & KillProgram & "'")
For Each objProcess in Processes
WshShell.Exec "PSKill " & objProcess.ProcessId
Wscript.Quit
Next
Loop
Habe das nicht getestet. Hoffe, es geht auch ohne Admin-Rechte.
E.
Edit: Problem könnte sein, dass hier auch Prozesse anderer Sitzungen gelistet werden. Abhilfe könnte sein
on error resume next
const StartProgram = "deine.exe ggf. mit Parameter"
const KillProgram = "zu_beenden.exe"
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run StartProgram, 1, True
Dim WMI, Processes
Set WMI= GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Do
Set Processes = WMI.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & KillProgram & "'")
For Each objProcess in Processes
If KillProcess(objProcess) then
Wscript.Quit
end If
Next
Loop
Function KillProcess(objProcess)
on error goto 0
KillProcess = False
objProcess.Terminate()
KillProcess = True
end Function
Dein Skript verlangt aber das ich ein Programm damit starte, das kann ich nicht machen. Das ist bisschen schwer zu erklären.
???Fakt ist, wenn Du das so machen willst, dann musst Du als PA tatsächlich das Script starten, welches dann erst die EXE startet. Andernfalls müsstets Du einen Dienst oder Scheduled Task laufen lassen, welcher die Benutzersitzungen überwacht und dann ggf. die verbleibenden Prozesse beendet. Das geht ohne weiteres, macht nur Arbeit beim Programmieren.
E.
1. Was ist "DCS_SRV.exe"? Diese wurde schon vorher in der Benutzersitzung gestartet oder wird es während Notepad läuft?
2. Es könnte sein, dass in "KillProgramm" die Groß-Klein-Schreibung beachtet werden muss.
3. Bau mal eine Pause ein. Es kann sein, dass das Script hier "überlädt".
2. Es könnte sein, dass in "KillProgramm" die Groß-Klein-Schreibung beachtet werden muss.
3. Bau mal eine Pause ein. Es kann sein, dass das Script hier "überlädt".
....
Do
Set Processes = WMI.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & KillProgram & "'")
For Each objProcess in Processes
If KillProcess(objProcess) then
Wscript.Quit
end If
Next
Wscript.Sleep 1000
Loop
....
Versuch mal folgendes.
Script ausführen mit cscript.exe. Das hat zwar ein Konsolenfenster, aber das ist ja nur zum Test.
Folgender Code funktioniert bei mir mit "winword.exe". Groß-Klein-Schreibung ist egal.
Wenn Du das reproduzieren kannst, dann nimm die ganzen "Wscript.Echo ..." wieder raus.
Script ausführen mit cscript.exe. Das hat zwar ein Konsolenfenster, aber das ist ja nur zum Test.
Folgender Code funktioniert bei mir mit "winword.exe". Groß-Klein-Schreibung ist egal.
Wenn Du das reproduzieren kannst, dann nimm die ganzen "Wscript.Echo ..." wieder raus.
on error resume next
const StartProgram = "notepad.exe"
const KillProgram = "winword.exe"
Set WshShell = CreateObject("WScript.Shell")
Wscript.Echo "Starte Programm ...."
WshShell.Run StartProgram, 1, True
Wscript.Echo "Programm wurde beendet ...."
Dim WMI, Processes
Set WMI= GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Do
Wscript.Echo "Suche Prozesse ...."
Set Processes = WMI.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & KillProgram & "'")
For Each objProcess in Processes
Wscript.Echo "Prozess gefunden. ID=" & objProcess.ProcessID
If KillProcess(objProcess) then
Wscript.Quit
end If
Next
Loop
Function KillProcess(objProcess)
on error resume next
KillProcess = False
Wscript.Echo "Beende Prozess ..."
select case objProcess.Terminate()
Case 0
Wscript.Echo "Erfolgreich"
KillProcess = True
Case 2
Wscript.Echo "Fehler: Zugriff verweigert"
Case 3
Wscript.Echo "Fehler: unzureichende Privilegien"
Case 8
Wscript.Echo "Fehler: unbekannter Fehler"
Case 9
Wscript.Echo "Fehler: Pfad nicht gefunden"
Case 21
Wscript.Echo "Fehler: falscher Parameter"
end select
end Function