Как я могу получить SID компьютера Windows с помощью WMI? - PullRequest
25 голосов
/ 28 июня 2010

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

Ответы [ 3 ]

39 голосов
/ 28 июня 2010

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

Ну, это зависит от того, какой 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 для члена домена с именем "CLIENT", вы можете набрать get-sid "CLIENT$".

2 голосов
/ 10 мая 2014

Вы можете просто запустить 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%
1 голос
/ 09 января 2015

На веб-сайте Microsoft обнаружен инструмент, с помощью которого можно легко получить идентификатор безопасности

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

...