2010-06-28 6 views
24

Ich bin nicht auf der Suche nach User SIDs. Ich suche nach der Computer-SID, die das Active Directory verwenden würde, um den Computer eindeutig zu identifizieren. Ich möchte auch nicht den Active Directory Server abfragen, ich möchte den Computer selbst abfragen.Wie kann ich die SID eines Windows-Computers mithilfe von WMI abrufen?

+0

Hat die Computer-SID Änderung mit einer Neuinstallation von Windows? d. h. ist es Betriebssysteminstanzspezifisch oder ist es hardwarebasiert? – Cel

Antwort

38

(Ooh, das war ein lustiges! Ich ging auf eine wilde Gans Verfolgung, wie sie sagen, versuchen, die Win32_SID-Instanz, die ein Singleton ist und nicht durch die üblichen InstanzenOf oder Abfrage-Methoden aufzählbar ... yadda yadda yadda.)

Nun, es hängt davon ab, welche Computer SID Sie wollen (ernsthaft!). Es gibt die SID, die der lokale Computer für sich selbst verwendet ... Dazu müssen Sie nur die SID des lokalen Administrator-Benutzers abrufen und die "-500" vom Ende entfernen, um die SID des Computers zu erhalten.

In VBScript, sieht es wie folgt aus:

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) 

In Powershell, wie folgt aus:

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) 

In C# auf .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; 
} 

Ergebnisse von all diesen stimmen mit der Antwort überein, die ich von PsGetSid.exe erhalte.


Auf der anderen Seite gibt es den SID, die Active Directory verwendet jeden Domäne Mitgliedscomputer zu identifizieren ... Dass man sich, indem man die SID des Computerkontos in der Domäne holen - die eine, die mit Enden ein Dollarzeichen. B. die oben genannte PowerShell-Funktion für ein Domänenmitglied namens "CLIENT", können Sie get-sid "CLIENT$" eingeben.

+0

+1 Schöne Erklärung zusammen mit verschiedenen Beispielen. – Garett

+1

$ ID.Translate ([System.Security.Principal.SecurityIdentifier]) - hat bereits die Computer-SID (AccountDomainSid) zurückgegeben, würde ich vorschlagen, Get-Sid nicht versuchen, die ID in Zeichenfolge zu konvertieren, so dass der Benutzer jedes Attribut auswählen kann - In diesem Fall die AccountDomainSid. – shalomb

+0

nur eine Randnotiz der PowerShell-Version: '$ admin.SubString (0, $ admin.length() - 4)' sollte '$ admin.SubString (0, $ admin.Length - 4)' sein, um zu funktionieren .. – Luke

2

Sie können einfach reg query HKLM\SOFTWARE\Microsoft\Cryptography /v MachineGuid über die Windows-Befehlszeile ausführen.

Hier ist Windows-Batch-Datei Beispiel:

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

Dies ist nicht die gleiche Sache, diese GUID ist nicht die Maschine SID. – Anders

Verwandte Themen