【问题标题】:How to get the current number of interactive user sessions in Windows?如何在 Windows 中获取当前的交互式用户会话数?
【发布时间】: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


【解决方案1】:

我最终采用了以下方法:计算至少有一个进程在运行的交互式会话的数量。

1) 获取每个交互会话的登录会话 ID。

  • LsaEnumerateLogonSessions (secur32.dll)
  • LsaGetLogonSessionData (secur32.dll)
  • sessionData.LogonType = SECURITY_LOGON_TYPE.Interactive 或 sessionData.LogonType = SECURITY_LOGON_TYPE.RemoteInteractive
  • sessionData.LoginID
  • LsaFreeReturnBuffer (secur32.dll)

2) 获取每个正在运行的进程的登录会话 ID。

[首先我们需要为当前应用启用 SeDebugPrivilege。]

  • GetCurrentProcess (kernel32.dll)
  • OpenProcessToken TOKEN_ADJUST_PRIVILEGES (advapi32.dll)
  • Lo​​okupPrivilegeValue SE_DEBUG_NAME (advapi32.dll)
  • AdjustTokenPrivileges (advapi32.dll)
  • CloseHandle (kernel32.dll)

[然后检索我们想要的数据。]

3) 设置交点基数

interactiveSessionsCount = | { sessionData.LoginID } ∩ { accessTokenStatistics.AuthenticationId } |

Obs:sessionData.LoginID 和 accessTokenStatistics.AuthenticationId 都是LUID 类型。

【讨论】:

  • 我知道它已经回答了一段时间,但我很好奇你是否有机会更新你的算法。我刚刚在我的 Windows 7(以及更高版本的 Windows 8)操作系统上实现了它,我得到了大约 7 或 8 个交互式用户会话,而实际上它只有一个交互式用户?
  • @tiago2014,非常感谢。你救了我 HELLA 几个小时试图通过这个。你真棒。
【解决方案2】:

WTSEnumerateSessionsA + WTSQuerySessionInformationA 可以更好地检测活动/交互会话。

【讨论】:

    猜你喜欢
    • 2015-12-16
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 2011-03-12
    • 1970-01-01
    相关资源
    最近更新 更多