В среде Windows каждому доменному и локальному пользователю, группе и другим объектам безопасности, присваивается уникальный идентификатор — Security Identifier или SID. Именно SID, а не имя пользователя используется для контроля доступа к различным ресурсам: сетевым каталогам, ключам реестра, объектам файловой системы
Для преобразования username в SID можно воспользоваться отличий утилитой из комплекта Sysinternals — PsGetSid. Но ее придется выкачивать и устанавливать на каждую систему вручную.
Чтобы получить 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 текущей доменной учетной записи можно командой:
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 (обратная процедура), можно воспользоваться одной из следующих команд:
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
ОС ведут учет всех локальных профилей в ветке реестра “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList” Для каждого профиля, который хранится локально, внутри этого раздела реестра создается подраздел. Имя подраздела – это SID учетной записи пользователя. Сопоставить имя пользователя и SID можно с помощью PsGetSid так, или же просто откройте любую ветку и посмотрите значение параметра ProfileImagePath. После удаления профиля, при следующем входе пользователя в системном трее появится сообщение, говорящее о том, что Windows не смогла загрузить профиль пользователя и пользователь будет работать с временным профилем. Временный профиль Windows – это профиль, который загружается при наличии проблем с нормальным профилем, и который при завершении сеанса, не сохраняется.
Для корректного удаления воспользуйтесь одним из следующих методов удаления профиля:
- Удалите каталог с профилем пользователя И соответствующую ему ветку реестра в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
- Откройте Пуск > Выполнить и наберите sysdm.cpl. Перейдите на вкладку Advanced, затем в разделе User Profiles нажмите кнопку Settings и удалите нужный (или ненужный :)) вам профиль пользователя.
Если система находит в реестре в ветке ProfileList, SID пользователя, с которым не ассоциирован ни один каталог с профилем пользователя (C:\Users\”username”), она создает резервную копию этой ветки с расширением .bak. Просто удалите эту резервную ветку.
источник оригинальная статья winitpro.ru