كشف ما إذا كان يعمل مع امتيازات المسؤول تحت نظام التشغيل Windows XP

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

سؤال

أحاول تحديد كيفية اكتشاف ما إذا كان المستخدم يعمل مع حقوق المسؤول ضمن نظام التشغيل Windows XP. هذا سهل إلى حد ما في نظام التشغيل Vista / Win7 بفضل من أنا أمر. إليك مقتطف في Ruby لكيفية القيام بذلك تحت Vista:

ملاحظة، يتضمن الرابط التالي الآن الحل الذي اقترحه MUTEW

http://gist.github.com/65931.

المشكلة هي، 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...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top