Windows环境下如何检测远程桌面(RDP)会话窗口是否已断开连接?
嘿,这个场景我太熟悉了——经常开一堆RDP窗口,突然某个就悄咪咪断了还占着屏幕空间。给你几个实用的思路,不管是写脚本还是小工具都能用:
通过Windows API监听窗口状态
RDP客户端窗口的类名是固定的TscShellContainerClass,你可以用FindWindowEx或者EnumWindows遍历系统里的窗口,定位到所有RDP窗口。当会话断开时,窗口其实会有状态变化:比如你可以用IsWindowResponding函数检查窗口是否还能正常响应,断开后的RDP窗口大概率会变成无响应状态;或者监听窗口的消息,RDP客户端在断开时会发送特定的内部消息,不过这个需要用钩子或者消息循环来捕获,稍微复杂点。如果用Python的话,可以借助pywin32库快速调用这些API,不用写C++代码。用命令行/脚本结合进程/会话查询
试试qwinsta命令,它能列出系统里所有的远程会话(包括你本地发起的RDP连接),输出里会显示每个会话的状态(比如Active或者Disc表示断开)。你可以写个脚本定时执行qwinsta,解析输出结果来判断哪个会话断了。另外,RDP客户端进程是mstsc.exe,如果你用mstsc /new启动每个独立的RDP窗口(默认可能多个窗口共用一个进程),那每个窗口对应单独的mstsc.exe进程,你可以用tasklist或者PowerShell的Get-Process检查进程是否还在响应,无响应的进程大概率对应断开的会话。自动关闭超时断开的窗口
如果你觉得检测状态太麻烦,直接定时清理无响应的RDP窗口也行。比如写个PowerShell脚本,每隔5分钟跑一次:Get-Process mstsc | Where-Object {$_.Responding -eq $false} | Stop-Process -Force这个脚本会杀掉所有无响应的RDP进程,当然如果担心误杀,可以先尝试发送关闭窗口的消息(用
SendMessageAPI),实在不行再杀进程。另外也可以结合窗口标题过滤,只处理你指定的服务器窗口。
备注:内容来源于stack exchange,提问作者eek

