如何从命令提示符注销所有远程桌面会话用户

在某些情况下,管理员可能需要强制注销当前登录到远程桌面服务器的所有用户。 可以使用批处理文件或 PowerShell 脚本执行此操作。

警告

执行以下过程会注销当前登录到远程桌面服务器的所有用户。 这可能会导致丢失未保存的数据。 因此,建议格外小心。

原始 KB 数: 259436

使用 PowerShell

若要注销所有用户会话,请在连接代理上运行以下 Powershell cmdlet:

$sessions = Get-RDUserSession

foreach($session in $sessions)
{
    Invoke-RDUserLogoff -HostServer $session.HostServer -UnifiedSessionID $session.UnifiedSessionId -Force
}

若要仅注销断开连接的用户会话,请在连接代理上运行以下 Powershell cmdlet:

$sessions = Get-RDUserSession |  ? {$_.SessionState -eq "STATE_DISCONNECTED"}

foreach($session in $sessions)
{
    Invoke-RDUserLogoff -HostServer $session.HostServer -UnifiedSessionID $session.UnifiedSessionId -Force
}

使用批处理文件

将以下信息放入批处理(.bat)文件中:

query session >session.txt  
for /f "skip=1 tokens=3," %%i in (session.txt) DO logoff %%i  
del session.txt  

每当管理员希望强制注销未登录到远程桌面服务器控制台的所有用户时,都可以运行此批处理文件。

查询是在远程桌面服务器环境中发现的多用途命令。 在这种情况下,查询会话会创建远程桌面服务器上运行的所有会话的列表,其中包含会话 ID 号。 在批处理文件中,此输出将重定向到文本文件。 然后,FOR 语句分析文本文件的每一行,跳过第一行,并查找在第三列中找到的会话 ID 号。 然后,它将此变量放入 Logoff 中,导致该会话被注销。

运行此批处理文件时收到错误消息并不少见。 如果用户登录到远程桌面服务器控制台,则会生成以下错误消息:

Could not logoff session ID 0 from session Console, Error code 5
Error [5]: Access is denied.

这是因为命令存在 Logoff 限制。 它无法强制注销控制台会话。 此问题的解决方法是修改批处理文件以读取:

query session >session.txt  
for /f "skip=2 tokens=3," %%i in (session.txt) DO logoff %%i  
del session.txt  

这会导致跳过Session.txt文件的前两行,避免错误。