Как узнать SID пользователя, группы, компьютера по имени?

SID (Security IDentifier) – это уникальный идентификатор, который присваивается пользователям, группам, компьютерам и другим объектам безопасности при их создании в Windows, Active Directory или Entra ID (Azure). Windows использует SID, а не имена пользователей/групп для контроля доступа к различным ресурсам: сетевым папкам, ключам реестра, объектам файловой системы (NTFS разрешения), принтерам и т.д. В этой статье рассмотрены простые способы узнать SID пользователя, группы или компьютера по имени, и обратную процедуру – получить имя объекта по известному SID.

Что такое SID объекта в Windows?

SID (security identifier) позволяет уникально идентифицировать пользователя, группу или компьютер в пределах определенной области безопасности (домена AD или локального компьютера). SID представляет собой строку в следующем формате:

S-1-5-212927053466-1818515551-28245911311103.

В данном примере:

  • 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 пользователя через WMI

Команда вернула SID указанного пользователя — S-1-5-21-1175651296-1316126944-203051354-1005 .

Если репозиторий WMI поврежден, команда вернет ошибку. Воспользуйтесь этой инструкцией для восстановления WMI репозитория.

Однако, начиная с 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

В новых версиях PowerShell Core 7.x вместо команды Get-WmiObject нужно использовать Get-CimInstance.

Или (проще) узнать SID локального пользователя с помощью встроенного PowerShell модуля управления локальными пользователями и группами (Microsoft.PowerShell.LocalAccounts)

Get-LocalUser -Name 'test_user' | Select-Object Name, SID

powershell получить sid локалього пользователя в Windows

Вывести список локальных пользователей Windows и их SID:

Get-LocalUser | Select-Object  name,sid

вывести список имени и 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

ProfileList - SID пользователей в реестре

По аналогии можно получить 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

whoami user getsid

Также можно посмотреть SID пользователя из графического интерфейса оснастки ADUC (dsa.msc) на вкладке редактора атрибутов в свойствах пользователя (свойство objectSid).

objectSID в Active Directory

Можно получить 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

get-aduser select sid

SID группы безопасности в домене AD можно получить с помощью командлета Get-ADGroup:

Get-ADGroup -Filter {Name -like "msk-admin*"} | Select SID

Get-ADGroup получить 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 - get SID via SecurityIdentifier and NTAccountЭта же команда 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

get-adcomputer команда для получения SID компьютера в домене Active Directory

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}$"

PsGetsid6 вывести machine sid локального компьютера

При клонировании компьютеров в домене (или развертывании их из шаблона), желательно сбрасывать их локальный Machine SID с помощью утилиты sysprep. Компьютеры в домене в принципе не могут иметь одинаковые доменные SID, иначе это сломает доверительные отношения между рабочей станцией и доменом.

Как узнать имя пользователя или группы по известному SID?

Другая частая ситуация, когда вам нужно узнать имя пользователя или группы по известному 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.

Get-ADObject поиск объектов в AD по известному SID

В нашем случае объект AD, который имеет данный SID, является компьютером (objectClass=computer).


Предыдущая статья Следующая статья


Комментариев: 10 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)