与现有会话的远程桌面连接会触发网络提供程序中的NPLogonNotify。但有没有办法可以弄清楚它是一个登录事件还是现有会话的连接事件?
答案 0 :(得分:1)
LsaGetLogonSessionData从登录会话ID返回终端服务会话ID。因此,您可以尝试使用WTSConnectState调用WTSQuerySessionInformation。幸运的是,结果将区分您关注的两个案例。
如果没有,如果你在从NPLogonSession返回之前不需要知道答案,你可以观察与NPLogonSession调用相关的终端服务会话会发生什么,可能使用WTSRegisterSessionNotification。
我相信如果用户连接到现有会话,来自NPLogonNotify的终端服务会话将返回空闲或监听状态。此外,将关闭对NPLogonNotify的调用中的登录会话。您可以通过调用LsaEnumerateLogonSessions来枚举登录会话。
如果用户收到新会话,我相信将使用来自NPLogonNotify的呼叫中的相同终端服务会话,因此它将进入活动状态。通常还会启动一个或多个进程,这些进程与对NPLogonNotify的调用的登录会话ID相关联。您可以使用GetTokenInformation和TokenStatistics查询类来确定与进程关联的登录会话,如MSDN术语表中的"logon identifier"所述。
要注意的另一个复杂因素是:如果用户是管理员,并且启用了UAC,则会有两次对NPLogonNotify的调用,一次与受限用户令牌相关联,另一次与提升的用户令牌相关联。对于本地和远程登录都是如此。