与现有会话的远程桌面连接会触发网络提供商中的 NPLogonNotify。但是有没有办法我可以确定它是登录事件还是连接到现有会话的事件?
1 回答
LsaGetLogonSessionData从登录会话 ID 返回终端服务会话 ID。因此,您可以尝试使用 WTSConnectState调用WTSQuerySessionInformation 。运气好的话,结果将区分您关注的两种情况。
如果没有,并且如果您在从 NPLogonSession 返回之前不需要知道答案,您可以使用WTSRegisterSessionNotification 观察与调用 NPLogonSession 相关的终端服务会话会发生什么。
我相信如果用户连接到现有会话,来自 NPLogonNotify 的终端服务会话将返回空闲或侦听状态。此外,调用 NPLogonNotify 中的登录会话将被关闭。您可以通过调用LsaEnumerateLogonSessions来枚举登录会话。
如果用户收到一个新会话,我相信来自 NPLogonNotify 的调用中的相同终端服务会话将被使用,因此它将进入活动状态。通常还会启动一个或多个进程,这些进程与调用 NPLogonNotify 的登录会话 ID 相关联。您可以通过将GetTokenInformation与 TokenStatistics 查询类一起使用来确定与进程关联的登录会话,如MSDN 词汇表中的“登录标识符”下所述。
还有一个需要注意的复杂情况:如果用户是管理员,并且启用了 UAC,将会有两个调用 NPLogonNotify,一个与受限用户令牌相关联,另一个与提升的用户令牌相关联。这对于本地和远程登录都是如此。