Являются ли идентификаторы сеансов, полученные с помощью API WTSEnumerateSessions, уникальными?
Скажем, если в какой-то момент времени я вызываю WTSEnumerateSessions из локального приложения-службы и получаю список идентификаторов сеансов текущего пользователя. Так что, если позже мне понадобится узнать, находится ли какой-то конкретный пользовательский сеанс в том же состоянии, могу ли я полагаться на то, что WTS_SESSION_INFO::SessionId будет уникальным? А если нет, как это сделать?
3 ответа
Windows дает SID для каждого сеанса входа. В MSDN есть пример кода для его поиска, и он гарантированно будет уникальным и постоянным для данного сеанса входа. Если пользователь выходит из системы и снова входит в систему, ему будет присвоен новый идентификатор безопасности входа в систему.
Если один и тот же пользователь вошел в систему локально и вошел в систему удаленно в то же время, для каждого сеанса входа в систему будет свой SID входа в систему. Это изображение показывает, что я имею в виду:
,
(Отказ от ответственности - я украл его из моего блога)
С помощью этой команды вы можете получить SID для входа в систему. Это может быть полезно для воспроизведения сценариев "что если" без написания кода.
c:\>whoami /logonid
S-1-5-5-0-329693570
Проверено на Windows Server 2008. YMMV на других версиях.
Идентификатор сеанса назначается как самый низкий неиспользуемый номер во время входа в систему.
Так что, если бы у меня был ID 1, затем вышел из системы и вы вошли в систему, вы бы также получили ID 1, так как 1 был доступен, когда вы вошли в систему.
Если я никогда не выйду из системы, вы получите ID 2, так как ID 1 использовался. Если я выйду из системы и вы останетесь у следующего пользователя, ему снова будет присвоен ID 1 (не 3), потому что 1 был самым низким неиспользованным номером.
Идентификатор сеанса не совпадает с идентификатором безопасности. Сессия может иметь кто-то вошел в нее в каком-то состоянии, или не может кто-то вошел в нее. Вы можете вызвать WTSEnumerateSessions и обнаружить, что кто-то вошел в систему в сеансе 1, позже этот человек мог выйти из системы, позже кто-то еще мог войти в систему, и Windows могла бы дать им сеанс 1, а затем вы снова вызвали WTSEnumerateSessions. Таким образом, состояние может быть таким же, как было раньше, после двух изменений и использования другим пользователем, чем раньше. Вы называете это уникальным? Я не знаю, что вы подразумеваете под уникальным.