如何用PowerShell脚本读取会话ID并注销所有RDP会话?
提取quser结果中的SessionID并注销RDP会话
quser命令返回的是纯文本输出,不是PowerShell可直接访问的对象,所以你没法通过.sessionid这种属性方式读取会话ID。得先把文本解析成结构化数据,再提取需要的信息。
方法一:用正则表达式提取SessionID
直接从quser的输出文本中匹配会话ID,适合快速处理:
$server = "你的服务器名" $queryResults = quser /server:$server 2>&1 # 跳过表头行,处理每一行用户数据 foreach ($line in $queryResults | Select-Object -Skip 1) { # 用正则匹配数字形式的SessionID if ($line -match '\s+(\d+)\s+') { $sessionId = $matches[1] Write-Output "准备注销会话ID: $sessionId" # 执行注销命令,-Force参数强制注销 logoff $sessionId /server:$server -Force } }
方法二:将quser输出转换为PowerShell对象
如果需要更多用户信息(比如用户名、状态),可以把文本转换成自定义对象,更灵活:
$server = "你的服务器名" $queryResults = quser /server:$server 2>&1 # 处理输出,跳过表头,分割每行数据 $userSessions = $queryResults | Select-Object -Skip 1 | ForEach-Object { # 按多个空格分割,过滤空字符串 $parts = $_ -split '\s+' | Where-Object { $_ } [PSCustomObject]@{ Username = $parts[0] SessionName = if ($parts[1] -notmatch '\d') { $parts[1] } else { $null } SessionID = if ($parts[1] -match '\d') { $parts[1] } else { $parts[2] } State = if ($parts[1] -notmatch '\d') { $parts[3] } else { $parts[2] } IdleTime = if ($parts[1] -notmatch '\d') { $parts[4] } else { $parts[3] } LogonTime = if ($parts[1] -notmatch '\d') { $parts[5..($parts.Count-1)] -join ' ' } else { $parts[4..($parts.Count-1)] -join ' ' } } } # 遍历所有会话并注销 foreach ($session in $userSessions) { Write-Output "注销用户 $($session.Username) 的会话ID: $($session.SessionID)" logoff $session.SessionID /server:$server -Force }
注意事项
- 运行脚本需要管理员权限,否则可能无法注销其他用户的会话。
- 如果
quser返回"没有用户登录"的提示,2>&1会捕获错误输出,避免脚本中断。 - 可以根据需要添加判断,比如只注销处于"Active"状态的会话,或者排除当前执行脚本的用户会话。
内容的提问来源于stack exchange,提问作者Willingtolearn
相关产品推荐
相关产品推荐

