有没有办法在NPLogonNotify中检测远程桌面会话事件?

到现有会话的远程桌面连接会触发networking提供商中的NPLogonNotify。 但是有没有一种方法,我可以弄清楚,如果它的login事件或连接事件到现有的会议?

LsaGetLogonSessionData从登录会话ID中返回终端服务会话标识。 所以你可以尝试使用WTSConnectState调用WTSQuerySessionInformation 。 幸运的是,结果将会区分你所关心的两个案例。

如果不是,并且在从NPLogonSession返回之前不需要知道答案,那么可以使用WTSRegisterSessionNotification来观察与NPLogonSession调用相关的终端服务会话会发生什么情况。

我相信,如果用户连接到一个现有的会话,来自NPLogonNotify的终端服务会话将返回到空闲或监听状态。 此外,NPLogonNotify调用中的登录会话将被关闭。 您可以通过调用LsaEnumerateLogonSessions来枚举登录会话。

如果用户收到一个新的会话,我相信在NPLogonNotify的调用中会使用同一个终端服务会话,所以会进入激活状态。 通常还会有一个或多个启动的进程与从调用NPLogonNotify的登录会话ID相关联。 您可以使用GetTokenInformation和TokenStatistics查询类来确定与进程关联的登录会话,如MSDN词汇表中的“登录标识符”所述。

需要注意的一个额外的复杂性:如果用户是管理员,并且启用UAC,则会有两个对NPLogonNotify的调用,一个与限制的用户令牌关联,另一个与提升的用户令牌关联。 对于本地和远程登录都是如此。