2010-06-28 13 views
24

Kullanıcı SID'lerini aramıyorum. Bilgisayarı benzersiz bir şekilde tanımlamak için kullanacağım bilgisayar SID'sini arıyorum. Ayrıca aktif dizin sunucusunu sorgulamak istemiyorum, bilgisayarın kendisini sorgulamak istiyorum.WMI kullanarak Windows Bilgisayarın SID'sini nasıl alabilirim?

+0

Windows'un yeni yüklemesiyle bilgisayar SID değişiyor mu? yani, sistem örneğini özel mi, yoksa donanım tabanlı mı? – Cel

cevap

38

(Ooh, bu eğlenceli bir şeydi!) Dedikleri gibi, her zamanki InstancesOf veya Query yöntemleri tarafından numaralandırılamaz bir singleton olan Win32_SID örneğini almaya çalıştıklarında, vahşi bir kaz kovalamaca gittim ... yadda vesaire vesaire.)

Eh, ciddiye (istediğiniz bilgisayar SID bağlıdır!). yerel bilgisayar kendisi için kullandığı SID var ... Bunun için, sadece yerel yönetici kullanıcı SID almak ve bilgisayarın SID'ini almak için ucundan "-500" kaldırmak gerekir.

VBScript , bu şuna benzer:

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) 

PowerShell, bu gibi:

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) 

yılında C# .NET 3.5 tarih:

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; 
} 
Bunların tümünden

Sonuçlar ben PsGetSid.exe aldığım yanıt maçı. ile biter one - Öte yandan


Active Directory her etki alanı üyesi bilgisayar tanımlamak için kullandığı SID ... Eğer etki alanında makine hesabının SID alarak getirme İşte bir tane var dolar işareti. "MÜŞTERİ" olarak adlandırılan bir alan üye için yukarıdaki PowerShell işlevini kullanarak

Ör, sen get-sid "CLIENT$" yazabilirsiniz.

+0

+1 Farklı örnekler sunmanın yanında güzel bir açıklama. – Garett

+1

$ ID.Translate ([System.Security.Principal.SecurityIdentifier]) - zaten döndürür bilgisayar sid (AccountDomainSid) vardır, ben kullanıcı herhangi niteliğini ayırt edebilmek için-Sid Get dizeye kimliği dönüştürmek denemeyin öneririm - bu durumda AccountDomainSid. PowerShell sürümüne – shalomb

+0

sadece bir yan not: '$ admin.SubString (0, $ admin.length() - 4)' '$ admin.SubString olmalıdır (0, $ admin.Length - 4)' sırayla çalışmak .. – Luke

2

Windows komut satırından reg query HKLM\SOFTWARE\Microsoft\Cryptography /v MachineGuid'u çalıştırabilirsiniz.

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

aynı şey değil, bu GUID makine SID DEĞİLDİR. – Anders

İlgili konular