У середовищі Windows кожному доменному і локальному користувачеві, групі та іншим об'єктам безпеки, присвоюється унікальний ідентифікатор - Security Identifier або SID. Саме SID, а не ім'я користувача використовується для контролю доступу до різних ресурсів: мережних папок, ключів реєстру, об'єктам файлової системи, принтерів і т.д. У цій статті ми покажемо кілька простих способів дізнатися SID користувача або групи (локальних або з Active Directory), і зворотну процедуру - Вкажіть користувача або групи Windows за відомим SID.
Для перетворення username в SID можна скористатися відмінностей утилітою з комплекту Sysinternals - PsGetSid. Але її доведеться завантажувати і встановлювати на кожен комп'ютер вручну. Приклад використання PsGetSID для SID користувача на ім'я облікового запису:psgetsid PC1 \ jjsmith
Отримання учеткі по SID:
psgetsid S-1-5-21-1175651296-1316133944-203321314-1005
На мій погляд, найпростіше для перетворення SID -> Username і Username -> SID найпростіше скористатися командами командного рядка або нескладними Командлети PowerShell:
зміст:
- Як отримати SID локального користувача?
- Дізнатися SID користувача або групи в домені AD по імені
- Як дізнатися ім'я облікового запису користувача або групи по SID?
- Пошук об'єктів в Active Directory за SID
Як отримати SID локального користувача?
Щоб отримати SID локального облікового запису на даному комп'ютері, можна скористатися утилітою wmic, яка дозволяє звернеться до простору імен WMI комп'ютера. Для отримання SID локального користувача test_user можна використовувати утиліту WMIC:
wmic useraccount where name = "test_user" get sid
Команда повернула нам SID зазначеного користувача - S-1-5-21-1175651296-1316126944-203051354-1005.
Якщо потрібно дізнатися SID поточного користувача (під яким виконується команда), використовуйте таку команду:
wmic useraccount where name = "% username%" get sid
За допомогою двох .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 користувача або групи в домені AD по імені
Ви можете дізнатися SID поточної доменної облікового запису командою:
whoami / user
Дізнатися SID доменного користувача можна за допомогою WMIC. В цьому випадку в команді потрібно вказати ім'я домену:
wmic useraccount where (name = 'jjsmith' and domain = "corp.winitpro.ru") get sid
Для отримання SID доменного користувача можна скористатися Командлети Get-ADUser, що входить до складу модуля Active Directory Module для Windows 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?
Щоб дізнатися ім'я облікового запису користувача з SID (зворотна процедура), можна скористатися однією з наступних команд:
wmic useraccount where sid = "S-1-3-12-12452343106-3544442455-30354867-1434" get name
На PowerShell отримати ім'я користувача за його SID можна за допомогою модуля AD для PowerShell:
Get-ADUser -Identity S-1-5-21-247647651-3952524288-2944781117-23711116
Щоб знайти ім'я доменної групи по відомому SID використовуйте команду:
Get-ADGroup -Identity S-1-5-21-247647651-3952524288-2944781117-23711116
Також можна дізнатися SD групу і користувача за допомогою вбудованих класів 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
Пошук об'єктів в Active Directory за SID
Якщо ви не знаєте до якого типу об'єкта AD відноситься якийсь SID і який точно командлет використовувати для його пошуку (Get-AdUser, Get-ADComputer або Get-ADGroup), ви можете використовувати універсальний метод пошуку об'єктів в Active Directory за SID за допомогою командлета Get -ADObject.
$ Sid = 'S-1-5-21-2470146651-3951111111-2989411117-11119501'
Get-ADObject -IncludeDeletedObjects -Filter "objectSid -eq '$ sid'" | Select-Object name, objectClass
SID
У нашому випадку об'єкт AD, який має даний SID, є комп'ютером (objectClass).