批处理脚本检测多活动远程桌面会话:wmic结果与任务管理器不符
我明白你的困扰——任务管理器里看到mstsc.exe后面标了(2),但用wmic process where name="mstsc.exe" | find "mstsc.exe" /c却只返回1,这是因为现代版本的远程桌面客户端(mstsc.exe)会在单个进程内管理多个会话,任务管理器里的数字是进程内的会话数,而不是独立的进程数量,所以wmic统计进程数自然得不到正确的结果。
下面给你几个可靠的方法来检测当前系统上的活动远程桌面会话数量:
方法1:使用query user或quser命令
这是Windows内置的原生命令,能直接列出所有登录的用户会话,包括远程桌面会话:
quser
输出结果里会显示每个会话的状态(Active即为活动会话),你可以结合findstr和find来统计活动会话的数量:
quser | findstr /i "Active" | find /c /v ""
这个命令会返回当前所有活动会话的总数(包含本地控制台会话)。如果只想统计远程桌面会话,可以过滤掉控制台会话:
quser | findstr /v "console" | findstr /i "Active" | find /c /v ""
方法2:用PowerShell精准查询远程会话
PowerShell提供了更灵活的筛选能力,能直接定位远程桌面对应的登录会话类型:
Get-WmiObject Win32_LogonSession -Filter "LogonType=10" | Measure-Object | Select-Object -ExpandProperty Count
这里LogonType=10对应的是远程交互式登录(也就是我们说的远程桌面会话),执行后会直接返回当前活动的远程桌面会话数量。
如果需要在批处理脚本里调用这个逻辑,可以这样写:
powershell -Command "(Get-WmiObject Win32_LogonSession -Filter 'LogonType=10' | Measure-Object).Count"
方法3:查看mstsc进程内的会话数(对应任务管理器的标注)
如果你只是想获取任务管理器里mstsc.exe后面标注的数字(即单个进程内的会话数),可以用PowerShell查看进程的线程数来间接判断(因为每个会话对应一组线程):
Get-Process mstsc | Select-Object Id, @{Name='SessionCount'; Expression={$_.Threads.Count / 2}}
不过这个方法的准确性可能随mstsc版本变化,更推荐前两种方法来统计实际的远程会话数。
总结一下:不要通过mstsc的进程数量来判断远程会话数,用quser或者PowerShell查询系统登录会话是更可靠的方案。
内容的提问来源于stack exchange,提问作者Batch man

