pixel0815
Goto Top

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

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

Content-Key: 276857

Url: https://administrator.de/contentid/276857

Printed on: April 26, 2024 at 00:04 o'clock

Member: joehuaba
joehuaba Jul 09, 2015 updated at 09:46:37 (UTC)
Goto Top
Hallo, mach dir ein kleines VB.net Programm:

Dim Anwendung As New System.Diagnostics.Process()

Anwendung.StartInfo.FileName = "notepad.exe"  
Anwendung.Start()
Anwendung.WaitForExit()

Shell(taskkill /IM FREMDAUFRUF.exe /F)

Fertisch face-smile
Member: Andinistrator1
Andinistrator1 Jul 09, 2015 at 11:20:36 (UTC)
Goto Top
Konfiguration für RDP-Sitzungshostserver
Rechtsklick auf RDP-TCP
Eigenschaften
Sitzungen
getrennte Sitzungen beenden: 1 Minute
Member: pixel0815
pixel0815 Jul 09, 2015 updated at 11:59:35 (UTC)
Goto Top
Der Prozess Notepad.exe, wird dieser sichtbar ausgeführt?
Bekomme leider einen Fehler. Anweisungsende erwartet Teile 1 und zeichen 15. face-sad
Member: joehuaba
joehuaba Jul 09, 2015 at 12:00:47 (UTC)
Goto Top
Du musst natürlich den Prozess "Notepad" mit deinem Prozess ersetzen face-big-smile

Aber ja, normalerweise wird alles das läuft unter Prozesse angezeigt.
Member: emeriks
emeriks Jul 09, 2015 at 12:05:39 (UTC)
Goto Top
Zitat von @pixel0815:

Der Prozess Notepad.exe, wird dieser sichtbar ausgeführt?
Bekomme leider einen Fehler. Anweisungsende erwartet Teile 1 und zeichen 15. face-sad
Beachte: @joehuaba schrieb:
VB.net
und nicht etwa VBA oder VBscript.

E.
Member: pixel0815
pixel0815 Jul 09, 2015 at 12:06:48 (UTC)
Goto Top
Naja aber die Published Applikation wird schon gestartet. Ist recht kompliziert ( ist ja auch kein einfaches Programm ) ..
Man müsste ja dann den Prozess der läuft monitoren und bei einem Exit wird dann der Taskkill ausgeführt.
Member: pixel0815
pixel0815 Jul 09, 2015 at 12:08:07 (UTC)
Goto Top
:o) Stimmt. Dann bietet sich ja die PS an.
Member: emeriks
emeriks Jul 09, 2015 at 12:08:26 (UTC)
Goto Top
Wir schreiben einfach mal das Wort "powershell". Mal sehen, ob der Trigger von @colinardo anschlägt .... face-wink
Member: pixel0815
pixel0815 Jul 09, 2015 at 12:15:17 (UTC)
Goto Top
Im Prinzip müsste man einen gewissen Prozess monitoren können und bei einem Exit Ereignis oder Logoff ereignet müsste einfach nur ein Befehl starten der die andere EXE beendet und schon ist die Session weg.
Member: emeriks
emeriks Jul 09, 2015 updated at 12:28:05 (UTC)
Goto Top
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
Member: pixel0815
pixel0815 Jul 09, 2015 updated at 12:41:56 (UTC)
Goto Top
$WMI = @{
    Query = "select owp from Win32_ProcessStopTrace"  
    Action = {
        Write-Host ("Process: {0}({1}) was terminated at {2}" -f $event.SourceEventArgs.NewEvent.ProcessName,  
                                                                $event.SourceEventArgs.NewEvent.ProcessID,
                                                                [datetime]::FromFileTime($event.SourceEventArgs.NewEvent.TIME_CREATED)) -Back Black -Fore Yellow
								kill -Name DCS_SRV.exe
																
																
    }
    SourceIdentifier = "Process.Deleted"  
}
$Null = Register-WMIEvent @WMI

Das wäre eigentlich was ich brauche. Wenn im Benutzerkontext die owp.exe terminiert wird, dann soll eine Action folgen "kill -Name DCS_SRV.exe" und thema erledigt..

Dein Skript verlangt aber das ich ein Programm damit starte, das kann ich nicht machen. Das ist bisschen schwer zu erklären.

Ok.. ich erhalte ein Zugriff verweigert. Schade !!
Member: emeriks
emeriks Jul 09, 2015 at 12:49:18 (UTC)
Goto Top
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.
Member: pixel0815
pixel0815 Jul 09, 2015 at 13:08:02 (UTC)
Goto Top
Ja du hast recht. Ich teste gerade dein Skript. Der Aufruf würde funktionieren, man müsste den ganzen Programmstart ein wenig umbauen, aber warum nicht? face-wink
Der Weg ist das ziel.

Allerdings teste ich gerade mal so mit Notepad als Startprogramm und einem beliebigen Prozess der Beendet werden soll wenn das gestartete Programm geschlossen wird. Der Taskkill wird wohl nicht ausgeführt?
Member: emeriks
emeriks Jul 09, 2015 at 13:20:27 (UTC)
Goto Top
Der Taskkill wird wohl nicht ausgeführt?
Poste mal Deinen Test-Code.
Member: pixel0815
pixel0815 Jul 09, 2015 at 13:27:51 (UTC)
Goto Top
on error resume next

const StartProgram = "notepad.exe"  
const KillProgram = "DCS_SRV.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
Member: emeriks
emeriks Jul 09, 2015 at 13:33:25 (UTC)
Goto Top
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".
....
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 
....
Member: pixel0815
pixel0815 Jul 09, 2015 at 13:45:07 (UTC)
Goto Top
DIE DCS_SRV.exe ist der Prozess der die Session am leben erhält und gekillt werden muss wenn das Hauptprogramm geschlossen wird.
In meinem Fall war die DCS_SRV.exe schon gestartet als ich das Skript gestartet habe.
Member: pixel0815
pixel0815 Jul 09, 2015 updated at 13:50:53 (UTC)
Goto Top
Leider geht es auch mit der Pause nicht. Fehlermeldungen erhalte ich keine. Tippfehler ausgeschlossen.
Member: emeriks
emeriks Jul 09, 2015 at 17:29:40 (UTC)
Goto Top
Fehlermeldung bekommst Du, wenn Du in der ersten Zeile das "on error ..." raus nimmst oder auskommentierst.
Member: emeriks
Solution emeriks Jul 09, 2015, updated at Jul 10, 2015 at 10:57:29 (UTC)
Goto Top
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.
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
Member: pixel0815
pixel0815 Jul 10, 2015 updated at 08:56:59 (UTC)
Goto Top
Funktioniert :o)
Aber es klappt leider nicht im Gesamtkontext.
Wenn das Skript von dir lediglich einen einen Prozess überwacht bis zu einem Exit dann alles wie gehabt ausführt, würde es klappen denke ich.

Seufz...........