سؤال

أحتاج أن يتصرف تطبيقي بشكل مختلف اعتمادًا على ما إذا كان Vista UAC ممكّنًا أم لا.كيف يمكن لتطبيقي اكتشاف حالة UAC على جهاز الكمبيوتر الخاص بالمستخدم؟

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

المحلول

يجب أن يخبرك مفتاح التسجيل هذا بما يلي:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

قيمة EnableLUA (DWORD)

1 ممكّن / 0 أو المفقودين المعوقين

لكن هذا يفترض أن لديك الحق في قراءته.

برمجيًا، يمكنك محاولة قراءة الرمز المميز للمستخدم وتخمين ما إذا كان مسؤولًا يعمل مع تمكين UAC (راجع هنا).ليست مضمونة، ولكنها قد تنجح.

المسألة هنا هي أكثر من مجرد "لماذا تحتاج أن تعرف" - فهي تؤثر على الإجابة.في الواقع، لا توجد واجهة برمجة تطبيقات (API) لأنه من وجهة نظر سلوك نظام التشغيل، ما يهم هو ما إذا كان المستخدم مسؤولًا أم لا - فالطريقة التي يختارون بها حماية أنفسهم كمسؤول هي مشكلتهم.

نصائح أخرى

هذا المشنور يحتوي على نموذج تعليمة برمجية في C# لاختبار ما إذا كان UAC قيد التشغيل وما إذا كان التطبيق الحالي قد تم منحه حقوقًا مرتفعة.يمكنك تنزيل الكود وتفسيره حسب الحاجة.يوجد أيضًا رابط يوضح نفس الشيء في C++

http://www.itwriting.com/blog/198-c-code-to-detect-uac-elevation-on-vista.html

لا تتم قراءة الكود الموجود في هذا المنشور من السجل فقط.إذا تم تمكين UAC، فمن المحتمل ألا يكون لديك حقوق لقراءة ذلك من السجل.

لا تريد التحقق من تمكين UAC؛هذا لا يخبرك بأي شيء.

يمكنني أن أكون مستخدمًا قياسيًا مع تعطيل UAC.

تريد التحقق إذا كان المستخدم يعمل بامتيازات إدارية باستخدام CheckTokenMembership:

///This function tells us if we're running with administrative permissions.
function IsUserAdmin: Boolean;
var
    b: BOOL;
    AdministratorsGroup: PSID;
begin
    {
        This function returns true if you are currently running with 
               admin privileges.
        In Vista and later, if you are non-elevated, this function will 
               return false (you are not running with administrative privileges).
        If you *are* running elevated, then IsUserAdmin will return 
               true, as you are running with admin privileges.

        Windows provides this similar function in Shell32.IsUserAnAdmin.
               But the function is depricated, and this code is lifted from the 
               docs for CheckTokenMembership: 
               http://msdn.microsoft.com/en-us/library/aa376389.aspx
    }

    {
        Routine Description: This routine returns TRUE if the caller's
        process is a member of the Administrators local group. Caller is NOT
        expected to be impersonating anyone and is expected to be able to
        open its own process and process token.
        Arguments: None.
        Return Value:
            TRUE - Caller has Administrators local group.
            FALSE - Caller does not have Administrators local group.
    }
    b := AllocateAndInitializeSid(
            SECURITY_NT_AUTHORITY,
            2, //2 sub-authorities
            SECURITY_BUILTIN_DOMAIN_RID,    //sub-authority 0
            DOMAIN_ALIAS_RID_ADMINS,        //sub-authority 1
            0, 0, 0, 0, 0, 0,               //sub-authorities 2-7 not passed
            AdministratorsGroup);
    if (b) then
    begin
        if not CheckTokenMembership(0, AdministratorsGroup, b) then
         b := False;
        FreeSid(AdministratorsGroup);
    end;

    Result := b;
end;

يمكنك القيام بذلك من خلال فحص قيمة DWORD تمكينLUA في مفتاح التسجيل التالي:

HKLM/البرمجيات/مايكروسوفت/ويندوز/CurrentVersion/السياسات/النظام

إذا كانت القيمة 0 (أو غير موجودة)، فسيتم إيقاف تشغيل UAC.إذا كان موجودًا وغير صفري، فهذا يعني أن UAC قيد التشغيل:

BOOL IsUacEnabled( )
{
    LPCTSTR pszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System");
    LPCTSTR pszValue = _T("EnableLUA");
    DWORD dwType = 0;
    DWORD dwValue = 0;
    DWORD dwValueSize = sizeof( DWORD );

    if ( ERROR_SUCCESS != SHGetValue( HKEY_LOCAL_MACHINE, pszSubKey, pszValueOn, 
        &dwType, &dwValue, &dwValueSize) )
    {
            return FALSE;
    }

    return dwValue != 0;
} 

لاحظ أنه إذا قام المستخدم بتغيير حالة UAC ولكن لم يقم بإعادة تشغيل الكمبيوتر بعد، فسوف تقوم هذه الوظيفة بإرجاع نتيجة غير متناسقة.

تحقق من قيمة التسجيل على HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

تحدد قيمة EnableLUA ما إذا كان UAC نشطًا.

هذا المنشور قديم إلى حد ما، لكنني أردت التعليق على الأجزاء "لماذا تحتاج إلى المعرفة" و"التحقق من العضوية المميزة".

الحقيقة هي أن وثائق Microsoft الخاصة تنص على أنه "إذا تم إيقاف تشغيل التحكم في حساب المستخدم وحاول مستخدم قياسي تنفيذ مهمة تتطلب الترقية" فيجب علينا تقديم خطأ بدلاً من إظهار الأزرار و/أو الروابط مع درع UAC الذي محاولة الارتفاع.يرى http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx نحو الأسفل للحصول على التفاصيل.

كيف نفعل ذلك بدون طريقة للتحقق من تمكين UAC؟

ربما يكون التحقق مما إذا كان المستخدم يعمل بامتيازات المسؤول هو الشيء الصحيح الذي يجب فعله في هذه الحالة، ولكن من يدري؟التوجيه الذي تقدمه Microsoft هو، في أحسن الأحوال, ، مشكوك فيه، إن لم يكن مربكًا تمامًا.

لأي شخص آخر يجد هذا ويبحث عن حل VBScript.إليك ما توصلت إليه لاكتشاف ما إذا تم تمكين UAC وإذا كان الأمر كذلك، فأعد تشغيل البرنامج النصي الخاص بي بامتيازات مرتفعة.فقط ضع الكود الخاص بك في وظيفة Body().لقد وجدت أن هناك مشكلات تتعلق بإمكانية النقل بين نظامي التشغيل XP وWindows 7 إذا قمت بكتابة تعليمات برمجية لتشغيل البرامج المرتفعة دائمًا.باستخدام هذه الطريقة، أتجاوز الارتفاع في حالة عدم وجود UAC.يجب أيضًا أن تأخذ في الاعتبار إصدارات الخادم لعام 2008 والإصدارات الأحدث التي تم تمكين UAC فيها.

On Error Resume Next
UACPath = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA"
Dim WshShell
Set WshShell = CreateObject("wscript.Shell")
UACValue = WshShell.RegRead(UACPath)
If UACValue = 1 Then
'Run Elevated
    If WScript.Arguments.length =0 Then
      Set objShell = CreateObject("Shell.Application")
      'Pass a bogus argument with leading blank space, say [ uac]
      objShell.ShellExecute "wscript.exe", Chr(34) & _
      WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 1
      WScript.Quit
    Else 
        Body()
    End If
Else
Body()
End If

Function Body()
MsgBox "This is the body of the script"
End Function

AFAIK، UAC هو إعداد سياسة للمستخدم المحلي أو المجموعة.لذا يمكنك قراءة هذه الخاصية من داخل .Net.آسف لعدم وجود مزيد من التفاصيل ولكن آمل أن يكون هذا مفيدًا

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