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.
Dienstag, 4. September 2012 10:44
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!
Dienstag, 22. Oktober 2013 22:31
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
Donnerstag, 13. November 2014 14:04
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