derhoeppi
Goto Top

Aufruf einer CMD aus einem VBScript läuft nicht sauber

Hallo Leute,

ich habe ein VBScript, das ein vorhandenes Batch-Skript aufrufen soll. Für den Aufruf der CMD habe ich folgende Zeile eingefügt.

CALL wshShell.Run("Datei.cmd", 1, True)

Diese Zeile wird im Skript aufgerufen, so dass mein Batch-Skript gestartet wird. Leider startet dieses Skript nicht korrekt bzw. wird nicht bis zum Ende ausgeführt.

Die Batch-Datei enthält folgende Zeilen:

query session >session.txt
for /f "skip=1 tokens=3," %%i in (session.txt) DO msg %%i /Time 60 /V Test
timeout 60
for /f "skip=1 tokens=3," %%a in (session.txt) DO Andere Anweisung

Wenn ich die Batch selber mit einem Rechtsklick RunAsAdministrator ausführe, funktioniert sie einwandfrei. Wenn die Batch aus der VBS aufgerufen wird, läuft Sie bis zur Zeile timeout 60 und beginnt anschließend wieder die erste for Schleife. Woran liegt es und wie kann ich es lösen oder umgehen?

Gruß
derhoeppi

Content-Key: 228270

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

Printed on: April 18, 2024 at 18:04 o'clock

Member: colinardo
colinardo Jan 31, 2014 updated at 12:14:08 (UTC)
Goto Top
Hallo derhoeppi:
Set objShell = CreateObject("Wscript.Shell")  
objShell.Run "cmd.exe /c C:\Datei.cmd", 1, True  
dann solltest du das VB-Script auch als Admin starten wenn dies für das Batch-Script nötig ist.
runas /user:Administrator "cscript.exe //NOLOGO deinScript.vbs"
Grüße Uwe
Member: derhoeppi
derhoeppi Jan 31, 2014 at 15:50:25 (UTC)
Goto Top
Hallo Uwe,

das ganze soll als Scheduled Task laufen und wird derzeit über die wscript.exe aufgerufen. Ich habe deinen Run Befehl übernommen und dennoch beginnt die erste Schleife nach dem Timeout erneut, obwohl diese bereits außerhalb der Schleife ist.

Gruß
derhoeppi
Member: colinardo
colinardo Jan 31, 2014 at 16:13:38 (UTC)
Goto Top
mir ist schleierhaft wieso deine Batch überhaupt funktioniert, wenn ich meine Ausgabe von query session betrachte gibt dein Befehl nicht Usernamen aus, sondern den Status. Und dann läuft in deiner Schleife natürlich noch der Befehl MSG der bei nicht Erreichbarkeit des Users jeweils 60 Sekunden wartet...

Wenn deine Batch so läuft (wie auch immer) dann ist der Task falsch eingestellt, bzw. ein falscher Useraccount im Task angegeben, oder das Häkchen bei Mit höchsten Privilegien ausführen nicht gesetzt. Oder der angegebene User hat keine Rechte in den Ordner zu schreiben in dem die Batch ausgeführt wird. Leite die Datei session.txt also mal in ein Verzeichnis um in dem der angegebene Useraccount im Task die entsprechenden Schreibrechte hat...

Grüße Uwe
Member: derhoeppi
derhoeppi Feb 01, 2014 at 17:06:08 (UTC)
Goto Top
Hallo Uwe,
der Task läuft als System-Benutzer. Damit sollten / sind die Berechtigungen in Ordnung - session.txt wird erstellt. Im Task ist ebenfalls der Haken bei "Mit höchsten Privilegien ausführen" gesetzt. Meine Session.txt liest die Sitzungen korrekt aus. Aufbau der Spalten: SITZUNGSNAME, BENUTZERNAME, ID, STATUS, TYP, GERÄT. Durch die Tokens=3 soll eigentlich die ID verwendet werden, aber bei der Session Service z.B. gibt es keinen Benutzernamen, so dass die dritte Spalte leider der Status ist. Für meine belange - Abmelden aller angemeldeten Benutzer habe ich damit jedoch kein Problem.

Wenn ich für das VBS und das Batch-Skript jeweils einen separate Scheduled Tasks erstelle werden beide zu meiner Zufriedenheit ausgeführt. Mein Problem ist jedoch das in der VBS eine Bedingung geprüft wird, die bei derer Erfüllung nur den Logoff ausführt und damit das Batch-Skript aufruft.

Gruß
derhoeppi
Member: derhoeppi
derhoeppi Feb 05, 2014 at 09:30:53 (UTC)
Goto Top
Hallo Uwe,

ich möchte das ganze nun weiter umbauen, so dass ich komplett in VBS bleibe.

strComputer = "."
Set objWMI = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colSessions = objWMI.ExecQuery _
("Select * from Win32_LogonSession Where LogonType = 10 or LogonType = 2")

For Each objSession in colSessions
Set colList = objWMI.ExecQuery("Associators of " _
& "{Win32_LogonSession.LogonId=" & objSession.LogonId & "} " _
& "Where AssocClass=Win32_LoggedOnUser Role=Dependent" )
WScript.Echo "LogonID: " & objSession.LogonID
For Each objItem in colList
WScript.Echo "Username: " & objItem.Name & " FullName: " & objItem.FullName
Next
Next

Mein Problem ist nun das ich als User auf einem System via RDP angemeldet bin. Ich habe mich gewundert, dass mir 4 LogonID's zurückgemeldet werden. Wenn ich mir dazu wie in dem Skript den Benutzernamen ausgeben lasse, sind die 4 LogonID's alle meinem Benutzer zugeordnet. Hast du einen Tipp wie ich in der colSession bereits nach dem Usernamen filtern kann, so dass ich als Ergebnis jeden User nur einmal erhalte?

Gruß
derhoeppi
Member: colinardo
colinardo Feb 05, 2014 updated at 11:55:06 (UTC)
Goto Top
Hi,
LogonType reicht wenn dieser auf 10 steht. Dieser beinhaltet bereits interaktive Logon-Sessions (http://msdn.microsoft.com/en-us/library/aa394189%28v=vs.85%29.aspx)
"Select * from Win32_LogonSession Where LogonType = 10"
Es sei aber darauf hingewiesen das die Queries auf neueren Systemen eventuell gecachte Sessions beinhalten können, und es deshalb zu doppelten Namen kommt.
Für eine zuverlässigere Abfrage ist hier die Klasse Win32_LoggedOnUser besser geeignet oder das u.s. Script.
Powershell:

Wenn du bei VBS bleiben willst:
strComputer = "."     
Set objWMI = GetObject("winmgmts:" _   
              & "{impersonationLevel=impersonate}!\\" _   
              & strComputer & "\root\cimv2")   

Set colExplorers = objWMI.ExecQuery _ 
    ("Select * from Win32_Process Where Name = 'explorer.exe'")   

If colExplorers.Count > 0 Then  
   For Each proc In colExplorers
   		colProperties = proc.GetOwner(strNameOfUser,strUserDomain)
   		MsgBox strUserDomain & "\" & strNameOfUser  
   Next 
End If
Grüße Uwe
Member: derhoeppi
derhoeppi Feb 05, 2014 at 11:58:59 (UTC)
Goto Top
Hallo Uwe,
ich habe mir mal die Klasse Win32_LoggedOnUser angesehen. Über diese Klasse beziehe ich bereits in meinem Skript den Benutzernamen. Wenn ich jedoch aus dieser Klasse alle Informationen beziehen möchte, erhalte ich auch mehrere Sessions, so dass ich ebenfalls einen Benutzer mehrmals erhalte.

Gruß
derhoeppi
Member: colinardo
colinardo Feb 05, 2014 updated at 12:03:24 (UTC)
Goto Top
mach so wie oben geschrieben ...
Es sei aber darauf hingewiesen das die Queries auf neueren Systemen eventuell gecachte Sessions beinhalten können, und es deshalb zu doppelten Namen kommt.
Grüße Uwe