You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:10:34