Я не ищу идентификаторы безопасности пользователей. Я ищу SID компьютера, который активный каталог будет использовать для однозначной идентификации компьютера. Я также не хочу запрашивать сервер Active Directory, я хочу запросить сам компьютер.
Как я могу получить SID компьютера с Windows с помощью WMI?
Ответы (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$"
.
$admin.SubString(0, $admin.length() - 4)
должно быть $admin.SubString(0, $admin.Length - 4)
, чтобы работать ..
- person Luke; 09.04.2015
(Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount = 'True' AND SID LIKE 'S-1-5-21-%-500'").Name
- person iRon; 05.07.2016
Вы можете просто запустить 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%
Нашел инструмент с веб-сайта 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