我正在寻找一种方法来closures计算机(本地计算机)上的所有活动的远程桌面会话。 Windows包括几个命令(rwinsta,qwinsta等)来查看活动会话,但是我看不到如何轻松地使用这些信息(除非我parsingstring…)来closures所有会话。
在PowerShell(或C#,批处理)closures本地计算机上的所有远程桌面会话有没有办法?
谢谢,马丁
您可以尝试使用query session的未公开/sm参数(在batch file中)更容易地进行sorting:
FOR /f %%G IN ('query session /sm') DO tsdiscon %%G
是的,从命令行使用tsdiscon:
tsdiscon n
其中n应该被replace为会话ID。
你可以从中获得会话号码
query session
既然你说你想closures本地计算机上的所有会话,我想你需要小心你的操作顺序(即closures会话)。
你可能想看看Powershell社区扩展。 它包括获取,停止和断开TerminalSession cmdlet。
您可以使用tsdiscon实用程序来断开会话。 如果从命令提示符使用“查询会话”命令,则可以看到ID列表,然后为每个命令发出一个tsdiscon命令。
像这样的循环结构应该可以工作
FOR /f %%G IN ('q.bat') DO tsdiscon %%G
q.bat在哪里
query session /sm | find "Active"
这只会断开远程会话并忽略控制台用户。
您可以使用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.
我发现TSDISCON不会删除连接的会话中的“光盘”。
我用注销取代TSDISCON。
您可以使用PSTerminalServices PowerShell模块:
Get-TSSession – 计算机名称server1 – 状态活动| Disconnect-TSSession -WhatIf
我知道OP现在已经很老了,但是这样做应该可以做到你以后的事情(并且还没有其他人也在寻找相同的东西,我想我会回复的)。
同样,你可以使用query/reset session的地方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)
TSDiscon命令将断开terminal服务(RDP)会话。 如果使用它自己将会抛弃当前会话,则可以指定要断开的会话的会话ID,也可以提供要断开连接的服务器名称。
完整的细节可以在这里find。
您没有指定是否要closures或重新启动计算机。 但是如果你不介意重启或关机,你可以直接调用:
shutdown -r -f -m \\computer_to_restart
这实际上会强制重新启动计算机。