Auf Windows Terminalserver alle Benutzer abmelden

Ich habe heute mal ein kleines Skript zusammengebaut, das hilft, bei einem Windows Terminalserver alle Benutzer abzumelden. Bei einem meiner Kunden haben sich einige Mitarbeiter angewöhnt, sich abends vom Terminalserver nicht abzumelden sondern nur die Verbindung zu trennen. Keine Ahnung, was an einer klaren Anweisung, sich abzumelden und nicht zu trennen so schwer zu verstehen ist. Aber ich erlebe es auch immer wieder, dass Leute, denen ich sage, sie möchten sich einmal kurz abmelden, gleich den ganzen Rechner herunterfahren. Zuhören ist schon echt schwer!

Bei dem Skript gibt es ein paar Nebenbedingungen. Es sollen nicht nur die aktiven Sitzungen beendet werden sondern auch die inaktiven (gerade die!). Außerdem soll derjenige, der das Skrip manuell startet (meist der Administrator) nicht abgemeldet werden.

Bei dem Unterfangen helfen die Befehle query session und logoff weiter. Der Befehl query session liefert uns eine Liste, aller gerade auf dem Server laufenden Benutzer-Sessions. Das sieht dann so aus:

C:\Dokumente und Einstellungen\Administrator>query session
 SITZUNGSNAME      BENUTZERNAME             ID  STATUS  TYP         GERÄT
 console                                     0  Verb.   wdcon
 rdp-tcp                                 65536  Abhör.  rdpwd
                   getrennter_user           5  Getr.   rdpwd
 rdp-tcp#335       benutzer1                 9  Aktiv   rdpwd
 rdp-tcp#336       noch_ein_benutzer        17  Aktiv   rdpwd
>rdp-tcp#339       administrator             4  Aktiv   rdpwd

 

Im Grunde genommen arbeitet das Skript nur die Liste ab und führt dann logoff mit der jeweiligen Session-ID aus. Dazu wird die Ausgabe von query session in eine temporäre Datei umgeleitet, die dann mit einer FOR-Schleife durchlaufen und am Ende wieder gelöscht wird. Dabei werden die ersten beiden Zeilen übersprungen, da die erste Zeile nur die Überschriften enthält und die zweite Zeile immer die Konsole auflistet, bei der der logoff-Befehl eh nicht funktioniert. Außerdem überspringen wir mit eof=> die Zeile der Session, die das Skript aufgerufen hat, da diese am Anfang mit einem > markiert wird. Außerdem müssen getrennte und aktive Sitzungen anders gehandhabt werden. Da getrennte Nutzer vom Skript an dem Getr. erkannt werden, müsste das Skript für Server mit einer anderen Lokalisierung entsprechend angepasst werden.

Hier das Skript:

@echo off
query session >session.txt
for /f "eol=> skip=2 tokens=1,2,3," %%i in (session.txt) DO (
 if "%%k" == "Getr." (
  REM Getrennte Verbindungen killen
  echo %%i %%j
  logoff %%j
 ) else (
  REM Aktive Verbindungen killen
  echo %%j %%k
  logoff %%k
 )
)
del session.txt
pause

 

Wenn man das jetzt jede Nacht zum Beispiel um 2:00 oder 3:00 Uhr ausführt, dann hat man morgens keine verwaisten Sessions mehr. Wenn man den Teil für die aktiven Sitzungen auskommentiert, dann kann man theoretisch sogar zwischendurch die getrennten Nutzer rauskicken, wenn man allen Benutzern vorher das Trennen verboten hat und ihnen mitgeteilt hat, dass das Trennen zu Datenverlust führen kann.

Autor:
Datum: Dienstag, 25. Januar 2011 18:36
Trackback: Trackback-URL Themengebiet: Windows

Feed zum Beitrag: RSS 2.0 Diesen Artikel kommentieren

3 Kommentare

  1. 1

    Hallo Herr Körner,
    vielen Dank für das kurze, elegante Skript!
    Man fragt sich zwar, warum man in den Richtlinien keine absolute Abmeldezeit einstellen kann, aber vielleicht denkt Microsoft ja, daß man das über die Anmeldezeit regeln könnte… Gut daß es findige Programmierer gibt, die ihr Wissen teilen! Vielen Dank!

  2. 2

    Hallo Dennis, vielen Dank für Dein Skript. Was müsste ich an dem Skript ändern, sodass alle Benutzer außer dem Administrator abgemeldet werden?
    lg Joyce

  3. 3

    Hallo Herr Körner,
    haben Sie auch schon eine Lösung wie es unter 2012 funktioniert. Hier finden wir das Recht nicht andere Sitzungen abzumelden. Wir möchten keine Admin Rechte vergeben. Der Admin selbst soll es aber auch nicht machen.

    Grüße

    Thilo Kuhn

Kommentar abgeben

*