Você pode tentar usar o parâmetro /sm
não documentado para query session
(em um arquivo em lotes) para classificar as coisas com mais facilidade:
FOR /f %%G IN ('query session /sm') DO tsdiscon %%G
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 eu poderia facilmente usar as informações (a menos que eu analise a cadeia ...) para fechar todas as sessões.
Existe uma maneira no Powershell (ou C #, Batch) de fechar todas as sessões da Área de Trabalho Remota em um computador local?
Obrigado Martin
Sim, usando tsdiscon a partir de uma linha de comando:
tsdiscon n
onde o n deve ser substituído pelo id da sessão.
Você pode obter o número da sessão
query session
Como você diz que deseja encerrar todas as sessões no computador local, eu acho que você precisa ter cuidado com a ordem em que você o faz (ou seja, feche sua sessão por último).
Você pode querer verificar as extensões da comunidade Powershell. Inclui os cmdlets Get, Stop e Disconnect TerminalSession.
Você pode usar o utilitário tsdiscon para desconectar as 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 deles.
Uma construção de loop como essa deve funcionar
FOR /f %%G IN ('q.bat') DO tsdiscon %%G
onde q.bat é
query session /sm | find "Active"
Isso desconectará apenas as sessões remotas e ignorará o usuário do console.
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.
Eu descobri que o TSDISCON não remove "Disc" sessões conectadas.
Eu substitui o TSDISCON com o logoff.
Você pode usar o módulo PowerShell do PSTerminalServices:
Get-TSSession -ComputerName server1 -State Active | Desconectar-TSSession -WhatIf
Eu sei que o OP é bem antigo agora, mas isso deve fazer o que você quer (e caso alguém ainda esteja procurando algo para fazer o mesmo, eu pensei em responder de qualquer maneira).
Da mesma forma, você pode usar query/reset session
no 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
)
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)
O comando TSDiscon desconectará as sessões dos serviços de terminal (RDP). Usado por conta própria, irá desassociar a sessão atual, você pode especificar o ID da sessão que deseja desconectar, você também pode fornecer o nome do servidor para desconectar.
Detalhes completos podem ser encontrados aqui .
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, você pode simplesmente ligar:
shutdown -r -f -m \computer_to_restart
Isso realmente forçará a reinicialização do computador.