Restaurar a sessão do console após a desconexão da área de trabalho remota?

7

É possível (através da diretiva de grupo, etc) restaurar automaticamente a sessão de console para um PC com Windows 8.1 após a desconexão de uma sessão de área de trabalho remota?

Estou ciente de que você pode executar o comando "tscon 1 / dest: console" durante a sessão RDP para se desconectar e reconectar a sessão do console, mas é possível que isso aconteça automaticamente?

    
por SofaKng 11.06.2014 / 14:50

3 respostas

3

Crie um arquivo em lotes com o seguinte conteúdo, chamado algo como 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

No Agendador de Tarefas, crie uma nova tarefa com as seguintes configurações:

  • Geral - > Execute se o usuário está conectado ou não, execute com privilégios mais altos.
  • Disparadores - > Novo - > Ao desconectar-se da sessão do usuário, Qualquer usuário, Conexão do computador remoto
  • Ações - > Novo - > Iniciar um programa - > Programa / script: < seu arquivo em lote >
  • Todo o restante padrão.

Notas sobre a implementação:

  • isso funciona analisando a saída qwinsta através de um regex findstr, ou seja, extraindo o ID da linha 3 aqui:

     SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE 
    >services                                    0  Disc                        
                       ######                    2  Disc                        
     console                                     7  Conn                        
     #############...                        65536  Listen                      
     rdp-tcp                                 65537  Listen                      
    
  • o bloco do meio é necessário porque, por alguma razão, a tarefa de agendamento é executada na conexão, bem como na desconexão. Quando isso acontece, a saída será da forma:

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

    Portanto, procuramos por linhas do padrão da linha 4.

  • copia as informações de registro para% TEMP% \ restore_console_log.txt, o que não é necessário, mas útil se o script não funcionar. Sem o registro, seriam apenas algumas linhas.

Isso funcionou para mim em uma única máquina com o Windows 8.1 - não sei se poderia ser implementada globalmente.

    
por 14.05.2015 / 15:20
0

Eu sei que isso é um pouco antigo, mas deve ser possível criar um serviço rápido do Windows que monitore as conexões e restaure a sessão do console quando perceber que o RDP está agora em um estado desconectado. Um pouco menos trabalho seria usar um arquivo em lote utilizando o srvany para executá-lo como um serviço, apenas para monitorar os valores retornados do qwinsta.

Eu recomendaria fazer o lote / srvany como uma máquina de estado. Primeiro, o arquivo em lote monitora uma conexão RDP e continua monitorando até ver um. Em seguida, ele se move para o próximo estado onde espera que a sessão RDP seja feita. Quando detecta que a sessão foi desconectada (não desconectada), ela passa para o estado final, que é restaurar a sessão para o console. Finalmente, ele volta para o estado original de monitoramento de uma sessão RDP.

Não estou dizendo que seria fácil, mas deveria ser possível. Principalmente eu queria oferecer a sugestão porque o seu "tscon [sessionID] / dest: console" me poupou muita dor de cabeça.

    
por 15.03.2015 / 05:24
0

@ A resposta de Kim é ótima. Infelizmente para nós, parece que a Microsoft quebrou o início de uma tarefa agendada na conexão / desconexão remota no Windows 10. Não importa o que eu fiz, não consegui executar nenhuma tarefa, muito menos essa, ao conectar ou desconectar através da área de trabalho remota.

Felizmente, o acionamento de eventos genéricos ainda funciona. Esta questão sobre onde os eventos são registrados para desconexões da área de trabalho remota deu me um ponto de partida, e tentativa e erro rendeu o caminho certo.

Altere o gatilho para "Em um evento" do Log "Microsoft-Windows-TerminalServices-LocalSessionManager / Operacional", Origem "TerminalServices-LocalSessionManager", ID do Evento "24". (Eu originalmente recomendado 40 - ambos parecem funcionar, mas 40 é um pouco mais ruidoso, possivelmente ocorrendo várias vezes em uma desconexão. Se 24 não funcionar, tente 40 e deixe-nos saber.) Veja a imagem abaixo.

    
por 26.01.2017 / 22:44