检测活动的RDP会话

3
我需要在我的应用程序中实现一个死人开关。如果应用程序正在从RDP运行,并且它失去了与远程客户端的连接,我需要采取相应措施。
我知道如何使用代码检测是否在RDP中运行:
GetSystemMetrics(SystemMetric.SM_REMOTESESSION)

但是当客户端关闭而没有注销时,会话将继续。这就是我想要应对的情况,但我不知道如何检测客户端断开连接。我需要知道是否有活动的RDP用户。
我可以通过观察RDP端口来找到远程端点,但是由于这种设置可能在非默认端口上进行,如果存在更好的解决方案,我想避免使用此解决方案。
我希望有一个不特定于WinForms、WPF、UWP等的解决方案。如果它也适用于.NET Core,则额外加分。

也许这个链接可以帮到你:https://dev59.com/O2zXa4cB1Zd3GeqPS19C - BWA
2
请注意,SM_REMOTESESSION并不总是推荐使用的:https://learn.microsoft.com/en-us/windows/desktop/termserv/detecting-the-terminal-services-environment - Simon Mourier
2个回答

1
  1. 是的,您可以使用 PowerShell 进行操作,例如使用 > query user /server:$SERVER
  2. 您可以从 .Net 调用任何 PowerShell 命令。

祝好 Ren


嗨,感谢你抽出时间回答这个问题,但是我在2018年就遇到过这个问题了,现在已经不适用了。 :) - Troels Larsen

0

不是 .NET Core 解决方案,而是 Windows API 解决方案。您可以通过 WTSRegisterSessionNotification(以及稍后的 unregister)选择加入会话更改通知。

然后这些通知将在您的 Windows 消息循环中传递,因此您需要运行一个消息循环。(WinForms 和 WPF 都有,并且有特定的机制允许您执行 自定义消息处理

然后您将收到会话被锁定或断开连接时的通知。


不幸的是,WTSRegisterSessionNotification需要覆盖WndProc的能力,而我在控制台应用程序中。我希望有更好的解决方案,因为我认为应该关闭服务。 - Troels Larsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接