كيف يمكنني استرداد SID جهاز كمبيوتر Windows باستخدام WMI؟

StackOverflow https://stackoverflow.com/questions/3133399

سؤال

أنا لا أبحث عن SIDs المستخدم. أنا أبحث عن الكمبيوتر SID ، الذي سيستخدمه Active Directory لتحديد الكمبيوتر بشكل فريد. أنا أيضًا لا أريد الاستعلام عن خادم Active Directory ، أريد الاستعلام عن الكمبيوتر نفسه.

هل كانت مفيدة؟

المحلول

(أوه ، كان هذا ممتعًا! ذهبت في مطاردة أوزة برية ، كما يقولون ، في محاولة للحصول على مثيل Win32_SID ، وهو المفرد وليس التعبير عن طريق الحالات المعتادة أو أساليب الاستعلام ... Yadda Yadda.)

حسنًا ، يعتمد ذلك على الكمبيوتر الذي تريده (على محمل الجد!). هناك 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)

في ج# على .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$".

نصائح أخرى

يمكنك ببساطة الجري 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-momain-sids.aspx

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top