Konsolensitzung wiederherstellen, nachdem der Remotedesktop getrennt wurde?

8

Ist es möglich (über Gruppenrichtlinien usw.), die Konsolensitzung automatisch auf einem Windows 8.1-PC wiederherzustellen, nachdem eine Remotedesktopsitzung getrennt wurde?

Mir ist bekannt, dass Sie während der RDP-Sitzung den Befehl "tscon 1 / dest: console" ausführen können, um die Verbindung zu trennen und die Konsolensitzung erneut zu verbinden. Ist dies jedoch automatisch möglich?

SofaKng
quelle

Antworten:

4

Erstellen Sie eine Batchdatei mit dem folgenden Inhalt mit dem Namen "restore_console.bat":

@echo off
set LOG_FILENAME=%TEMP%\restore_console_log.txt
echo Script executed at %TIME% > %LOG_FILENAME%
echo qwinsta: >> %LOG_FILENAME%
qwinsta >> %LOG_FILENAME%

echo Checking for pending connection... >> %LOG_FILENAME%
for /f %%i in ('qwinsta ^| findstr /r /C:"^ [ ]*[0-9][0-9]*  Disc"') do (
echo Pending connection detected, finishing. >> %LOG_FILENAME%
goto end
)

echo Checking for disconnection... >> %LOG_FILENAME%
for /f "tokens=2" %%i in ('qwinsta ^| findstr /r /I /C:"^ [ ]*[^ ][^ ]* [ ]*[0-9][0-9]*  Disc"') do (
echo Redirecting session id %%i >> %LOG_FILENAME%
tscon %%i /dest:console /v >> %LOG_FILENAME%
goto end
)

:end

Erstellen Sie im Taskplaner eine neue Aufgabe mit den folgenden Einstellungen:

  • Allgemein -> Ausführen, ob der Benutzer angemeldet ist oder nicht, Ausführen mit den höchsten Berechtigungen.
  • Trigger -> Neu -> Beim Trennen von der Benutzersitzung, Beliebiger Benutzer, Verbindung vom Remotecomputer
  • Aktionen -> Neu -> Programm starten -> Programm / Skript: <Ihre Batchdatei>
  • Alles andere ist Standard.

Hinweise zur Implementierung:

  • Dies funktioniert durch Parsen der qwinsta-Ausgabe über einen Findstr-Regex, dh Extrahieren der ID aus Zeile 3 hier:

     SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE 
    >services                                    0  Disc                        
                       ######                    2  Disc                        
     console                                     7  Conn                        
     #############...                        65536  Listen                      
     rdp-tcp                                 65537  Listen                      
    
  • Der mittlere Block ist erforderlich, da die Zeitplanaufgabe aus irgendeinem Grund sowohl beim Verbinden als auch beim Trennen ausgeführt wird. In diesem Fall hat die Ausgabe die Form:

     SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE 
    >services                                    0  Disc                        
                       ######                    2  Disc                        
                                                 3  Disc                        
     console                                     8  Conn                        
     #############...                        65536  Listen                      
     rdp-tcp                                 65537  Listen                      
    

    Deshalb suchen wir nach Linien des Musters aus Linie 4.

  • Die Protokollinformationen werden in% TEMP% \ restore_console_log.txt gespeichert. Dies ist nicht erforderlich, aber nützlich, wenn das Skript nicht funktioniert. Ohne die Protokollierung wären es nur wenige Zeilen.

Dies funktionierte für mich auf einem einzelnen Windows 8.1-Computer - ich weiß nicht, ob er global eingeführt werden kann.

Kim
quelle
Vielen Dank! Dieses Skript funktionierte auf meinem Windows 10-Computer nicht genau wie beabsichtigt, aber es gab mir genug Ideen, wie ich das erreichen kann, was ich wollte.
SofaKng
@SofaKng Ich habe ein kleines Problem damit, dies an einen Windows 10-Computer anzupassen. (Ich hatte es am 8. arbeiten lassen.) Würde es Ihnen etwas ausmachen, zu teilen, was Sie ändern mussten? (Die .bat-Datei funktioniert, wenn ich sie über die Administratorkonsole aufrufe, aber nicht als Task gestartet werden kann. Die Task wird mit den höchsten Berechtigungen ausgeführt.)
Will Murphy
@willmuphyscode Ich hatte das gleiche Problem unter Windows 10. Ich werde unten eine Antwort veröffentlichen, in der detailliert beschrieben wird, was geändert wurde / wie es behoben werden kann.
aggieNick02
1

@ Kims Antwort ist großartig. Leider scheint es, dass Microsoft das Starten einer geplanten Aufgabe beim Remote-Verbinden / Trennen in Windows 10 unterbrochen hat. Unabhängig davon, was ich getan habe, konnte ich keine Aufgabe ausführen, geschweige denn diese, die beim Verbinden oder Trennen über den Remotedesktop ausgeführt werden konnte.

Glücklicherweise funktioniert das Auslösen bei generischen Ereignissen immer noch. Diese Frage, wo Ereignisse für Remotedesktop-Verbindungsabbrüche protokolliert werden, gab mir einen Ausgangspunkt, und Versuch und Irrtum ergaben den richtigen.

Ändern Sie den Auslöser im Protokoll "Microsoft-Windows-TerminalServices-LocalSessionManager / Operational", Quelle "TerminalServices-LocalSessionManager", Ereignis-ID "24" in "Bei einem Ereignis". (Ich habe ursprünglich 40 empfohlen - beide scheinen zu funktionieren, aber 40 ist etwas lauter und tritt möglicherweise mehrmals bei einer Unterbrechung auf. Wenn 24 nicht funktioniert, versuchen Sie es mit 40 und lassen Sie es uns wissen.) Siehe Abbildung unten.

Geben Sie hier die Bildbeschreibung ein

aggieNick02
quelle
Ich denke, dass dies im gerade veröffentlichten Fall Creators Update von Windows 10, ver. 1709 .... Ich habe noch keine Aufgabe für die Ereignis-ID 24 oder 40 in dieser Windows-Version.
aggieNick02
Die Änderung beim Aktualisieren der Herbstersteller besteht darin, dass eine auf diese Weise konfigurierte Aufgabe nicht mehr ausgeführt wird, wenn Sie die Option "Kennwort nicht speichern" aktiviert haben. Ich habe diese Option verwendet und sie entfernt (damit die Anmeldeinformationen gespeichert werden).
aggieNick02
0

Ich weiß, dass dies etwas alt ist, aber es sollte möglich sein, einen schnellen Windows-Dienst zu schreiben, der die Verbindungen überwacht und die Konsolensitzung wiederherstellt, wenn festgestellt wird, dass sich das RDP jetzt in einem nicht verbundenen Zustand befindet. Etwas weniger Arbeit wäre es, eine Batch-Datei zu verwenden, die srvany verwendet, um sie als Dienst auszuführen. Lassen Sie sie einfach die von qwinsta zurückgegebenen Werte überwachen.

Ich würde empfehlen, den Batch / Srvany als Zustandsmaschine auszuführen. Zunächst überwacht die Batchdatei eine RDP-Verbindung und setzt die Überwachung fort, bis eine angezeigt wird. Dann wechselt es in den nächsten Zustand, in dem es auf die Durchführung dieser RDP-Sitzung wartet. Wenn festgestellt wird, dass die Sitzung getrennt (nicht abgemeldet) wurde, wechselt sie in den Endzustand, in dem diese Sitzung auf der Konsole wiederhergestellt wird. Schließlich wird der ursprüngliche Überwachungszustand für eine RDP-Sitzung wiederhergestellt.

Ich sage nicht, dass es einfach wäre, aber es sollte möglich sein. Hauptsächlich wollte ich den Vorschlag anbieten, weil mir Ihre "tscon [sessionID] / dest: console" viel Kopfschmerzen erspart hat.

Derek
quelle