كيف يمكنني استرداد SID جهاز كمبيوتر Windows باستخدام WMI؟
سؤال
أنا لا أبحث عن 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