Script - Como desconectar sessões da Área de Trabalho Remota?

8

Estou procurando uma maneira de fechar todas as sessões ativas da Área de Trabalho Remota em um computador (computador local). O Windows inclui alguns comandos (rwinsta, qwinsta etc.) para examinar as sessões ativas, mas não vejo como poderia facilmente usar as informações (a menos que analise a sequência ...) para fechar todas as sessões.

Existe uma maneira no Powershell (ou C #, Lote) de fechar todas as sessões da Área de Trabalho Remota em um computador local?

Obrigado, Martin

Martin
fonte
Eu atualizei a minha resposta para incluir um loop que irá sessões remotas ativas somente Disconnect, e não o de console
Kevin Kuphal

Respostas:

5

Você pode tentar usar o /smparâmetro não documentado para query session(em um arquivo em lotes) para classificar as coisas mais facilmente:

FOR /f %%G IN ('query session /sm') DO tsdiscon %%G
Adam Brand
fonte
Esse é um bom começo ... mas quero desconectar apenas as sessões da Área de Trabalho Remota.
Martin
4

Sim, usando tsdiscon em uma linha de comando:

tsdiscon n

onde n deve ser substituído pelo ID da sessão.

Você pode obter o número da sessão em

query session

Como você diz que deseja fechar todas as sessões no computador local, acho que precisará ter cuidado com a ordem em que faz isso (por exemplo, feche sua sessão por último).

Rob Levine
fonte
2

Convém verificar Powershell Community Extensions. Inclui os cmdlets Get, Stop e Disconnect TerminalSession.

Chad Miller
fonte
2

Você pode usar o utilitário tsdiscon para desconectar sessões. Se você usar o comando "query sessions" em um prompt de comando, poderá ver a lista de IDs e emitir um comando tsdiscon para cada um.

Uma construção em loop como esta deve funcionar

FOR /f %%G IN ('q.bat') DO tsdiscon %%G

onde q.bat está

query session /sm | find "Active"

Isso desconectará apenas sessões remotas e ignorará o usuário do console.

Kevin Kuphal
fonte
1

Você pode desconectar sessões locais ou remotas com o tsdiscon.

Disconnects a terminal session.

TSDISCON [sessionid | sessionname] [/SERVER:servername] [/V]

  sessionid           The ID of the session.
  sessionname         The name of the session.
  /SERVER:servername  Specifies the Terminal server (default is current).
  /V                  Displays information about the actions performed.
JasonMArcher
fonte
1

Descobri que o TSDISCON não remove as sessões conectadas "Disco".

Substituí o TSDISCON pelo logoff.


fonte
1

Sei que o OP está bastante antigo agora, mas isso deve fazer o que você procura (e caso alguém ainda esteja procurando algo para fazer o mesmo, pensei em responder de qualquer maneira).

Da mesma forma, você pode usar query/reset sessionno lugar de q/rwinsta...

FOR /F %%A IN (computers.txt) DO (
    FOR /f "tokens=2" %%i IN ('qwinsta /SERVER:%%A ^| find /i "disc"') DO ECHO %%i | rwinsta %%i /SERVER:%%A /V
)
Carly
fonte
1

FOR /F %A IN (c:\scripts\ps\computers.txt) DO (FOR /f "tokens=2" %i IN ('qwinsta /SERVER:%A ^| find /i "disc"') **DO if "%i" NEQ "0" ECHO %i** | rwinsta %i /SERVER:%A /V)

greg
fonte
0

O comando TSDiscon desconectará as sessões dos serviços de terminal (RDP). Quando usado sozinho, desconectará a sessão atual, você pode especificar o ID da sessão que deseja desconectar, também pode fornecer o nome do servidor para desconectar.

Detalhes completos podem ser encontrados aqui .

Sam Cogan
fonte
0

Você não especificou se deseja fazer isso sem desligar ou reiniciar o computador. Mas se você não se importa em reiniciar ou desligar, basta ligar para:

shutdown -r -f -m \\computer_to_restart

Isso realmente forçará a reinicialização do computador.

Nick Berardi
fonte
Bem ... isso é uma ideia. Mas não quero matar todas as sessões. Somente as sessões da área de trabalho remota.
Martin
0

Mesmo a pergunta é muito antiga, quase não existem soluções para todas as versões sem qwinsta / query / tsdiscon, ou seja, todas as versões domésticas do Windows.

No entanto, existe uma versão fácil do PowerShell para desconectar uma sessão:

$code = @'
[DllImport("wtsapi32.dll")]
static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] String pServerName);

[DllImport("wtsapi32.dll")]
static extern void WTSCloseServer(IntPtr hServer);

[DllImport("Wtsapi32.dll")]
static extern bool WTSDisconnectSession(System.IntPtr hServer, int SessionId, bool bWait);

public static void DisconnectSession (String ServerName, int SessionId)
{
    IntPtr serverHandle = WTSOpenServer(ServerName);
    WTSDisconnectSession(serverHandle, SessionId, true);
    WTSCloseServer(serverHandle);
}
'@

$tstType=Add-Type -name Test -MemberDefinition $code -PassThru
#$tstType::DisconnectSession("localhost", 2)

Um ID de sessão pode ser obtido, por exemplo, com getProcesss. Para desconectar (não fazer logoff!) Uma sessão, use $tstType::DisconnectSession("localhost", 2).

GMA
fonte