среда, 27 июля 2016 г.

Как узнать SID пользователя по имени и наоборот

[ В линухе-то всё просто, можно спросить
rpcclient -U user -W domain server -c "lookupsids S-..."
а вот в родной как бы винде надо поизгаляться.. ]

В среде Windows каждому доменному и локальному пользователю, группе и другим объектам безопасности, присваивается уникальный идентификатор — Security Identifier или SID.  Именно SID, а не имя пользователя используется для контроля доступа к различным ресурсам: сетевым каталогам, ключам реестра, объектам файловой системы и т.д. В этой статье мы покажем несколько простых способов узнать SID пользователя и обратной процедуры – определения имени пользователя Windows по его SID.



Для преобразования username в SID можно воспользоваться отличий утилитой из комплекта Sysinternals — PsGetSid. Но ее придется выкачивать и устанавливать на каждую систему вручную.

Гораздо проще воспользоваться утилитой командной строки или скриптом Powershell.

Получить SID локального пользователя

Чтобы получить SID локальной учетной записи на данной машине, можно воспользоваться утилитой wmic, обращающейся к WMI хранилищу. Для локального пользователя test_user команда будет такой:
wmic useraccount where name='test_user' get sid


Если нужно узнать SID текущего пользователя, выполните такую команду:
wmic useraccount where name='%username%' get sid
На PowerShell скрипт, выдающий тот же результат можно реализовать с помощью двух классов SecurityIdentifier и NTAccount.
$objUser = New-Object System.Security.Principal.NTAccount("LOCAL_USER_NAME")
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
$strSID.Value

Получить SID доменного пользователя

Узнать SID текущей доменной учетной записи можно командой:
whoami /user

Для получения SID доменного пользователя можно воспользоваться командлетом Get-ADUser, входящего в состав модуля Active Directory Module для Windows PowerShell.
Get-ADUser -Identity 'jjsmith' | select SID

Если модуль AD для PowerShell отсутствует, через Powershell можно запросить данные из домена так:
$objUser = New-Object System.Security.Principal.NTAccount("corp.wintpro.ru","jjsmith")
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
$strSID.Value


Эта же команда в одну строку:
(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 при помощи модуля AD для Powershell:
Get-ADUser -Identity S-1-5-21-247647651-3952524288-2944781117-23711116

Или так:
$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-21-2470456651-3958312488-29145117-23345716")
$objUser = $objSID.Translate([System.Security.Principal.NTAccount])
$objUser.Value


источник