Як дізнатися SID користувача.
Операційна система Windows для ідентифікації використовує спеціальний ідентифікатор безпеки (Security Identifier, SID), який присвоюється кожного облікового запису користувача (а також комп'ютера або групи) при її створенні. На відміну від імені кожен SID унікальний, що дозволяє системі однозначно ідентифікувати користувача.Тому операційна система оперує саме SID-ами і використовує їх для контролю доступу до різних ресурсів - принтерів, файлів і папок і т.п.
Примітка. Говорячи про унікальність SID, треба зробити одне застереження. У Windows існують так звані вбудовані (BuiltIn) облікові записи, такі як Administrator або Guest.SID-и цих записів однакові в кожному примірнику Windows незалежно від версії ОС. Це дає адміністратору можливість більш-менш централізовано керувати доступом при відсутності доменної структури.
SID для локальних облікових записів зберігатися базі даних диспетчера облікових записів (Security Account Manager, SAM) на локальному комп'ютері, для доменних - в базі Active Directory.І сьогодні мова піде про те, як можна дізнатися SID користувача по його імені і навпаки, як з'ясувати ім'я користувача за його SID.
Whoami
Коли потрібно подивитися SID поточного користувача, то простіше всього скористатися утилітою whoami. Для цього треба відкрити консоль cmd і виконати команду:
whoami/user
WMIC
В тому випадку, коли необхідно дізнатися SID довільного користувача, можна скористатися Windows Management Instrumentation (WMI).Один з інструментів для роботи з WMI - утиліта WMIC. Так наприклад, дізнатися SID користувача Kirill можна такою командою:
wmic useraccount where name = 'Kirill' get sid
А можна і навпаки, з'ясувати ім'я користувача за його SID:
wmic useraccount where sid = 'S-1-5-21-4178654016-3479515840-607560339-1000' get name
Додатково в WMI-запиті можна вказати ім'я комп'ютера (для локального) або домену (для доменного користувача).Наприклад ця команда виведе SID локального адміністратора:
wmic useraccount where (name = 'administrator' and domain = '% computername%') get sid
а ця - доменного:
wmic useraccount where (name = 'administrator' and domain = 'contoso') get sid
Для звичайного користувача все також, дізнаємося SID по імені:
wmic useraccount where (name = 'kirill' and domain = 'contoso') get sid
і ім'я по SID:
wmic useraccount where (sid = 'S-1-5-21-2404695605-4156858507-746700462-1001' and domain = 'contoso') get name
Примітка.У запиті замість імені комп'ютера \ домену можна використовувати змінні% computername% і% userdomain%.
PowerShell і WMI
PowerShell також дозволяє працювати з WMI. Для прикладу звернемося до класу win32_userAccount і виведемо SID доменного:
([wmi] "win32_userAccount.Domain = 'contoso', Name = 'Kirill'"). Sid
і локального користувача :
([wmi] "win32_userAccount.Domain = 'wks1', Name = 'Petya' "). Sid
Також замість імені комп'ютера та домену можна вказувати змінні оточення $ env: computername і $ env: userdomain, наприклад:
([wmi] "win32_userAccount.Domain = $ env: computername, Name = 'Petya'"). sid
Для зворотної операції (дізнатися ім'я користувача по SID) нам буде потрібно використовувати властивість SID класу win32_SID.Наприклад:
[wmi] "win32_SID.SID = 'S-1-5-21-4178654016-3479515840-607560339-1002'"). AccountName
Як варіант, для роботи з WMI можна використовувати командлет Get-WmiObject (або Get-CimInstance). Наприклад так ми дізнаємося SID користувача:
(Get-WmiObject -Class win32_userAccount -Filter "name = 'Kirill' and domain = 'Contoso'"). SID
а так його ім'я:
(Get-WmiObject -Class win32_userAccount -Filter "SID = 'S-1 5-21-2404695905-416858507-746700462-1001 ' ").Name
PowerShell і .NET
Також дізнатися SID користувача можна за допомогою .NET класу System.Security .Principal.NTAccount. Цей клас використовується для представлення користувача або групи. Для отримання SID локального користувача треба створити новий об'єкт цього класу і передати йому у вигляді параметра ім'я користувача, а потім за допомогою методу Translate перевести об'єкт користувача в об'єкт класу System.Security.Principal.SecurityIdentifier, який призначений для подання SID користувача або групи:
$ User = New-Object System.Security.Principal.NTAccount ( "Kirill")
$ SID = $ User. Translate ([System.Security.Principal.SecurityIdentifier])
$ SID.Value
Для доменного користувача процедура ідентична, тільки у вигляді параметра передаються ім'я користувача і ім'я домену:
$ User = New-Object System.Security.Principal.NTAccount ( "Contoso", "Kirill")
$ SID = $ User.Translate ([System.Security.Principal.SecurityIdentifier])
$ SID.Value
Для зворотної процедури отримання імені по SID робимо навпаки - спочатку створюємо об'єкт класу System.Security.Principal.SecurityIdentifier і передаємо йому у вигляді параметра SID користувача, а потім переводимо його в об'єкт класу System.Security.Principal.NTAccount і виводимо властивість Value, що містить ім'я користувача:
$ SID = New-Object System.Security.Principal.NTAccount ( "S-1-5-21-4178654016-3479515840-607560339- 1000 ")
$ User = $ SID.Translate ([System.Security.Principal.NTAccount])
$ User.Value
PsGetSid
Як бачите, вбудованих засобів для з'ясування SID в Windows предостатньо, але для повноти картини візьмемо ще одне, розроблений третьою особою.
PsGetSid - утиліта командного рядка від Sysinternals, що входить до складу пакету PsTools. PsGetSid вміє отримувати SID користувача по його імені і навпаки, працює як з локальними, так і з доменними акаунтами. Утиліта не вимагає установки, її достатньо скопіювати на потрібний комп'ютер і запустити.
Для прикладу запитаємо SID користувача по його імені:
psgetsid wks10 \ Kirill
і навпаки, з'ясуємо ім'я по SID:
psgetsid S-1-5-21-438167859-634674341-1098546566-1001