我正在编写一个Windows服务,需要知道机器中当前是否有任何用户登录。
到目前为止,我已经尝试过
Win32_LogonSession
(WMI) 和 LsaEnumerateLogonSessions
/LsaGetLogonSessionData
(secure32.dll)。
两者都可以工作,并且似乎返回相同的数据,但是当用户注销时它们更新太慢:
因此 Win32_LogonSession 和 LsaEnumerateLogonSessions 都足够好。 服务需要在最后一个交互用户离开后 5 分钟内知道。
甚至 SysInternals 的 LogonSessions.exe 也没有给出最新答案。
另外,答案不能是“监视登录和注销事件并有一个计数器变量”,因为该服务可以随时启动。
我最终采用了以下方法:计算至少有一个进程正在运行的交互式会话的数量。
[首先我们需要为当前应用程序启用SeDebugPrivilege。]
【然后检索我们想要的数据。】
interactiveSessionsCount = | { sessionData.LoginID } ∩ { accessTokenStatistics.AuthenticationId } |
Obs:sessionData.LoginID 和 accessTokenStatistics.AuthenticationId 都是 LUID 类型。
WTSEnumerateSessionsA + WTSQuerySessionInformationA 可以更好地检测活动/交互式会话。