Уникальный идентификатор для профилей пользователей в Windows

Для клиент-серверного приложения мне нужно централизованно хранить части информации о конфигурации, которая обычно попадает в каталог профиля пользователя.

Клиентское приложение при первом использовании записывает файл или запись реестра с GUID в текущий профиль. Этот GUID впоследствии будет использоваться в качестве ключа в базе данных конфигурации на сервере.

Теперь мне интересно, есть ли у профилей пользователей Windows уникальные идентификаторы, которые я мог бы использовать вместо создания собственных GUID.

Имя пользователя не будет работать, потому что у пользователей может быть несколько профилей. Объединить его с именем компьютера не получится, потому что могут быть перемещаемые профили.


Обновление:

Я только что посмотрел SID в HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProfileList на двух компьютерах в одном домене. Роуминг не включен, поэтому моя учетная запись пользователя имеет отдельный профиль на каждой машине. Оба профиля указаны с одним и тем же SID. Это означает, что я должен продолжать создавать свои собственные идентификаторы GUID.


person Sebastian Kirsche    schedule 24.04.2009    source источник


Ответы (4)


Пользователи и группы Windows используют идентификаторы безопасности (SID).

Идентификатор безопасности (SID) - это уникальное значение переменной длины, которое используется для идентификации участника безопасности или группы безопасности в операционных системах Windows.

Существует список предопределенных идентификаторов безопасности, встроенных в Windows. Другие идентификаторы безопасности генерируются путем объединения идентификатора безопасности текущего компьютера (сгенерированного случайным образом, 96 бит) с увеличивающимся числом.

SID пользователей, у которых есть учетные записи на компьютере, хранятся в реестре под HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProfileList

Примеры SID (взяты из Политика Microsoft в отношении дублирования дисков в Windows XP установок):

В следующем примере отображаются идентификаторы безопасности для четырех учетных записей локальных пользователей. Обратите внимание, что только последние четыре цифры увеличиваются при добавлении новых учетных записей.

  • S-1-5-21-191058668-193157475-1542849698-500 Администратор
  • S-1-5-21-191058668-193157475-1542849698-1000 Пользователь 1
  • S-1-5-21-191058668-193157475-1542849698-1001 Пользователь 2
  • S-1-5-21-191058668-193157475-1542849698-1002 Пользователь 3

Из-за того, как генерируются идентификаторы безопасности, они должны быть уникальными. Поскольку они являются частью системы профилей Windows, перемещаемые профили должны иметь одинаковый SID в каждой системе.

person Powerlord    schedule 24.04.2009

Вы можете использовать идентификатор безопасности профиля пользователя (SID).

LookupAccountName () Win32 API принимает пользователя имя и имя компьютера в качестве входных данных и возвращает связанный идентификатор безопасности.

person snowcrash09    schedule 24.04.2009

R Bemrose и snowcrash верны, SID учетной записи - это именно то, что вы запрашивали. Вы правы в том, что для того, чтобы это решение работало, вы должны активировать перемещаемые профили; поэтому их называют перемещаемыми профилями.

Если вы не хотите использовать аутентификацию домена для идентификации пользователей, то другой вариант - WAS (службы аутентификации Windows). Это обычно, но не обязательно, реализуется поверх Microsoft SQL Server в повсеместно распространенной базе данных ASPNETDB.

WAS - это решение dotnet с продуманной поддержкой ASP.NET, которое также доступно для программного обеспечения для настольных компьютеров. Если вам это тоже не нравится, вы можете свернуть свой собственный, но мне это кажется неоптимальным использованием ресурсов. Если вы не создаете программное обеспечение для dotnet, вы все равно можете использовать WAS, но это будет не так удобно.

person Peter Wone    schedule 25.04.2009

Я мог бы использовать более LDAP-ориентированное решение этой проблемы, но для вашего приложения это может потребовать гораздо больше работы.

В AD есть несколько уникальных полей для пользователя. Вы можете использовать полное DN записи пользователя (например, DC = com, DC = example, CN = Users, DN = bob smith). Это то, что однозначно определяет запись в AD. Однако в MS также есть поле UPN, которое выглядит как адрес электронной почты (иногда это так) и принимает форму user @ domain.

Конечно, для этой информации требуется доступ для чтения к AD, что может оказаться непрактичным для вашего приложения.

person jjohn    schedule 25.04.2009