Как определить, включена ли Vista UAC? - PullRequest
22 голосов
/ 18 сентября 2008

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

Ответы [ 8 ]

18 голосов
/ 18 сентября 2008

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

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

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

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

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

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

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

4 голосов
/ 24 мая 2011

Вы не хотите проверять, включен ли 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 голосов
/ 18 сентября 2008

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

.

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

Код в этом посте не просто читается из реестра. Если UAC включен, скорее всего, у вас нет прав на чтение этого из реестра.

3 голосов
/ 18 сентября 2008

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

HKLM / SOFTWARE / Microsoft / Windows / CurrentVersion / Политика / System

Если значение равно 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, но еще не перезагружал компьютер, эта функция выдаст противоречивый результат.

2 голосов
/ 18 сентября 2008

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

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

1 голос
/ 15 февраля 2013

Для всех, кто находит это и ищет решение 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
1 голос
/ 03 октября 2012

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

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

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

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

0 голосов
/ 18 сентября 2008

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

...