كشف ما إذا كان يعمل مع امتيازات المسؤول تحت نظام التشغيل Windows XP
-
05-09-2019 - |
سؤال
أحاول تحديد كيفية اكتشاف ما إذا كان المستخدم يعمل مع حقوق المسؤول ضمن نظام التشغيل Windows XP. هذا سهل إلى حد ما في نظام التشغيل Vista / Win7 بفضل من أنا أمر. إليك مقتطف في Ruby لكيفية القيام بذلك تحت Vista:
ملاحظة، يتضمن الرابط التالي الآن الحل الذي اقترحه MUTEW
المشكلة هي، Whoami لا يأتي مع نظام التشغيل Windows XP، وبالتالي فإن الطريقة المرتبطة أعلاه ستظهر دائما خطأ على WinXP، حتى إذا كنا نركض كمسؤول.
لذا، هل يعرف أحد بأي طريقة للكشف عن ما إذا كنا نركض كمسؤول تحت نظام التشغيل Windows XP باستخدام Ruby أو أدوات سطر الأوامر أو ملفات الدفعات أو حتى طرف ثالث (يجب أن تكون مفتوحة المصدر أو حقا) الأدوات؟
المحلول
سيكتشف هذا ما إذا كان المستخدم يعمل في وضع مرتفع (مثل موجه الأوامر الذي كان "تشغيل كمسؤول"). إنه يعتمد على حقيقة أنك تحتاج إلى امتيازات المسؤولين لقراءة مفتاح حساب الخدمة المحلي:
reg query "HKU\S-1-5-19"
سيعيد ذلك رمز خطأ غير صفري إذا كان لا يمكن قراءته، والصفر إذا كان ذلك ممكنا.
يعمل من XP UP ...
نصائح أخرى
اذا ركضت
>net localgroup administrators
في قذيفة الأوامر، يجب عليك الحصول على قائمة حسابات المسؤول في نظام التشغيل Windows XP. ببساطة تحليل ومسح الإخراج للتحقق من حساب المستخدم الخاص الذي تريده. على سبيل المثال للتحقق مما إذا كان المستخدم الحالي هو المسؤول الذي يمكنك القيام به -
>net localgroup administrators | find "%USERNAME%"
خيار Piskvor غرامة، أو تحقق من عنوان URLhttp://weseetips.com/2008/04/16/how-To-Check-Wethurrent-user-have-administrator-privilege/
هذا هو الرمز في تلك الصفحة
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
// Initialize SID.
if( !AllocateAndInitializeSid( &NtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&AdministratorsGroup))
{
// Initializing SID Failed.
return false;
}
// Check whether the token is present in admin group.
BOOL IsInAdminGroup = FALSE;
if( !CheckTokenMembership( NULL,
AdministratorsGroup,
&IsInAdminGroup ))
{
// Error occurred.
IsInAdminGroup = FALSE;
}
// Free SID and return.
FreeSid(AdministratorsGroup);
return IsInAdminGroup;
تفحص ال ChecktokenMembership. طريقة. هناك عينة من التنفيذ ISUSERADMIN () بالإضافة إلى بعض ملاحظات المجتمع المفيدة الأخرى عند هذه الوظيفة لا ترجع ما هو متوقع وما يجب القيام به لتحسينه.
هذا سوف يكتشف دون قصف:
require 'win32/registry'
is_admin = false
begin
Win32::Registry::HKEY_USERS.open('S-1-5-19') {|reg| }
is_admin = true
rescue
end
الاستراتيجية مشابهة لشركة بيتر، ولكن مع مرفقات أقل.
فيما يلي طريقة أفضل (PowerShell) للقيام بذلك: https://stackoverflow.com/a/16617861/863980.
في سطر واحد، يمكنك القول (نسخ / لصق في Posh وسيعمل):
(@(([ADSI]"WinNT://./Administrators,group").psbase.Invoke("Members")) | `
foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -contains "Administrator"
=> عودة True
عندما ينتمي المستخدم إلى مجموعة المسؤولين (بدلا من التحقق من المستخدم هو المسؤول)
(ملاحظة: تؤدي Backtick أو Grev Infent `إرجاع النقل في PowerShell، في Ruby، تنفذ أوامر Shell، مثل نظام C ++ (الأمر") ..)
لذلك في Ruby، يمكنك القول (نسخ / لصق في IRB):
def is_current_user_local_admin?
return `powershell "(@(([ADSI]'WinNT://./Administrators,group').psbase.Invoke('Members')) | foreach {$_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)}) -contains 'Administrator'"`.include? "True"
end
لا تعرف طريقة WMI (أفضل) للقيام بذلك. مع ذلك، هل يمكن أن تفعل شيئا مثل (في Ruby مرة أخرى):
require 'win32ole'
wmi = WIN32OLE.connect('WinNT://./Administrators,group')
# don't know what should come here...