2010-06-28 12 views
24

Nie szukam identyfikatorów SID użytkowników. Szukam identyfikatora SID komputera, który katalog aktywny użyje do jednoznacznej identyfikacji komputera. Nie chcę również wysyłać zapytania do aktywnego serwera katalogów, chcę zapytać sam komputer.Jak mogę odzyskać identyfikator SID komputera z systemem Windows za pomocą usługi WMI?

+0

Czy komputer zmianę SID z nowej instalacji Windows? np. czy dotyczy to konkretnej instancji systemu operacyjnego, czy jest to sprzętowe? – Cel

Odpowiedz

38

(Ooo, to było zabawne!) Poszedłem na dziką pogoń gęsi, jak to mówią, próbując pobrać wystąpienie Win32_SID, które jest singletonem i nie można go wyliczyć za pomocą zwykłych metod InstancesOf lub Query ... yadda yadda yadda.)

Cóż, to zależy od tego, który komputer SID chcesz (poważnie!). Jest identyfikator SID, którego komputer lokalny używa sam ... W tym celu wystarczy uzyskać identyfikator SID lokalnego administratora i usunąć "-500" od końca, aby uzyskać identyfikator SID komputera.

W VBScript, wygląda to tak:

strComputer = "AFAPC001" 
strUsername = "Administrator" 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set objAccount = objWMIService.Get("Win32_UserAccount.Name='" & strUsername & "',Domain='" & strComputer & "'") 
WScript.Echo "Administrator account SID: " & objAccount.SID 
WScript.Echo "Computer's SID: " & Left(objAccount.SID, Len(objAccount.SID) - 4) 

W PowerShell, tak:

function get-sid 
{ 
    Param ($DSIdentity) 
    $ID = new-object System.Security.Principal.NTAccount($DSIdentity) 
    return $ID.Translate([System.Security.Principal.SecurityIdentifier]).toString() 
} 
> $admin = get-sid "Administrator" 
> $admin.SubString(0, $admin.Length - 4) 

W C# na .NET 3.5:

using System; 
using System.Security.Principal; 
using System.DirectoryServices; 
using System.Linq; 
public static SecurityIdentifier GetComputerSid() 
{ 
    return new SecurityIdentifier((byte[])new DirectoryEntry(string.Format("WinNT://{0},Computer", Environment.MachineName)).Children.Cast<DirectoryEntry>().First().InvokeGet("objectSID"), 0).AccountDomainSid; 
} 

Wyniki wszystkich z nich odpowiadają odpowiedzi otrzymanej z PsGetSid.exe.


Z drugiej strony, nie jest SID, że Active Directory wykorzystuje do identyfikacji każdego komputera członkiem domeny ... To jeden pan sprowadzić dostając SID konta komputera w domenie - ten, który kończy znak dolara.

Np. Korzystając z powyższej funkcji PowerShell dla członka domeny o nazwie "KLIENT", można wpisać get-sid "CLIENT$".

+0

+1 Niezłe wyjaśnienie wraz z podaniem różnych przykładów. – Garett

+1

$ ID.Translate ([System.Security.Principal.SecurityIdentifier]) - już zwrócił sid komputera (AccountDomainSid), sugeruję, aby Get-Sid nie próbował przekonwertować Id na ciąg, aby użytkownik mógł wybrać dowolny atrybut - w tym przypadku AccountDomainSid. – shalomb

+0

tylko notatkę dodatkową w wersji PowerShell: '$ admin.SubString (0, $ admin.length() - 4)' powinno być '$ admin.SubString (0, $ admin.Length - 4)' w celu pracy .. – Luke

2

Możesz po prostu uruchomić reg query HKLM\SOFTWARE\Microsoft\Cryptography /v MachineGuid z wiersza poleceń systemu Windows.

Oto przykładowy plik wsadowy Windows:

set KEY_REGKEY=HKLM\SOFTWARE\Microsoft\Cryptography 
set KEY_REGVAL=MachineGuid 

REM Check for presence of key first. 
reg query %KEY_REGKEY% /v %KEY_REGVAL% 2>nul || (echo No theme name present! & exit /b 1) 

REM query the value. pipe it through findstr in order to find the matching line that has the value. only grab token 3 and the remainder of the line. %%b is what we are interested in here. 
set KEY_NAME= 
for /f "tokens=2,*" %%a in ('reg query %KEY_REGKEY% /v %KEY_REGVAL% ^| findstr %KEY_REGVAL%') do (
    set KEY_NAME=%%b 
) 
echo %KEY_NAME% 
+0

To jest nie to samo, ten identyfikator GUID NIE jest identyfikatorem SID urządzenia. – Anders

Powiązane problemy