RemoteApps sind eine feine Sache bei der Arbeit mit Terminalservern, schließlich muss es nicht immer ein vollständer Desktop sein. Kommen allerdings mobile Computer (aka Notebooks) ins Spiel, ist es nicht immer wünschenswert jede RemoteApp z.B. wegen eines externen Termins zu schließen, um sie im Anschluss wenn man wieder da ist, erneut zu starten.

Mit dem Bordmittel-Befehl “tsdiscon” lassen sich Sitzungen leicht trennen. Damit das Ganze für bestimmte Server als auch Benutzer möglichst einfach und mit Sicherheitsabfrage klappt, wurde folgendes Skript erstellt:

@echo off

title RemoteApps trennen

cls

rem Konfiguration

 rem Benutzername und Terminalserver mittels Blindparameter uebergeben.
 
  set SessionUsername=%1
  set WTSServer=%2
 
 rem Wird kein Parameter uebergeben, den aktuell angemeldeten Benutzer und den lokalen Computer verwenden.
 
  if %SessionUsername%.==. set SessionUsername=%username%
  if %WTSServer%.==. set WTSServer=Localhost

rem Aktuelle Sitzungen auflisten

 query session /server:"%WTSServer%" | find "%SessionUsername%" > "%TEMP%\Session.txt"
 set /p Session=<"%TEMP%\Session.txt"
 
rem ID des Benutzers ermitteln

 rem Ab Zeichen 43 in der Zeile,
 rem drei Stellen in die Variable schreiben.

  set SessionID=%Session:~43,3%
 
 rem Ggf. vorhandene Leerstelle(n) entfernen, falls die ID nur ein- oder zweistellig ist.
 
   set "SessionID=%SessionID: =%"
 
rem "Session.txt" entfernen

 del "%TEMP%\Session.txt" /q
 
rem RemoteApps trennen

 :Abfrage
 echo.
 set /p Answer=RemoteApps von "%WTSServer% - %SessionUsername%" trennen (Ja/Nein)? 

 if /i %answer%==j tsdiscon %SessionID% /Server:%WTSServer% & goto EOF
 if /i %answer%==n goto EOF
 echo.
 echo Ungueltige Eingabe
 goto Abfrage
 
 :EOF

Das Skript kann lokal auf dem Client oder auf dem Server gestartet werden. Werden keine Parameter angeben, wird der aktuelle Benutzername und “Localhost” als Server verwendet.

Alternativ kann sowohl Benutzername als auch Servername oder -IP übergeben werden:

DisconnectRemoteApp.cmd <Benutzername> <Terminalserver>

Zum Beispiel:

DisconnectRemoteApp.cmd aweber 192.168.0.13

Bevor die Verbindung getrennt wird, erscheint eine Sicherheitsabfrage:

Einziger Schönheitsfehler auf Client-Seite nachdem die Verbindung getrennt wurde ist folgende Meldung:

Getestet mit Windows 8.1 Pro und Windows Server 2012 R2.

Update 28.08.2017

Für die “Getrennte RemoteApp”-Meldung habe ich ein kleines Tool in AutoIt erstellt, das automatisch auf “OK” klickt. Ferner wurde ein weiteres Skript erstellt, mit dessen Hilfe RemoteApps bzw. der ausführende Benutzer vom Terminalserver abgemeldet wird.

Alles zusammen (Skripte, Quellcode, Exe-Dateien für 32- und 64-bit Windows) befindet in folgendem Archiv:

RemoteApp_trennen_abmelden.zip

Update 09.11.2018

Was selbstverständlich auch möglich ist, das man “tsdiscon” und “logoff” als RemoteApps freigibt und diese dann startet um sich abzumelden. Die Meldung über getrennte RemoteApp erscheint dennoch, so das man um das AutoIt-Tool (siehe voriges Update) nicht drumherum kommt.