TSADMIN.MSC (genial als Remotedesktopdienste-Manager eingedeutscht) hat ein Problem – es ist nicht für Farmen mit zig Servern und tausenden Sessions gemacht. Spätestens bei 600-800 Sessions und einer entsprechenden Logon/Logoffrate ist das Ding unbenutzbar weil die Sessions über WTSWaitSystemEvent live in die Liste eingearbeitet werden – und das kann nicht abgestellt werden (konfigurierbar ist nur Prozessupdatefrequenz).

Glücklicherweise ist das MMC SnapIn in .NET implementiert und nicht obfuscated, d.h. man kann das Ding (%windir%\System32\tsadmin.dll) ganz gut mit z.B. ILSpy disassemblieren und als Visual Studio Projekt speichern.

ILSpy macht im Projekt dann pro Namespace einen Folder, in Microsoft.TerminalServices.Monitor.SnapIn gibt’s eine Klasse TerminalServer.cs – dort finden sich die Methoden die für die Updaterei zuständig sind: StartSessionMonitoring und EndSessionMonitoring. Ich habe einfach als erste Zeile ein return; eingefügt und schon ist Schluß mit zittern und zuckeln.

Um das ganze kompilieren zu können muss man bei ein paar Events noch die add und remove Methoden auskommentieren, weiß nicht warum das Fehler wirft – hat aber auskommentiert bisher keine erkennbaren Folgen. Ein paar Namespaces werden noch nicht von ILSpy eingefügt bzw. sind mehrdeutig (System.Threading.Monitor vor allem) – aber das ist eh täglich Brot für einen .NET Entwickler 🙂

Die DLL die da rauskommt legt man dann auf einem beliebigen Client (ab XP vermutlich, Windows 7 sicher) in ein beliebiges Verzeichnis – zusammen mit WTS.DLL, CERTPICK.DLL und TSADMIN.MSC (von einem RDS-Host oder wenn am Client RSAT installiert ist aus %windir%System32). Damit das SnapIn im neuen Verzeichnis gesucht wird muss man noch unter HKLM\SOFTWARE\Microsoft\MMC\SnapIns in den Keys FX:{3FCE72B6-A31B-43ac-ADDA-120E1E56EB0F} und FX:{321f5192-3295-46ba-9bf1-7a18d8c31322} die Werte ApplicationBase auf das Verzeichnis in dem das neue tsadmin.dll liegt und den Wert Type so ändern dass  PublicKeyToken nicht mehr enthalten ist (hinter Culture=neutral einfach abschneiden) ändern.

TSADMIN.MSC sollte so beim nächsten Start die neue DLL laden und die Sessions nicht mehr laufend aktualisieren. Ich hab für mich dann noch folgende Dinge eingefügt aber das würde hier zu weit gehen:

  • Spalten werden nach Ermittlung der Daten automatisch auf eine passende Breite gebracht damit alles sichtbar ist
  • Filter auf Benutzer, Clients, Server und Prozessnamen
  • Anzeige Anzahl der Listenitems in der Beschreibungsleiste
  • verhindern dass beim Start alle Sessions aller konfigurierten Gruppen ausgelesen werden (sondern erst bei Klick auf eine Gruppe)

Die notwendigen Änderungen dazu spielen sich alle in den Klassen GroupNode, ServerNode und TSManagerForm ab wenn jemand Lust verspürt – und ja, natürlich ist das gänzlich unsupported und böse 😮