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