Bei einem Kunden bestand die Anforderung alle Benutzer zu einem bestimmten Zeitpunkt vom Terminalserver abzumelden. Die gängigen Mittel wie z.B. nach einer gewissen Leerlaufzeit abmelden waren für das Szenario unpassend, da es zwar eine Kernarbeitszeit gibt, aber auch flexible Arbeitszeiten als auch Außendienstmitarbeiter, die sich mit dem System verbinden, wann Sie können. Darüber hinaus meldet sich nicht jeder Benutzer ab, teilweise wird bewusst oder bei schlechter Verbindung die Sitzung nur getrennt (z.B. wenn man auf dem Weg zum nächsten Termin ist und/oder später an gleicher Stelle weiterarbeiten möchte oder das mobile Internet nicht gerade der „Hit“ ist).
Wieso eigentlich alle Benutzer abmelden?
Diese Frage ist schnell beanwortet: Die beim Kunden eingesetzte Branchenlösung verlangt zum Zeitpunkt der Datensicherung, das niemand mit der Datenbank verbunden ist. Schattenkopie (VSS) o.ä. kennt diese Anwendung nicht. Eine Option wäre nun alle entsprechenden Prozesse zu beenden oder eben alle Benutzer abzumelden. Letzteres erschien als die bessere Lösung, da man Sie mit weiteren Befehlen kombinieren kann (siehe weiter unten) und man so sicher sein kann, das nicht doch etwas „hängen“ bleibt.
Seitens der Bordmittel von Microsoft gibt es den Befehl „logoff“ den man zum Abmelden verwenden kann, dieser erwartet allerdings die Angabe eines Sitzungsnamens oder einer Sitzungs-ID. Beides kann über den Befehl „query session“ („query user“ würde wahrscheinlich genauso funktionieren), ermittelt werden. Leider gibt es bei „logoff“ keine Wildcard, damit alle Benutzer auf einmal abgemeldet werden können.
Die Lösung
Mit AutoIt wurde ein Skript bzw. Tool entwickelt, das den Befehl „query session“ ausführt, aus der Ausgabe die Sitzungs-ID ermittelt und alle aktiven wie auch getrennten Sitzungen abmeldet.
Download (WTS-LogOff-AllUsers_v2.zip)
(64-bit Version [32-bit kann kompiliert werden], Quellcode)
Hinweise: Das Tool meldet die Benutzer ohne jede Vorwarnung ab! Führt man das Tool z.B. als Administrator aus, so wird dieser nicht abgemeldet. Wird das Tool mittels Aufgabe ausgeführt, so wird, sofern angemeldet, selbst der Benutzer abgemeldet, dessen Anmeldedaten für die Aufgabe verwendet werden!
Entwickelt und getestet wurde unter Windows 7 Professional 64-bit das mit einer entsprechenden Lösung zum Terminalserver gemacht wurde, beim Kunden ist ein Windows Server 2012 Standard (64-bit) mit RDS-Rolle im Einsatz. Andere Lösungen sollten ebenso funktionieren, sind allerdings nicht getestet.
Für den Fall, das man zunächst testen möchte, welche Sitzungen abgemeldet werden, kann im Quellcode die Zeile 68 auskommentieren und die Zeile 70 einkommentieren, dadurch wird das Abmelden deaktiviert und stattdessen erscheint eine MessageBox mit Sitzungs-ID, die abgemeldet werden würde.
Kombination mit weiteren Befehlen
Das hier vorgestellte Skript bzw. das daraus resultierende Tool kann z.B. mit den Befehlen
- change logon /disable (neue Anmeldungen verweigern) und
- change logon /enable (Anmeldungen wieder zulassen)
kombiniert werden. Man könnte folgenden Ablauf realisieren:
- Neue Anmeldungen verweigern.
- Alle aktiven oder getrennten Sitzungen beenden.
- Datensicherung/Wartung/… durchführen.
- Anmeldungen wieder zulassen.