SID (Security IDentifier) – это уникальный идентификатор, который присваивается пользователям, группам, компьютерам и другим объектам безопасности при их создании в Windows, Active Directory или Entra ID (Azure). Windows использует SID, а не имена пользователей/групп для контроля доступа к различным ресурсам: сетевым папкам, ключам реестра, объектам файловой системы (NTFS разрешения), принтерам и т.д. В этой статье рассмотрены простые способы узнать SID пользователя, группы или компьютера по имени, и обратную процедуру – получить имя объекта по известному SID.
Что такое SID объекта в Windows?
SID (security identifier) позволяет уникально идентифицировать пользователя, группу или компьютер в пределах определенной области безопасности (домена AD или локального компьютера). SID представляет собой строку в следующем формате:
S-1-5-21—2927053466-1818515551-2824591131—1103.
В данном примере:
- S – указывает, что данная строка содержит SID.
- 1 – номер версии идентфикатора (всегда 1)
- 5 – идентфикатор полномочий (5 для NT Authority, 12 для Entra ID, 1- группа Everyone)
- 21-2927053466-1818515551-2824591131 – это уникальный идентификатор домена, выдавшего SID (у всех объектов в одном домене эта часть будет одинакова)
- 1103 – относительный идентификатор безопасности объекта (Relative ID, RID). Начинается с 1000 и увеличивается на 1 для каждого нового объекта. Выдается контроллером домена с FSMO ролью RID Master)
SIDы объектов Active Directory хранятся в базе ntds.dit, а SIDы локальных пользователей и групп в локальной базе диспетчера учетных записей Windows (SAM, Security Account Manager в ветке реестра HKEY_LOCAL_MACHINE\SAM\SAM). SID является уникальным значением в пределах среды, в которой он выдан ( SID локального пользователя уникален в пределах компьютера, а SID доменного – в пределах домена).
В Windows есть так называемые стандартных (известные) идентификаторы безопасности (Well-known SID). Это SID встроенных (BuiltIn) пользователей и групп, которые есть на любых компьютерах Windows. Например:
-
S-1-5-32-544
– встроенная группу Administrators -
S-1-5-32-545
– локальные пользователи -
S-1-5-32-555
– группа Remote Desktop Users, которым разрешен вход по RDP -
S-1-5-21-<domain>-500
– учетная запись встроенного администратора Windows (администратора домена) -
S-1-5-21-<domain>-513
— Domain Users, пользователи домена -
S-1-5-21-<domain>-512
— Domain Admins, администраторы домена - И т.д.
В Windows есть несколько средств для преобразования SID в имя объекта или обратно (Username -> SID): утилита
whoami
, команда
wmic
, WMI, команды PowerShell и сторонние утилиты.
Как получить SID локального пользователя?
Для получения SIDа локальной учетной записи, можно использовать встроенную утилиту wmic, которая обращается к пространству имен WMI (Windows Management Instrumentation) компьютера.
wmic useraccount where name='test_user' get sid
Команда вернула SID указанного пользователя —
S-1-5-21-1175651296-1316126944-203051354-1005
.
Однако, начиная с Windows 11 24H2 и Windows Server 2025, команда wmic по умолчанию не установлена, поэтому вместо нее нужно использовать команды PowerShell.
Получить SID пользователя test_user из пространства имен WMI (в качестве альтернативы команды
wmic
):
(Get-CimInstance -Class win32_userAccount -Filter "name='test_user' and domain='$env:computername'").SID
Или (проще) узнать SID локального пользователя с помощью встроенного PowerShell модуля управления локальными пользователями и группами (Microsoft.PowerShell.LocalAccounts)
Get-LocalUser -Name 'test_user' | Select-Object Name, SID
Вывести список локальных пользователей Windows и их SID:
Get-LocalUser | Select-Object name,sid
Получить SID текущего пользователя (под которым выполняется команда):
Get-LocalUser -Name $env:USERNAME | Select-Object name,sid
Обратите внимание, что информация о локальных профилях пользователей на компьютере в реестре хранится в ветке ProfileList с SID (вместо имени пользователя). Таким образом, имя пользователя по его SID можно извлечь из реестра:
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-21-3414967564-454070197-2746421142-1006" /v ProfileImagePath
По аналогии можно получить SID локальной группы:
Get-LocalGroup -Name tstGroup1 | Select-Object Name, SID
В старых версиях Windows можно использовать.NET классами System.Security.Principal.SecurityIdentifier и System.Security.Principal.NTAccount для получения SID пользователя с помощью PowerShell:
$objUser = New-Object System.Security.Principal.NTAccount("LOCAL_USER_NAME")
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
$strSID.Value
Узнать SID пользователя или группы в домене Active Directory
Команда для получения SID вашей (текущей) доменной учетной записи:
whoami /user
Также можно посмотреть SID пользователя из графического интерфейса оснастки ADUC (dsa.msc) на вкладке редактора атрибутов в свойствах пользователя (свойство objectSid).
Можно получить SID пользователя домена Active Directory с помощью утилиты WMIC. В этом случае в команде нужно указать имя домена:
wmic useraccount where (name='jjsmith' and domain=′corp.winitpro.ru′) get sid
Однако эта утилита считается устаревшей, поэтому лучше использовать для получения SID доменного пользователя командлету Get-ADUser (из модуля Active Directory Module для PowerShell). Вывести SID доменного пользователя jjsmith:
Get-ADUser -Identity 'jjsmith' | select SID
SID группы безопасности в домене AD можно получить с помощью командлета Get-ADGroup:
Get-ADGroup -Filter {Name -like "msk-admin*"} | Select SID
Если на вашем компьютере отсутствует модуль AD для PowerShell, можно узнать SID пользователя с помощью классов .Net:
$objUser = New-Object System.Security.Principal.NTAccount("corp.wintpro.ru","jjsmith")
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
$strSID.Value
Эта же команда PowerShell в одну строку:
(new-object security.principal.ntaccount “jjsmith").translate([security.principal.securityidentifier])
Получить SID компьютера
Если компьютер с Windows добавлен в домен Active Directory, у него будет два разных SID. Первый SID – идентификатор локального компьютера (Machine SID), а второй – уникальный идентификатор компьютера в AD.
SID компьютера в домене Active Directory можно получить с помощью команды:
Get-ADComputer srv-rds1 -properties sid|select name,sid
SID локального компьютера (Machine SID) можно получить с помощью утилиты PsGetsid (https://docs.microsoft.com/en-us/sysinternals/downloads/psgetsid):
.\PsGetsid64.exe
Или (еще проще), обрезав последние 4 символа RID и SID любого локального пользователя:
$user=(Get-LocalUser Administrator).sid
$user -replace ".{4}$"
Как узнать имя пользователя или группы по известному SID?
Другая частая ситуация, когда вам нужно узнать имя пользователя или группы по известному SID (обратная процедура). В следующем примере в списке членов группы отображаются SID объектов вместо их имен.
Получить имя пользователя по известному SID можно с помощью одной из следующих команд:
wmic useraccount where sid='S-1-3-12-12452343106-3544442455-30354867-1434' get name
Также можно узнать получить SID группы и пользователя с помощью встроенных классов PowerShell (без использования дополнительных модулей):
$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-21-2470456651-3958312488-29145117-23345716")
$objUser = $objSID.Translate( [System.Security.Principal.NTAccount])
$objUser.Value
В домене AD для поиска объектов по известному SID лучше использовать командлет Get-ADObject. Это универсальный метод поиска объектов в Active Directory по SID, когда вы не знаете к какому типу объекта AD относится SID и какой точно командлет нужно использовать для его поиска (Get-AdUser, Get-ADComputer или Get-ADGroup):
$sid = 'S-1-5-21-2470146651-3951111111-2989411117-11119501'
Get-ADObject –IncludeDeletedObjects -Filter "objectSid -eq '$sid'" | Select-Object name, objectClass
IncludeDeletedObjects
позволяет искать по удаленным объектам в корзине Active Directory.В нашем случае объект AD, который имеет данный SID, является компьютером (objectClass=computer).
Очень полезно и грамотно написано! Спасибо разобрался SID доменного пользователя
А если нужно 1000 SID преобразовать в имена?
Скрипты тогда вам в помощь. например на PowerShell.
подсовываете текстовик со списком SID, он по циклу гоняет скрипт и вывод производит в текстовик рядом.
Здравствуйте!
Посоветуйте какой-либо способ/метод, который позволит узнать: есть ли конкретная учетная запись в AD или нет.
Из командной строки — понятно как Вы сделали.
Как реализовать это скриптом JS? Обратиться к какому-либо методу в JS, передав в него параметром ИмяПользователя и Домен.
Спасибо
Как из JS обращаться к LDAP — не знаю, скорее какая-то обертка для этого имеется.
Но я думаю для частной задачи можно попробовать возможность вызова PoSh командлетов из скриптов javascript. Посмотрите в сторону фреймворка Node-PowerShell.
Спасибо, погуглю про Node-PowerShell.
К сожалению про группы нет ни слова
Это справедливо только для контроллеров домена, еще несколько лет назад на эту тему писал Марк Русинович.
Другое дело, если вы клонируете доменную машину не выводя из домена, но это только новички могут сделать.
Вот ссылка на оригинальную статью, кому интересно
https://learn.microsoft.com/en-us/archive/blogs/markrussinovich/the-machine-sid-duplication-myth-and-why-sysprep-matters