Вот мое предложение: два способа получения SID на локальном компьютере XP и Win7. Добавлено имя пользователя из разных источников для проверки.
Как работает сценарий: основная идея возникает из познания, которое:
№ 1 Улей профиля пользователя (HKEY_CURRENT_USER
, сокр. HKCU
) монтируется в реестр после входа пользователя в систему, а HKCU
является псевдонимом (псевдонимом) только для раздела реестра HKEY_USERS\<SID>
, где <SID>
сокращает идентификатор безопасности (SID) для учетной записи пользователя.
№ 2 Можно увидеть список всех кустов реестра, которые в настоящее время смонтированы под любым именем, в качестве значений в следующем разделе реестра. Здесь значение name устанавливает внутренний путь к реестру (и содержит <SID>
для подпути в HKEY_USERS
), а значение data - это путь к вспомогательному файлу (файлам) куста (а вспомогательный файл текущего пользователя всегда ntuser.dat
):HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist
№ 3 Соответствие имени пользователя и <SID>
можно найти в WMIC
.
№ 3а. (Честно говоря, есть и раздел реестра, но этот ключ пока отсутствует в сценарии: предполагается, что это ToDo)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
Краткое описание процедуры: сценарий ищет совпадения среди трех источников, упомянутых выше в аксиомах № 1 и № 3, всегда с элементами в ключе hivelist
(ср. № 2)
Как выглядит вывод скрипта и соответствуют критериям
Глава 0 .HKLM ...\Winlogon по умолчанию. Нет поиска. Выводит только переменную среды %USERNAME%
и некоторые пользовательские значения из следующего раздела реестра:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
Глава 1 . wmic SID => HKLM ...\hivelist. Ищет каждый SID из запроса WMIC
(# 3) на совпадение в имени значения # 2.
Глава 2 .HKU SID => HKLM ...\hivelist. Ищет каждый SID из HKEY_USERS\<SID>
(# 1) на совпадение в имени значения # 2. Дает ложное положительное совпадение для <SID>_Classes
Глава 3 .% USERNAME% => HKLM ...\hivelist. Ищет %USERNAME%
для совпадения в данных значения # 2. Может быть обновлено для поиска каждого имени пользователя # 3, но сопоставление по SID считается более надежным.
Глава 4 .ProfileList SID => HKLM ...\hivelist (ToDo): Ищет каждый SID из раздела реестра ProfileList
(# 3a) на совпадение в имени значения # 2.
@ECHO OFF >NUL
@rem SETLOCAL enableextensions enabledelayedexpansion
@echo .
@echo . HKLM^\...^\Winlogon defaults:
@echo .
@echo UserName "%USERNAME%" ^(environment^)
call :regquery DefaultUserName " "
call :regquery DefaultDomainName " "
call :regquery AltDefaultUserName ""
call :regquery AltDefaultDomainName " "
@echo .
@echo . wmic SID =^> HKLM^\...^\hivelist:
@echo .
@echo user "%USERNAME%" ^(environment^)
@wmic USERACCOUNT GET name, sid >getvmic.txt
if EXIST getvmic.txt (
for /F "tokens=1,2" %%G in ('type getvmic.txt') do (
for /F "tokens=1,2*" %%K in ('reg query ^"HKLM^\SYSTEM^\CurrentControlSet^\Control^\hivelist^" /v ^\REGISTRY^\USER^\%%H 2^>NUL ^| FIND /I "%%H"') do (
if "%%M"=="" (
@echo OFF >NUL
) else (
for /F "tokens=4* delims=^\" %%P in ("%%M") do (
@echo user "%%G" ^(wmic^)
@echo user "%%P" ^(hivelist^)
@echo SID "%%H" ^(wmic^)
for /F "tokens=3* delims=^\" %%S in ( "%%K") do @echo SID "%%S" ^(hivelist^)
) )
for /F "tokens=1,2* delims=^\" %%P in ('reg query ^"HKU^" 2^>NUL ^| FIND /I "%%H"') do (
If /I "%%Q"=="%%H" @echo SID "%%Q" ^(HKU^)
) ) ) )
@echo .
@echo . HKU SID =^> HKLM^\...^\hivelist:
@echo .
for /F "tokens=1,2* delims=^\" %%G in ('reg query ^"HKU^" 2^>NUL') do (
for /F "tokens=1,2*" %%K in ('reg query ^"HKLM^\SYSTEM^\CurrentControlSet^\Control^\hivelist^" /v ^\REGISTRY^\USER^\%%H 2^>NUL ^| FIND /I "%%H"') do (
if "%%M"=="" (
@echo OFF >NUL
) else (
for /F "tokens=4* delims=^\" %%P in ("%%M") do (
if "%%P"=="%USERNAME%" (
@echo user "%USERNAME%" ^(environment^)
@echo user "%%P" ^(hivelist^)
if EXIST getvmic.txt (
for /F "tokens=1,2" %%W in ('type getvmic.txt ^| FIND /I "%%P"') do (
@echo user "%%W" ^(wmic^)
if "%%X"=="%%H" @echo SID "%%X" ^(wmic^)
) )
@echo SID "%%H" ^(HKU^)
for /F "tokens=3* delims=^\" %%S in ( "%%K") do @echo SID "%%S" ^(hivelist^)
) ) ) ) )
@echo .
@echo . %%USERNAME%% =^> HKLM^\...^\hivelist:
@echo .
@echo user "%USERNAME%" ^(environment^)
for /F "tokens=*" %%K in ('reg query ^"HKLM^\SYSTEM^\CurrentControlSet^\Control^\hivelist^" 2^>NUL ^| FIND /I "%USERNAME%" ^| FIND /I "ntuser.dat"') do (
for /F "tokens=1,3,7 delims=^\" %%L in ("%%K") do (
@echo user "%%N" ^(hivelist^)
for /F %%S in ("%%M") do (
for /F "tokens=1,2* delims=^\" %%T in ('reg query ^"HKU^" 2^>NUL ^| FIND /I "%%S"') do (
if /I "%%S"=="%%U" (
if EXIST getvmic.txt (
for /F "tokens=1,2" %%W in ('type getvmic.txt ^| FIND /I "%%U"') do (
@echo user "%%W" ^(wmic^)
@echo SID "%%X" ^(wmic^)
) )
@echo SID "%%U" ^(HKU^)
) )
@echo SID "%%S" ^(hivelist^)
) ) )
goto :eof
:regquery
for /F "tokens=1,3*" %%S in ('reg query ^"HKLM^\SOFTWARE^\Microsoft^\Windows NT^\CurrentVersion^\Winlogon^" /v %1 2^>NUL ^| FIND /I "%1"') do (
@echo %%S %~2 "%%T" ^(Winlogon^)
)
exit /B
Надежда может быть полезной, хотя я не знаю, под какими учетными данными пользователя работает psexec
.