Намиране на SID на потребител в Windows (и обратно)

Понякога се налага да се открие SID-а (Security Identifier) на даден потребител. Съществуват различни начини като някой изискват да се ползват “външни” или специални инструменти. Най-простия вариант е да се използват вградените в Windows средства за откриване на SID-а. С помоща на WMI инструментариума през команден ред (WMIC) може да се разкрие тази информация по следния начин (пример за локалния акаунт Administrator):

wmic useraccount where name='Administrator' get name,sid

или

wmic useraccount where (name='Administrator' and domain='%computername%') get name,sid

Ако компютъра е част от домейн, командата може да се използва по следния начин за да се открият SID-ове на потребители от домейна:

wmic useraccount where (name='Administrator' and domain='%userdomain%') get name,sid

където променливата %userdomain% сочи името на домейна. Ако искате да изпъ;ните командата към отдалечен компютър може да се напрви така:

wmic /node:127.0.0.1 useraccount where name='Administrator' get name,sid

където вместо 127.0.0.1 пишете името или IP адреса на машината към която искате да се изпълни заявката.

Обратното преобразуване, от SID в име, може да се направи по следния начин (пример):

wmic useraccount where sid='S-1-5-21-766667225-3723723333-456456123-500' get name

За самите SID номера има “стандартизация”, но номерата им са уникални за всяка инсталация. Винаги обаче, началото и края са известни и константа.

Ето малък VBS скрипт който намира локалния администратор на системата дори и той да е преименуван:

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colAccounts = objWMIService.ExecQuery("Select * From Win32_UserAccount Where LocalAccount = TRUE")

For Each objAccount in colAccounts
    If Left (objAccount.SID, 6) = "S-1-5-" and Right(objAccount.SID, 4) = "-500" Then
        Wscript.Echo objAccount.Name
    End If
Next

Ако компютъра е част от домейн тогава скрипта се променя малко:

strComputer = "компютър"

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colAccounts = objWMIService.ExecQuery("Select * From Win32_UserAccount Where Domain = '" & strComputer & "'")

For Each objAccount in colAccounts
    If Left (objAccount.SID, 6) = "S-1-5-" and Right(objAccount.SID, 4) = "-500" Then
        Wscript.Echo objAccount.Name
    End If
Next

По същия начин, чрез използване на WMI методи може да се ползва скрипт на PowerShell или други езици за програмиране.

Тази техника може да се използва за намиране на Domain Admins, Enterprise Admins и т.н. в домейн среда. Повече информация за добре известните SID-ове се намира в линковете приложени най-долу.

Други програмки който могат да се ползват за намиране на SID-ове са:

В Registry-то на Windows също се пази информация за потребителите който са били създавани някога. Информация за техните SID-ове може да се открие по различни начини. Ето елементарен пример:

reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" | find "ProfileList"

Източници и допълнителна индормация:

http://www.windows-commandline.com/get-sid-of-user/

https://technet.microsoft.com/en-us/sysinternals/bb897417.aspx

http://blogs.msdn.com/b/gaurav/archive/2014/06/03/get-sid-of-the-object-registry-wmic-powershell.aspx

http://evgenii.rudnyi.ru/programming.html#sid2user

http://securityoverride.org/infusions/pro_download_panel/file.php?did=24&file_id=24

http://www.windowsecurity.com/whitepapers/windows_security/Windows-Enumeration-USER2SID-SID2USER.html

https://msdn.microsoft.com/en-us/library/cc980032.aspx

https://support.microsoft.com/en-us/kb/243330

https://msdn.microsoft.com/en-us/library/windows/desktop/aa379649%28v=vs.85%29.aspx

http://www.windowsecurity.com/articles-tutorials/windows_server_2008_security/Well-Known-SIDs-Windows-Server-2008-R2-Active-Directory.html

https://en.wikipedia.org/wiki/Security_Identifier

Advertisements