【问题标题】:Trying to interpret user session states on Windows OS试图解释 Windows 操作系统上的用户会话状态
【发布时间】:2012-08-21 22:18:30
【问题描述】:

如果我从 Windows 7 上运行的本地服务调用以下 API:

WTS_SESSION_INFO* pWSI;
DWORD nCntWSI;
WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, NULL, 1, &pWSI, &nCntWSI);

然后遍历pWSI中所有返回的WTS_SESSION_INFO结构并检查WTS_CONNECTSTATE_CLASS状态成员,有人能解释一下WTSActiveWTSConnected有什么区别吗?

【问题讨论】:

  • “已连接”并不一定意味着您已成功登录。“活动”确实;)msdn.microsoft.com/en-us/library/windows/desktop/…
  • 谢谢。但是您的意思是什么——“已连接”并不一定意味着您已成功登录?用户会话如何“一半”登录?你能解释一下吗?
  • 用户已连接并已显示登录屏幕,但尚未完成并经过验证。例如,他可能正在输入密码。
  • @CareyGregory:谢谢。 WTSActive 非常简单。我正在尝试在 WTSConnected 下。那么,如果我将用户会话状态报告为 WTSConnected,这是否意味着用户尚未登录(并且该用户帐户下没有运行用户模式进程)?或者,用户可能以前登录过,锁定了工作站并且还没有重新登录?
  • 锁定计算机不会结束您的会话。您保持登录状态。因此连接但未激活意味着您的帐户下没有运行任何进程。

标签: c++ windows winapi terminal-services usersession


【解决方案1】:

已连接表示用户已连接并已(或即将)显示登录屏幕,但尚未完成且尚未经过验证。例如,他可能正在输入密码。

如果用户已锁定工作站、被屏幕保护程序锁定,或者他已切换到另一个用户帐户,则不会结束他的会话。用户保持登录状态,他的会话将保持标记为活动状态。因此,已连接但未处于活动状态意味着该用户帐户下没有运行任何进程。 (需要注意的是,可能有服务或其他进程在该用户凭据下的单独会话中运行,但这是另一回事。)

【讨论】:

  • 当用户从 RDP 会话断开连接时,也会收到 WTSConnected。断开连接是指关闭 RDP 客户端窗口。在这种情况下,用户不会注销,这就像锁定屏幕一样。
  • 如果操作系统是 Windows Server 版本,则检索的值始终为 WTSConnected。至少在 RDP 会话期间,我认为这不是确定用户是否仍在登录的可靠方法。
  • @Bemipefe 文档指出 WTSActive 确实表明用户已登录,这是我使用它的经验。
  • 它在 RDP 会话期间是否也有效?我的意思是,如果您连接到计算机(这意味着您正在执行登录)然后运行使用此 API 的程序,它会按预期工作吗?
  • @Bemipefe 我相信它会的,是的,但你应该测试它以确定。
猜你喜欢
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 2011-06-22
  • 2020-06-05
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多