Zum Inhalt springen

VB-Script: Beenden von benutzerspezifischen Prozessen auf TS


flex10

Empfohlene Beiträge

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ß

Link zu diesem Kommentar
Auf anderen Seiten teilen

'--------------------------------------------------------------------

' 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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von flex10
Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

forumtv.jpg

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...