micha1982
Goto Top

Logoff RDP Session mit VBScript?

Hallo Zusammen,

ich hoffe ihr könnt mir bei folgendem Problem weiterhelfen.

Ich möchte via Task Scheduler und VBscript ein zeitgesteuertes Logoff aller RDP Sessions vornehmen.

Über den Befehl

C:\>qwinsta /server:localhost
SESSIONNAME USERNAME ID STATE TYPE DEVICE
console user1 0 Active wdcon
rdp-tcp 65536 Listen rdpwd
rdp-tcp#18 user2 1 Active rdpwd

werden mir die angemeldeten Benutzer aufgelistet.

mit dem Befehl rwinsta /server:localhost <ID> können diese dann beendet werden.
Jedoch würde ich dies gerne per VBScript durchführen ohne den rwinsta Befehl zu benutzen. Somit stellt sich mir die Frage über welche Klasse / welches Objekt ich das in VBScript (evetuell über WMI) realisieren kann?
Die WMI Klassen die ich bisher ausprobiert habe geben mir nur die Filesystem Sessions wieder (Computerverwaltung->Freigegebene Ordner->Sitzungen).

Grüße

Michael

Content-ID: 103837

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

Ausgedruckt am: 23.11.2024 um 06:11 Uhr

problemsolver
problemsolver 11.12.2008 um 11:39:15 Uhr
Goto Top
Hallo Micha,

ich kann Dir meine Lösung geben, die ich iwann mal gestrickt habe. Ist eine Batchdatei und erfüllt deine Anforderungen auf jeden Fall. face-wink

Also hier ist der CODE: (Erläuterungen innerhalb der Batchdatei)
@echo off
setlocal
:: SERVERNAME ANGEBEN!!!
set RDPSERVER=CITRIX2
:: Zum Abmelden von allen Sitzungen (auch Citrix) nur nach "#" suchen lassen!) 
set "SUCHESITZUNGSTYP=rdp-tcp#"  

echo !!!ACHTUNG! VORSICHT!!!
echo Alle Sitzungen vom Typ "%SUCHESITZUNGSTYP%" werden jetzt vom Server "%RDPSERVER%" abgemeldet!!!  
echo Zum Abbrechen STRG+C druecken!!
pause

For /F "usebackq tokens=1,2,3,4,5 delims= " %%i IN (`qwinsta /SERVER:%RDPSERVER% ^| find "%SUCHESITZUNGSTYP%"`) DO call :process %%k %%l %%m %%n %%o  
pause
goto eof

:process
@rem Die Sitzungsnummer steht immer 2 Spalten vor dem Connectiontyp
if "%5" EQU "rdpwd" set sitzungsnummer=%3  
if "%4" EQU "rdpwd" set sitzungsnummer=%2  
if "%3" EQU "rdpwd" set sitzungsnummer=%1  
@rem if "%sitzungsnummer%" NEQ "" echo %sitzungsnummer%  
if "%sitzungsnummer%" NEQ "" rwinsta %SITZUNGSNUMMER% /SERVER:%RDPSERVER%  
set SITZUNGSNUMMER=

Bei Fragen bitte melden, ansonsten daran denken den Beitrag als gelöst zu markieren face-wink

Gruß

Markus
Micha1982
Micha1982 11.12.2008 um 19:33:13 Uhr
Goto Top
Hallo Markus,

erstmal vielen Dank für deinen Lösungsvorschlag.

Ich werde den Weg als Alternativlösung in Betracht ziehen. Momentan bevorzuge ich eine VBScript Variante, da das Logoff der Sessions in ein bestehendes Cleanup Script (vbs) implementiert werden soll.

Somit müsste ich dann in Zukunft nur ein Skript pflegen. Sollte dies aber aus vbs heraus nicht anders gehen, so werde ich deine Lösung via cmd und Parametern verweden.

Grüße Micha
problemsolver
problemsolver 12.12.2008 um 08:50:53 Uhr
Goto Top
Hallo,

einfach die Batch in das gleich Verzeichnis des VBScriptes legen.

set fs = CreateObject("Scripting.FilesystemObject")  
scriptname = Wscript.ScriptFullName
scriptpath = fs.getparentfoldername(scriptname)
set fs = Nothing
Set WshShell = WScript.CreateObject("WScript.Shell")  
WshShell.Run chr(34) &  scriptpath & "\shot.bat" & chr(34), 0, True  
Set WshShell = Nothing

Den Bereich bei WshSehll.Run (besonders die Optionen) schau Dir noch mal an. Momentan würde die Batch "unsichtbar" ausgeführt werden. (vbHide = 0, vbNormalFocus = 1)

Mit
WshShell.Run chr(34) &  scriptpath & "\shot.bat" & chr(34), 1, True  
führt er die z.B. shot.bat sichtbar aus.

Gruß und noch viel Erfolg

Markus
user217
user217 12.12.2008 um 11:58:27 Uhr
Goto Top
und wenn du einfach in der Terminaldienstekonfiguration einstellst das sich die im leerlauf befindlichen sitzung nach x minuten abmelden?
Micha1982
Micha1982 12.12.2008 um 16:21:08 Uhr
Goto Top
Zitat von @user217:
und wenn du einfach in der Terminaldienstekonfiguration einstellst das
sich die im leerlauf befindlichen sitzung nach x minuten abmelden?

Das ist natürlich der eleganteste Weg. Wo wird denn diese Option eingestellt (Server ist in einer Domäne)?
Ansonsten habe ich es bisher nur geschafft mir die aktiven Session (Konsole und RDP) mit folgendem Code anzeigen zu lassen:

strComputer = "."  

Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  

Set colSessions = objWMI.ExecQuery _
    ("Select * from Win32_LogonSession Where LogonType = 2 OR LogonType = 10")  

If colSessions.Count <> 0 then
   For Each objSession in colSessions
     If objSession.LogonType = 2 Then
       WScript.Echo "Console"  
     Else
       WScript.Echo "RDP/Terminal Server"  
     End If
     Set colList = objWMI.ExecQuery("Associators of " & "{Win32_LogonSession.LogonId=" & objSession.LogonId & "} " & "Where AssocClass=Win32_LoggedOnUser Role=Dependent" )  

     For Each objItem in colList
       WScript.Echo "User: " & objItem.Name  
       WScript.Echo "FullName: " & objItem.FullName  
       WScript.Echo "Domain: " & objItem.Domain  
     Next
   Next
End If
Wenn ich hiermit noch die RDP Sessions töten kann, dann bis ich eigentlich happy...

Danke und Gruß

Micha