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

Программное обеспечение

В среде 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 – это профиль, который загружается при наличии проблем с нормальным профилем, и который при завершении сеанса, не сохраняется.

Для корректного удаления воспользуйтесь одним из следующих методов удаления профиля:

  1. Удалите каталог с профилем пользователя И соответствующую ему ветку реестра в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
  2. Откройте Пуск > Выполнить и наберите sysdm.cpl. Перейдите на вкладку Advanced, затем в разделе User Profiles  нажмите кнопку Settings и удалите нужный (или ненужный :)) вам профиль пользователя.

Если система находит в реестре в ветке ProfileList,  SID пользователя, с которым не ассоциирован ни один каталог с профилем пользователя (C:\Users\”username”), она создает резервную копию этой ветки с расширением .bak. Просто удалите эту резервную ветку.

источник оригинальная статья winitpro.ru