如何使用WMI检索Windows计算机的SID?

我不在寻找用户SID。 我正在寻找计算机SID,哪个活动目录将用来唯一标识计算机。 我也不想查询活动目录服务器,我想查询计算机本身。

(哦,这真是一个有趣的游戏!我跟着他们说,尝试获取Win32_SID实例,这是一个单例,而不是通常的InstancesOf或Query方法可以枚举的… yadda yadda yadda。)

那么,这取决于你想要哪台计算机SID(认真!)。 有本地计算机自己使用的SID …为此,您只需要获取本地管理员用户的SID,并从最后删除“-500”以获得计算机的SID。

VBScript中 ,它看起来像这样:

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中 ,像这样:

 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) 

在.NET 3.5的C#中

 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; } 

从所有这些结果匹配我从PsGetSid.exe得到的响应。


另一方面,Active Directory使用SID来标识每个域成员计算机…通过获取域中计算机帐户的SID来获取的SID – 以美元符号结尾的那个SID。

例如,对于名为“CLIENT”的域成员使用上述PowerShell函数,可以键入get-sid "CLIENT$"

您只需从Windows命令行运行reg query HKLM\SOFTWARE\Microsoft\Cryptography /v MachineGuid

这里是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% 

从微软网站找到一个工具,可以很容易地得到你的SID

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

只需下载文件,解压缩,打开命令提示符,然后运行psgetsid.exe。

对微软网站的SID也有一些很好的解释

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