Как я могу получить SID компьютера с Windows с помощью WMI?

Я не ищу идентификаторы безопасности пользователей. Я ищу SID компьютера, который активный каталог будет использовать для однозначной идентификации компьютера. Я также не хочу запрашивать сервер Active Directory, я хочу запросить сам компьютер.


person Mark    schedule 28.06.2010    source источник
comment
Меняется ли SID компьютера при новой установке Windows? т.е. это конкретный экземпляр операционной системы или аппаратный?   -  person Cel    schedule 13.06.2014


Ответы (3)


(Ох, это было весело! Я пустился в погоню за дикими гусями, как говорится, пытаясь получить экземпляр 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)

В C # в .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;
}

Результаты всех этих действий совпадают с ответом, который я получаю от PsGetSid.exe.


С другой стороны, есть SID, который Active Directory использует для идентификации каждого компьютера-члена домена ... Тот, который вы получаете, получая SID учетной записи компьютера в домене - тот, который заканчивается знаком доллара.

Например, используя указанную выше функцию PowerShell для члена домена с именем «КЛИЕНТ», вы можете ввести get-sid "CLIENT$".

person ewall    schedule 28.06.2010
comment
$ ID.Translate ([System.Security.Principal.SecurityIdentifier]) - уже возвращает sid компьютера (AccountDomainSid), я бы посоветовал Get-Sid не пытаться преобразовать идентификатор в строку, чтобы пользователь мог выбрать любой атрибут - в этом случае AccountDomainSid. - person shalomb; 23.01.2014
comment
просто примечание о версии PowerShell: $admin.SubString(0, $admin.length() - 4) должно быть $admin.SubString(0, $admin.Length - 4), чтобы работать .. - person Luke; 09.04.2015
comment
+1, небольшое примечание: учетная запись администратора может быть переименована (в корпоративной среде из соображений безопасности). Чтобы найти стандартную учетную запись локального администратора по SID: (Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount = 'True' AND SID LIKE 'S-1-5-21-%-500'").Name - person iRon; 05.07.2016
comment
Есть ли способ VBScript для получения SID Active Directory рядового компьютера? - person dlh; 24.04.2020

Вы можете просто запустить reg query HKLM\SOFTWARE\Microsoft\Cryptography /v MachineGuid из командной строки Windows.

Вот пример командного файла 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%
person l0pan    schedule 10.05.2014
comment
Это не одно и то же, этот GUID НЕ является SID машины. - person Anders; 02.02.2018

Нашел инструмент с веб-сайта Microsoft, который может легко получить вам SID

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

Просто загрузите файл, разархивируйте его, откройте командную строку и запустите psgetsid.exe.

Есть хорошее объяснение SID с веб-сайта Microsoft.

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

person deadcode    schedule 09.01.2015
comment
Вторая ссылка не действует, но вот та же страница из Интернет-архива. - person dlh; 21.04.2020