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

时间:2010-06-28 14:48:55

标签: windows wmi identity dns wmi-query

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

3 个答案:

答案 0 :(得分:39)

(哦,这是一个有趣的!我正在进行疯狂的追逐,正如他们所说,试图获取Win32_SID实例,这是一个单例,而不是通常的InstancesOf或Query方法可以枚举... yadda yadda yadda。)

嗯,这取决于你想要的计算机SID(严重!)。本地计算机使用的是SID ...为此,您只需要获取本地Administrator用户的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$"

答案 1 :(得分:2)

您只需从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%

答案 2 :(得分:1)

从微软网站找到一个可以轻松获得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