2010-06-28 28 views
24

Tôi không tìm kiếm User SID. Tôi đang tìm SID máy tính, thư mục hoạt động sẽ sử dụng để nhận dạng duy nhất máy tính. Tôi cũng không muốn truy vấn máy chủ thư mục hoạt động, tôi muốn truy vấn chính máy tính.Làm cách nào để truy xuất SID của Windows Computer bằng WMI?

+0

Liệu sự thay đổi SID máy tính với một cài đặt mới của Windows? tức là nó là hệ điều hành cụ thể, hoặc là nó dựa trên phần cứng? – Cel

Trả lời

38

(Ooh, đây là một niềm vui! Tôi đã đi trên một ngỗng hoang dã đuổi theo, như họ nói, cố gắng để có được ví dụ Win32_SID, mà là một singleton và không enumerable bởi InstancesOf bình thường hoặc phương pháp truy vấn ... yadda yadda yadda.)

Vâng, nó phụ thuộc vào SID máy tính nào bạn muốn (nghiêm túc!). Có SID mà máy tính cục bộ sử dụng cho chính nó ... Đối với điều này, bạn chỉ cần lấy SID của người dùng Administrator cục bộ và loại bỏ "-500" từ đầu để lấy SID của máy tính.

Trong VBScript, nó trông như thế này:

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) 

Trong PowerShell, như thế này:

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) 

Trong C# trên .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; 
} 

Kết quả từ tất cả những điều này khớp với câu trả lời tôi nhận được từ PsGetSid.exe.


Mặt khác, có SID rằng Active Directory sử dụng để xác định mỗi máy tính thành viên miền ... Đó là một trong những bạn lấy bằng cách SID của tài khoản máy trong lĩnh vực - một trong đó kết thúc với một ký hiệu đô la.

Ví dụ: bằng cách sử dụng chức năng PowerShell ở trên cho thành viên tên miền "CLIENT", bạn có thể nhập get-sid "CLIENT$".

+0

+1 Giải thích tuyệt vời cùng với việc cung cấp các ví dụ khác nhau. – Garett

+1

$ ID.Translate ([System.Security.Principal.SecurityIdentifier]) - đã trả về sid máy tính (AccountDomainSid), tôi đề nghị Get-Sid không cố chuyển đổi Id thành chuỗi để người dùng có thể chọn bất kỳ thuộc tính nào - trong trường hợp này là AccountDomainSid. – shalomb

+0

chỉ là một lưu ý phụ trên phiên bản PowerShell: '$ admin.SubString (0, $ admin.length() - 4)' nên là '$ admin.SubString (0, $ admin.Length - 4)' để làm việc .. – Luke

2

Bạn chỉ cần chạy reg query HKLM\SOFTWARE\Microsoft\Cryptography /v MachineGuid từ dòng lệnh của Windows.

Dưới đây là Windows batch file ví dụ:

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

Đây là không giống nhau, GUID này KHÔNG phải là SID máy. – Anders

1

Tìm thấy một công cụ từ trang web của microsoft mà có thể giúp bạn có được SID dễ dàng

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

Chỉ cần tải về tập tin, giải nén nó, mở một dấu nhắc lệnh và sau đó chạy psgetsid.exe.

Có một số lời giải thích tốt về SID từ trang web của microsoft cũng

http://blogs.msdn.com/b/aaron_margosis/archive/2009/11/05/machine-sids-and-domain-sids.aspx

Các vấn đề liên quan