WTSEnumerateSessions API获取的会话ID是唯一的吗?

时间:2012-10-26 01:58:44

标签: c++ winapi sessionid

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

3 个答案:

答案 0 :(得分:2)

Windows为每个登录会话提供SID。 MSDN has sample code to look it up并且保证在给定的登录会话中是唯一且不变的。如果用户注销并重新登录,则会将其归为新的登录SID。

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

Alice has two logon session, with distinct Logon SID

(免责声明 - 我从blog post of mine

中偷走了它

您可以使用此命令获取登录SID。无需编写任何代码即可播放假设情景。

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

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

答案 1 :(得分:2)

会话ID被指定为登录时未使用的最低号码。

因此,如果我有ID 1,然后注销,并且您登录后您将获得ID 1,因为登录时可用1。

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

答案 2 :(得分:0)

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