Сервісний центр VPSGroup ремонт комп'ютерної техніки, заправка картриджів, ремонт оргтехніки, Київ, Виставковий центр, Васильківська, 55

Як дізнатися 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



.