1

假设在某个时间点我从本地服务应用程序调用WTSEnumerateSessions并获取当前用户会话 ID 的列表。因此,如果稍后我需要知道某个特定用户会话是否仍处于相同状态,我可以依靠WTS_SESSION_INFO::SessionId来唯一吗?如果没有,该怎么做?

4

3 回答 3

2

Windows 为每个登录会话提供一个 SID。MSDN 有用于查找它的示例代码,并且保证对于给定的登录会话它是唯一且恒定的。如果用户注销并重新登录,他将被赋予一个新的登录 SID。

如果同一用户同时在本地登录和远程登录,则每个登录会话将有不同的登录 SID。这张图片显示了我的意思:

Alice 有两个登录会话,具有不同的登录 SID.

(免责声明 - 我从我的博客文章中偷了它)

您可以使用此命令获取登录 SID。在不编写任何代码的情况下播放假设场景可能很有用。

c:\>whoami /logonid
S-1-5-5-0-329693570

在 Windows Server 2008 上测试。其他版本上的 YMMV。

于 2012-10-26T03:12:49.597 回答
2

会话 id 被分配为登录时未使用的最低编号。

因此,如果我有 ID 1,然后注销,然后您登录,您也会获得 ID 1,因为 1 在您登录时可用。

如果我从未注销,您将获得 ID 2,因为 ID 1 正在使用中。如果我然后注销并且您留在下一个用户将再次分配 ID 1(而不是 3),因为 1 是最低的未使用号码。

于 2012-10-26T07:54:32.083 回答
0

会话 ID 与安全 ID 不同。会话可能有人在某种状态下登录,或者可能没有人登录。您可以调用 WTSEnumerateSessions 并发现有人在会话 1 中登录,然后该人可以注销,稍后其他人可以登录并且 Windows 可能会给他们会话 1,然后您再次调用 WTSEnumerateSessions。因此,经过两次更改并被不同的用户使用后,状态可能与以前相同。你说这是独一无二的吗?不知道你说的独特是什么意思。

于 2012-10-26T07:02:19.083 回答