In einem Schulnetz läuft eine Terminalserver-Farm unter Windows Server 2003 R2 64bit. Dort kam es immer wieder zu stark verzögerten Anmeldungen, die schwer zu fassen waren.
Das Anmeldeverhalten ist im Vergleich zu einer „normalen“ Firma durchaus speziell: Zu jeder Schulstunde melden sich X Schüler an und am Ende wieder ab. Dabei konnte es vorkommen, dass die Anmeldung bei einem Schüler mehrere Minuten dauert (Ausreißer bis zu zehn Minuten), während das in Zeiten ohne Last bzw. mit wenig Last auch in 30-40 Sekunden vonstatten geht.
Netzwerk, CPU und Arbeitsspeicher auf den Terminalserver sind ausreichend dimensioniert und zeigen während der Lastzeiten keine beängstigenden Peaks. Der Fileserver wurde in Richtung maximal gleichzeitiger SMB-Verbindungen optimiert und die entsprechenden Einträge auf den Terminalservern gesetzt (MaxWorkItems, MaxMpxCt, MaxCmds).
Nachdem wir an einigen Stellen gesucht, optimiert und analysiert haben, haben wir uns sehr intensiv mit dem eigentlichen Anmeldevorgang beschäftigt. Dazu haben wir das User-Debug Logging eingeschaltet (//support.microsoft.com/kb/221833/en-us), um da auch was sehen zu können. Mit dem netten Freeware-Tool Policy Reporter (//www.sysprosoft.com/policyreporter.shtml) wird das Log-File dann auch grafisch schön aufbereitet.
Zuerst ist uns aufgefallen, dass ca. 20 Sekunden beim Login draufgehen für Einstellungen am Internet Explorer. Nach einer kurzer Recherche haben wir dann ein passenden Hotfix gefunden: //support.microsoft.com/kb/941158/en-us Dieses haben wir nun also runtergeladen und den entsprechenden RegKey gesetzt. Das hat zwar eine einzelne Useranmeldung beschleunigt, unser Grundproblem bestand aber immer noch.
Ein paar Analysen und Versuche später sind wir dann noch über eine Stelle im Log gestoßen, die im ersten Moment „nur“ 2,5 Sekunden dauerte. Der Eintrag lautete: „Successfully logged registry Rsop data“. Nachdem ich mich schlau gemacht hatte was da passiert und mal danach gegoogelt hatte fand ich eine Seite, auf der jemand nur kurz beschrieben hat, dass die Erzeugung des RSOP die Anmeldung verlangsamen kann.
Daraufhin war es ziemlich einfach zu finden wo man dem System abgewöhnen kann dies zu tun. Das geht über GPO und man findet es unter:
Computerkonfiguration -> Windows Einstellungen -> Administrative Vorlagen -> System -> Gruppenrichtlinien -> Protokollierung des Richtlinienergebnissatzes deaktivieren –> Aktivieren
Nach einem Update der GPO auf unserem Testsystem verbesserte sich die Anmeldezeit nun derart, dass 20 gleichzeitige Useranmeldungen nun 20-40 Sekunden dauern und keine 5 Minuten mehr. Eine einzelne Useranmeldung liegt nun bei ca. 5-10 Sekunden.
Mittlerweile funktionieren die Remote Desktop Services (früher Terminalserver) von Microsoft relativ gut und fehlerfrei. Trotzdem kann es in seltenen Fällen passieren, dass sich ein Benutzer nicht mehr abmelden kann. Die Session hängt und daher ist auch eine Neuanmeldung nicht mehr möglich. Im Normalfall reicht es aus, wenn man den Benutzer entweder über den Connection Broker oder direkt über den Task-Manager am jeweiligen Session host abmeldet. Sollte das nicht funktionieren, bleiben nur noch zwei Optionen: den betroffenen Session Host neustarten oder die Benutzersitzung gewaltsam schließen. In einer produktiven Umgebung mit Dutzenden anderen angemeldeten Usern ist ein Neustart vermutlich keine Option.
Benutzer über Connection Broker abmelden
Wie bereits erwähnt, reicht es in den meisten Fällen aus, den Benutzer über den Connection Broker abzumelden. Der Broker ist jener Server, welcher die Benutzer auf die verschiedenen Session Hosts verteilt. Bei einer Single-Server Installation ist der Broker auch zeitgleich der Session Host. Bei Terminalserverfarmen hingegen, sollte diese Rolle ein eigenständiger Server übernehmen, der nur für die Verteilung der Sessions zuständig ist. Um einen User darüber abzumelden reicht es, den Server-Manager und die jeweilige Collection aufzurufen. Dort sollte unter Connections die fehlerhafte Session aufscheinen und diese kann per Rechtsklick -> Disconnect abgemeldet werden.
Benutzer mittels qwinsta abmelden
Sollte der oben genannte Weg über den Connection Broker nicht funktionieren und das Neustarten des Servers keine Option sein, dann bleibt nur noch der Weg mit der Brechstange. Dazu öffnet man am jeweiligen Host eine Eingabeaufforderung als Administrator und führt folgenden Befehl aus:
C:\Users\administrator>qwinsta /server:server_name SESSIONNAME USERNAME ID STATE TYPE DEVICE services 0 Disc console 1 Conn rdp-tcp#98 user01 23 Active rdp-tcp#91 user02 39 Active rdp-tcp#75 user03 40 Active rdp-tcp#19 user04 41 Active rdp-tcp#26 user05 42 Active rdp-tcp#84 user06 43 Active rdp-tcp#93 user07 44 Active
Anschließend kann die Session gekillt werden:
C:\Users\anexia>rwinsta /server:server_name 23Danach sollte sich der Benutzer wieder anmelden können. Noch ein kurzer Einblick in die Bedeutung der Befehle: