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

如何查询所有Windows终端服务(WTS)/RDP会话

问题

如何在不使用quser、qwinsta、query session、query user命令,也不解析上述命令输出的前提下,获取Windows设备上存在的所有会话?

解答

你提到的几个查询会话的内置命令,本质都是对Windows原生会话查询接口的封装,完全可以绕过这些命令,直接调用底层接口拿结构化的会话数据,以下是两种最常用的可行方案:

  • 方案1:PowerShell直接查询CIM/WMI(无额外依赖,命令行直接可用)
    Windows的所有登录会话信息都存储在CIM仓库的Win32_LogonSession类中,可以直接通过PowerShell的CIM cmdlet读取,不需要调用任何你提到的query类命令。如果需要关联会话对应的用户名、区分登录类型,可以用下面的脚本:
Get-CimInstance -ClassName Win32_LogonSession | ForEach-Object {
    $linkedUser = $_ | Get-CimAssociatedInstance -ResultClassName Win32_UserAccount -ErrorAction SilentlyContinue
    [PSCustomObject]@{
        SessionId       = $_.LogonId
        ConnectedUser   = if ($linkedUser) { "$($linkedUser.Domain)\$($linkedUser.Name)" } else { "无关联用户/系统内置会话" }
        LogonType       = switch ($_.LogonType) {
            2  { "本地交互式登录" }
            3  { "网络共享访问登录" }
            4  { "批处理任务登录" }
            5  { "Windows服务账户登录" }
            7  { "工作站解锁登录" }
            10 { "远程桌面(RDP)登录" }
            default { "其他类型($_)" }
        }
        LogonStartTime  = $_.StartTime
        AuthProtocol    = $_.AuthenticationPackage
    }
}

执行后直接返回结构化的会话对象,不需要做任何文本解析。

  • 方案2:直接调用Win32 API(适合自研程序集成场景)
    可以直接加载wtsapi32.dll,调用WTSEnumerateSessionsEx原生接口枚举会话。你提到的quser、qwinsta等命令底层就是调用这个接口实现的,自主调用时可以直接拿到包含会话ID、会话状态、会话名称、关联用户SID的结构化数据,完全不需要走命令行调用、文本解析的流程。

权限说明:枚举设备所有会话需要当前运行上下文拥有终端服务信息查询权限,本地管理员账户可以完整枚举所有会话,普通权限账户仅能查询到自身所属的会话信息。

内容的提问来源于stack exchange,提问作者swbbl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 00:24:31