2

我知道(并且有效)在 C# 中,此属性告诉我当前会话是否是 RDP 会话:

System.Windows.Forms.SystemInformation.TerminalServerSession

现在,我有一个接收登录/注销和锁定/解锁事件的服务,我需要一种方法来告诉该服务正在启动的会话是 rdp 还是本地的。

问题:服务以SYSTEM用户运行,上面的属性总是返回false(我认为是因为SYSTEM总是被认为是本地连接用户)

我尝试在寄存器中搜索 Volatile Environment 子项,以检查是否存在标识 RDP 会话名称的子项:这在锁定/解锁处理程序中有效,但在登录处理程序中,子项尚不存在(子项登录完成后创建)。

关于如何解决这个问题的任何想法?

虽然在有限的时间内等待密钥创建是可行的,但我想要一种不那么“笨拙”的方式来做到这一点。

4

1 回答 1

2

您可以通过调用WTSQuerySessionInformation并将WTSInfoClass参数设置为来检测会话是本地会话还是远程会话WTSClientProtocolType。如果您想避免 P/Invokes,可以使用Cassia 库new TerminalServicesManager().GetLocalServer().GetSession(sessionId).ClientProtocolType.

注意事项:这在处理会话注销消息时对您没有帮助,因为您将无法(可靠地)获取有关会话的信息,因为它正在被销毁(但这似乎相对容易解决)。此外,ClientProtocolType上面提到的 Cassia 属性尚未发布,但您可以通过以访客身份登录并使用 artifacts 链接从构建服务器获取主干构建。

于 2012-07-25T15:37:00.037 回答