【发布时间】:2011-06-06 16:57:41
【问题描述】:
我正在编写一个 Windows 服务,它需要知道机器上当前是否有任何用户登录。
到目前为止,我已经尝试过 Win32_LogonSession (WMI) 和 LsaEnumerateLogonSessions/LsaGetLogonSessionData (secur32.dll)。
两者都有效,并且似乎返回相同的数据,但是当用户注销时它们更新太慢:
- 系统启动时,它们返回“0 个交互式用户”。 (好的)
- 当我登录时,他们返回“1 个交互式用户”。 (好的)
- 但是然后当我注销时,用户数保持为1。重新登录后,用户数为2,依此类推。
因此 Win32_LogonSession 和 LsaEnumerateLogonSessions 都足够好。 服务需要在最后一个互动用户离开后的 5 分钟内知道。
甚至 SysInternals 的 LogonSessions.exe 也没有给出最新的答案。
另外,答案不能是“监控登录和注销事件并有一个计数器变量”,因为服务可以随时启动。
【问题讨论】:
-
您确定登录会话结束了吗?如果令牌已复制或用户已被模拟 (msdn.microsoft.com/en-us/library/aa378338%28v=VS.85%29.aspx),登录会话仍将存在。
-
@Luke 好吧,我用直接登录+注销进行了测试。据我所知,没有发生登录会话令牌重复或用户模拟。
标签: windows winapi language-agnostic windows-services