flex10 Geschrieben 8. Januar 2010 Geschrieben 8. Januar 2010 Hallo, wir nutzen einen Citrix TS auf dem sich mehrere Benutzer anmelden und veröffentliche Anwendungen nutzen. Ab und zu friert ein bestimmtes Programm ein, dann müssen wir die betroffenen Prozesse manuell beenden. Ich baue z.Z. ein VB-Script damit die User das abgestürtzte Programm selbst beenden können. Hier der Quellcode (am Beispiel notepad.exe): Option Explicit Dim objWMIService, objProcess, colProcessList Dim strComputer, strProcessKill strComputer = "." strProcessKill = "'notepad.exe'" Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") Set colProcessList = objWMIService.ExecQuery _ ("Select * from Win32_Process Where Name = " & strProcessKill) For Each objProcess in colProcessList objProcess.Terminate() Next WSCript.Echo "Notepad wurde beendet." WScript.Quit Dies funktioniert an sich auch so. ABER wenn mehrere Benutzer Notepad am Laufen haben, dann werden alle geöffneten Notepad-Prozesse auf dem Server beendet! Wie kriegt man es hin, dass das Script nur den Prozess des einzelnen Benutzers, der das Script ausführt, beendet? Danke und Gruß Zitieren
tester2k5 Geschrieben 10. Januar 2010 Geschrieben 10. Januar 2010 '-------------------------------------------------------------------- ' Description '-------------------------------------------------------------------- ' Kills each named process instance of the current or named user '-------------------------------------------------------------------- ' Declarations '-------------------------------------------------------------------- Option Explicit 'On Error Resume Next Dim objNetwork: Set objNetwork = Wscript.CreateObject("Wscript.Network") '-------------------------------------------------------------------- ' Variables '-------------------------------------------------------------------- Dim strComputer: strComputer = "." Dim strCurrUser: strCurrUser = objNetwork.UserName Dim Process2kill: Process2kill = "notepad.exe" '-------------------------------------------------------------------- ' Skript '-------------------------------------------------------------------- Dim colProcesses: Set colProcesses = GetObject("winmgmts:" & _ "{impersonationLevel=impersonate}!\\" & strComputer & _ "\root\cimv2").ExecQuery("Select * from Win32_Process WHERE Name = '" & Process2kill & "'") Dim objProcess, Return, strNameOfUser For Each objProcess in colProcesses Return = objProcess.GetOwner(strNameOfUser) If Not Return <> 0 Then If strNameOfUser = strCurrUser Then objProcess.Terminate() Wscript.Echo "The process " & Chr(34) & objProcess.Name & Chr(34) & " of the User " & Chr(34) & strNameOfUser & Chr(34) & " was terminated" End If End If Next Set objNetwork = Nothing Set colProcesses = Nothing Alternativ mit dem Windows Tool TASKKILL: TASKLIST /F /FI "USERNAME eq DOMAIN\USER" /IM notepad.exe Gruss, tester2k5 Zitieren
flex10 Geschrieben 11. Januar 2010 Autor Geschrieben 11. Januar 2010 (bearbeitet) Das Script funktioniert! Vielen Dank. Allerdings streikt es nur bei einem einzigen Programm. Mit Admin-Rechten klappts, aber mit eingeschränkten User-Rechten klappts nicht. Es kommt keine Fehlermeldung, nichts. Es kann diese eine Anwendung einfach nicht beenden. Bei meinem oben angegebenen Script wird die Anwendung allerdings mit User-Rechten beendet. Woran kann das liegen? Das mit taskkill war mir bekannt und funktioniert auch unter einem unserer Windows2003 Server, aber hier handelt es sich um einen Windows 2000 Server. Bearbeitet 11. Januar 2010 von flex10 Zitieren
tester2k5 Geschrieben 11. Januar 2010 Geschrieben 11. Januar 2010 Bist du sicher, das du den korrekten Prozess-Namen der Anwendung hast (TaskManager)? Ggf. nutzt deim Programm einen App-Starter / Loader, der dann das eigentliche Program startet. Kannst du die Anwendung als User lokal auf dem Server mit dem Skript beenden? Gruss, tester2k5 Zitieren
flex10 Geschrieben 12. Januar 2010 Autor Geschrieben 12. Januar 2010 Die Schreibweise ist auf jeden Fall richtig. Wenn ich mich als User lokal auf dem Server anmelde, wird das Programm nicht beendet. Wenn ich mich aber als Admin anmelde, funktioniert es. Wie gesagt, mit diesem Script funktioniert es auch als User, jedoch werden dann alle Instanzen beendet: Option Explicit Dim objWMIService, objProcess, colProcess Dim strComputer, strProcessKill strComputer = "." strProcessKill = "'xyz.exe'" Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") Set colProcess = objWMIService.ExecQuery _ ("Select * from Win32_Process Where Name = " & strProcessKill ) For Each objProcess in colProcess objProcess.Terminate() Next WSCript.Echo "xyz.exe wurde beendet" WScript.Quit Kleine Anmerkung: Das Programm befindet sich auf einem anderen Server, wird also nicht auf dem lokalen Server gestartet sondern extern. Hat es was damit zu tun? Zitieren
tester2k5 Geschrieben 12. Januar 2010 Geschrieben 12. Januar 2010 Das Programm befindet sich auf einem anderen Server, wird also nicht auf dem lokalen Server gestartet sondern extern. Verstehe ich gerade nicht ganz... Liegt es nur extern, oder wird es auf dem externen Server gestartet? Dann könntest du es aber nicht auf deinem Server beenden... Da musst du mal schauen, wo der Prozess der Anwendung läuft. Gruss, tester2k5 Zitieren
flex10 Geschrieben 13. Januar 2010 Autor Geschrieben 13. Januar 2010 Sorry hab mich falsch ausgedrückt. Die Applikation liegt extern, wird aber natürlich lokal gestartet. Zwischenzeitig hab ich Dein Script mal genauer erforscht und bin zu dem Ergebnis gekommen, dass diese eine Applikation den getOwner-Befehl nicht als User ausführen kann. Als Antwort liefert es eine 2 (Access Denied). Als Admin kommt die 0 und alles läuft wie es soll. If Return = 0 Then If strNameOfUser = strCurrUser Then objProcess.Terminate() Komischerweise kann ich aber als User die Anwendung von anderen Usern killen, wenn ich den getOwner rauslasse. Hört sich für mich an wie ein Bug. Gibt es noch eine andere Möglichkeit außer dem getOwner string, den Benutzernamen zu ermitteln? Zitieren
flex10 Geschrieben 13. Januar 2010 Autor Geschrieben 13. Januar 2010 Kleines Update: Mit dem Process Explorer von Sysinternals habe ich ermittelt, dass die Applikation für User die erweiterte Sicherheitseinstellung "Query Information" nicht zur Verfügung stellt. Bei Admins ist da ein Haken. Setzt man da den Haken bei Query Information, kann man als User den Owner ermitteln und das Script funktioniert! Ich hab mal ein Screenshot davon gemacht: Allerdings ist dies natürlich nur temporär im Process Explorer machbar. Unter den Sicherheitseinstellungen der Applikation (Rechtsklick auf die EXE-->Eigenschaften-->Sicherheitseinstellungen--> Erweitert-->Anzeigen/Bearbeiten) gibt es leider nichts dergleichen, sodass ich diese Berechtigung für User speichern könnte. Hoffe die Infos haben dir geholfen tester2k5 Zitieren
tester2k5 Geschrieben 13. Januar 2010 Geschrieben 13. Januar 2010 Spontan wüsste ich nicht wie und wo Prozess-Berechtugungen für den User gesetzt werden. Bin bei MS auf Query.exe gestossen, das könntest du mal testen. teste auch mal TASKLIST / TASKKILL. Andernfalls muss die Stelle gefunden werden. Gruss, tester2k5 Zitieren
flex10 Geschrieben 14. Januar 2010 Autor Geschrieben 14. Januar 2010 Wie gesagt, taskkill/tasklist oder query.exe funktionieren nicht, da es sich um einen Windows 2000 Server handelt.. Ich habe den Hersteller des Programms kontaktiert, mal sehen wie es weitergeht. Ich melde mich dann wieder. Für andere bzw. neue Vorschläge bin ich natürlich offen. Zitieren
tester2k5 Geschrieben 14. Januar 2010 Geschrieben 14. Januar 2010 Wieso funktionieren die nicht? Weil sie von / für 2003 sind? die kannst du auf 2000 kopieren und starten, es sind standalone executables. Gruss, tester2k5 Zitieren
flex10 Geschrieben 26. Januar 2010 Autor Geschrieben 26. Januar 2010 Das Support-Team hat sich gemeldet, mit einem Verweis auf folgende Seite How do you determine the owner of a process - Visual Basic .NET answers Ich solle es mit "ManagementObjectSearcher" versuchen den owner zu ermitteln, aber so wirklich krieg ich das nicht hin.. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.