基于用户名输入变量断开RDS用户会话的脚本问题
解决RDS多服务器环境下强制注销用户的问题
你的脚本核心问题出在Format-Wide这个Cmdlet上——它的作用是把数据转换成适合终端显示的格式化字符串,而不是保留原始的会话对象属性值。所以哪怕write-output $sid能显示出数字,本质上这个变量已经变成了格式化后的文本,不是Invoke-RDUserLogoff需要的原始数值类型,自然无法被识别。
下面是修正后的可行脚本,还考虑了一个用户可能同时在多台RDS服务器登录的场景:
# 导入RemoteDesktop模块 Import-Module RemoteDesktop # 获取要注销的用户名 $user = Read-Host -Prompt 'Enter Username you want to disconnect' # 获取该用户的所有RDS会话(保留原始对象,不做格式化处理) $userSessions = Get-RDUserSession | Where-Object { $_.UserName -eq $user } # 检查是否找到目标用户的会话 if (-not $userSessions) { Write-Host "No active sessions found for user: $user" exit } # 循环处理每个会话,逐一强制注销 foreach ($session in $userSessions) { try { Invoke-RDUserLogoff -HostServer $session.HostServer -UnifiedSessionID $session.UnifiedSessionID -Force Write-Host "Successfully logged off user $user from server $($session.HostServer) (Session ID: $($session.UnifiedSessionID))" } catch { Write-Host "Failed to log off user $user from server $($session.HostServer): $_" } }
关键改进说明:
- 直接保留
Get-RDUserSession返回的原始会话对象,不再用Format-Wide提取属性——这样可以直接访问对象的HostServer和UnifiedSessionID原生属性,类型完全匹配Invoke-RDUserLogoff的要求。 - 添加了会话存在性检查,避免找不到用户时执行无效命令。
- 用循环遍历所有会话,支持用户同时登录多台RDS服务器的场景。
- 增加了错误捕获逻辑,能直观反馈注销失败的原因。
你可以直接运行这个脚本,输入目标用户名后,它会自动遍历所有RDS服务器,注销该用户的所有活跃会话。
内容的提问来源于stack exchange,提问作者Eric Barger
相关产品推荐
相关产品推荐

