Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

(О, это было весело!) Я отправился в дикую гусиную погоню, как говорится, пытаясь получить экземпляр Win32_SID, который является одноэлементным и не перечислимым обычными методами InstancesOf или Query... yadda yadda ядд.)

Ну, это зависит от того, какой компьютер SID вы хотите (серьезно!). Там SID, который использует локальный компьютер для себя... Для этого вам просто нужно получить SID локального пользователя Administrator и удалить "-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 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:

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$".

Ответ 2

Вы можете просто запустить 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%

Ответ 3

Найден инструмент с веб-сайта 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