Подтвердить что ты не робот

Как определить, включена ли Vista UAC?

Мне нужно, чтобы мое приложение вел себя по-разному в зависимости от того, включена ли Vista UAC или нет. Как мое приложение может определить состояние UAC на компьютере пользователя?

4b9b3361

Ответ 1

Этот раздел реестра должен сообщить вам:

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

Значение EnableLUA (DWORD)

1 включено / 0 или отсутствует отключено

Но это предполагает, что у вас есть права на его чтение.

Программно вы можете попробовать прочитать токен пользователя и угадать, если он включен администратором с включенным UAC (см. здесь). Не надежный, но он может работать.

Проблема здесь скорее в том, "зачем вам нужно знать" - она ​​имеет отношение к ответу. На самом деле, нет API, потому что с точки зрения поведения ОС важно то, что пользователь является администратором или нет - как они решили защитить себя, поскольку администратор - их проблема.

Ответ 2

Этот пост содержит пример кода на С#, чтобы проверить, включен ли UAC, и если текущему приложению предоставлены повышенные права. Вы можете загрузить код и интерпретировать его по мере необходимости. Также связан образец, который показывает то же самое в С++

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

Код в этом сообщении не просто считывается из реестра. Если UAC включен, возможно, вы не имеете права читать это из реестра.

Ответ 3

Вы не хотите проверять, включен ли 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;

Ответ 4

Вы можете сделать это, изучив значение DWORD EnableLUA в следующем разделе реестра:

HKLM/SOFTWARE/Microsoft/Windows/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, но еще не перезапустил компьютер, эта функция вернет несогласованный результат.

Ответ 5

Проверьте значение реестра в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

Значение EnableLUA определяет, активен ли UAC.

Ответ 6

Этот пост довольно древний, но я хотел прокомментировать биты "зачем вам нужно знать" и "проверить членство в токене".

Дело в том, что в самой собственной документации Microsoft говорится, что "если User Account Control отключен, а пользователь Standard пытается выполнить задачу, требующую повышения", мы должны предоставить ошибку вместо того, чтобы показывать кнопки и/или ссылки с помощью UAC, который пытается подняться. Подробнее см. http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx в нижней части.

Как мы это делаем, не проверяя, включен ли UAC? ​​

Возможно, проверка того, работает ли пользователь с правами администратора, - это то, что нужно делать в этом случае, но кто знает? Руководство, которое Microsoft дает, в лучшем случае, если не просто сбивает с толку.

Ответ 7

Для тех, кто находит это и ищет решение VBScript. Вот что я нашел, чтобы определить, включен ли UAC, и, если это так, перезапустите мой script с повышенными привилегиями. Просто поместите свой код в функцию 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

Ответ 8

AFAIK, UAC - параметр apolicy для локального пользователя или группы. Таким образом, вы можете прочитать это свойство изнутри .Net. Извините за отсутствие более подробной информации, но я надеюсь, что это поможет