脚本-如何断开远程桌面会话的连接?


8

我正在寻找一种关闭计算机(本地计算机)上所有活动的远程桌面会话的方法。Windows包含几个命令(rwinsta,qwinsta等)来查看活动的会话,但是我看不到如何轻松地使用信息(除非我解析字符串...)来关闭所有会话。

Powershell(或C#,批处理)中是否可以关闭本地计算机上的所有远程桌面会话?

谢谢马丁


我更新了答案,添加了一个循环,该循环只会断开活动的远程会话,而不会断开控制台
Kevin Kuphal,2009年

Answers:


5

您可以尝试使用undocumented /sm参数query session(在批处理文件中)更轻松地对事物进行排序:

FOR /f %%G IN ('query session /sm') DO tsdiscon %%G

这是一个好的开始...但是我只想断开远程桌面会话的连接。
马丁

4

是的,从命令行使用tsdiscon:

tsdiscon n

其中n应替换为会话ID。

您可以从获取会话号

query session

因为您说过要关闭本地计算机上的所有会话,所以我想您需要注意执行顺序(即最后一次关闭会话)。


2

您可能想查看Powershell社区扩展。它包括Get,Stop和Disconnect TerminalSession cmdlet。


2

您可以使用tsdiscon实用程序断开会话。如果从命令提示符处使用“查询会话”命令,则可以看到ID列表,然后为每个ID发出tsdiscon命令。

这样的循环构造应该起作用

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

q.bat在哪里

query session /sm | find "Active"

那只会断开远程会话,并忽略控制台用户。


1

您可以使用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.

1

我发现TSDISCON不会删除“ Disc”连接的会话。

我用注销代替了TSDISCON。



1

我知道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
)

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)


0

TSDiscon命令将断开终端服务(RDP)会话。单独使用将断开当前会话,您可以指定要断开连接的会话的会话ID,也可以提供要断开连接的服务器名称。

完整的细节可以在这里找到。


0

您未指定是否要在不关闭或重新启动计算机的情况下执行此操作。但是,如果您不介意重启或关机,则可以致电:

shutdown -r -f -m \\computer_to_restart

实际上,这将强制重新启动计算机。


好吧...这是一个主意。但是我不想杀死所有会议。仅远程桌面会话。
马丁

0

即使这个问题已经很老了,如果没有qwinsta / query / tsdiscon,也几乎没有解决所有版本的方法,即所有Windows主版本。

但是,有一个简单的Powershell版本可以断开会话:

$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)

可以使用获取会话ID getProcesss。要断开(而不是注销!)会话,请使用$tstType::DisconnectSession("localhost", 2)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.