Grafvision - Fotolia

Wie Sie RDP-Nutzer mit einem PowerShell-Skript abmelden

Melden sich RDP-Nutzer nicht ab, werden wertvolle Serverressourcen belegt. Mit diesem PowerShell-Skript kann die Abmeldung einer Sitzung erzwungen werden.

Wenn sich Endanwender über das Remote Desktop Protocol (RDP) in einen Windows Server einloggen und die Abmeldung vergessen, ist das ein bekanntes Problem. Nicht geschlossene Sitzungen benötigen Ressourcen auf dem Server. Mithilfe eines PowerShell-Skriptes können Sie aber die Abmeldung erzwingen und so die Ressourcen wieder freigeben.

Um die Abmeldung einer Sitzung über das Remote Desktop Protocol zu erzwingen, muss ein Administrator zunächst sämtliche Dienste der Remote Desktop Services (RDS) auf dem Server und deren Status abfragen. Nachdem alle getrennten Dienste erkannt worden sind, folgt als nächstes der Abmeldeprozess.

Im ersten Schritt muss hierfür das kostenlose Modul PSTerminalServices heruntergeladen und dessen Verfügbarkeit in der PowerShell sichergestellt werden. Die nötigen Installationshinweise hierfür stehen auf der Downloadseite. Allerdings gibt es nur noch einen inoffiziellen Klon des Programmes.

Mit dem folgenden Befehl installieren Sie das Modul:

Install-Module -Name PSTerminalServices

Mithilfe von Import-Module PSTerminalServices überprüfen Sie, ob das Modul auch tatsächlich verfügbar ist.

Im ersten Schritt sollen nun zunächst alle aktiven Sitzungen auf einem Lab-Server mit dem Namen HYPERV mit folgendem Befehl abgefragt werden:

Get-TSSession -ComputerName HYPERV
Get-TSSession
Abbildung 1: Fragen Sie die aktiven Sitzungen mit Get-TSSession ab.

Momentan sind nur wenige Sitzungen inaktiv und alle werden angezeigt, obwohl für dieses Beispiel ja lediglich die getrennten Sitzungen interessant sind. Über den Parameter State mit dem Zusatz Disconnected lassen sich diese herausfiltern:

Get-TSSession -ComputerName HYPERV -State Disconnected
State Disconnected
Abbildung 2: Filtern Sie die inaktiven Sitzungen mit State Disconnected heraus.

Dieses Ergebnis ist zwar schon hilfreicher, aber es gibt immer noch ein Problem: Sitzung 0 ist keine RDP-Sitzung und es gibt auch keine Möglichkeit, diese mittels Get-TSSession aus den Ergebnissen auszuschließen. Die Lösung des Problems besteht in der Verwendung eines where-Filters, der auch diese Sitzung entfernen kann. Der Befehl lautet folgendermaßen:

Get-TSSession -ComputerName HYPERV -State Disconnected | where {$_.SessionID -ne 0}
where-Filter
Abbildung 3: Filtern Sie die Ergebnisliste über den where-Filter weiter.

An diesem Punkt erhält man also alle Sitzungen, die problemlos beendet werden können. Als nächstes muss also diese inaktive Sitzung noch geschlossen werden. Dafür bietet das Modul PSTerminalService das hilfreiche Cmdlet Stop-TSSession.

Schließung der inaktiven Sitzung
Abbildung 4: Schließen Sie die inaktive Sitzung über Stop-TSSession.

Das Cmdlet Stop-TSSession meldet eine Sitzung zwangsweise ab. Dadurch könnten Endanwender Teile ihrer Arbeit verlieren, weshalb eine Rückfrage an den Administrator erfolgt. An dieser Stelle kann man die Abfrage einfach mit A bestätigen und den Dingen ihren Lauf lassen.

Allerdings mögen es Administratoren nicht, in einem eigentlich fortlaufenden Prozess manuell Tasten betätigen zu müssen. Wird dieses Cmdlet in ein längeres Skript eingefügt, wird die Rückfrage das Skript unterbrechen. Daher ist es möglich, die Bestätigungsanfrage zu entfernen.

Das Cmdlet Stop-TSSession verfügt über den gängigen PowerShell-Parameter -Force, der Administratoren das Durchlaufen der Vorgänge ohne manuellen Eingriff erlaubt. Das finale Skript sieht dann wie folgt aus:

Get-TSSession -ComputerName HYPERV -State Disconnected | where {$_.SessionID -ne 0} | Stop-TSSession –Force

Wenn auf diesen Befehl keine Ausgabe erfolgt, wurde die Sitzung erfolgreich abgemeldet.

Erfahren Sie mehr über Serverbetriebssysteme