如何查询所有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
相关产品推荐
相关产品推荐

