Как определить, включен ли пользовательский интерфейс Vista?

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

  •  01-07-2019
  •  | 
  •  

Вопрос

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

HKLM/ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ/Microsoft/Windows/Текущая версия/Политики/Система

Если значение равно 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 shield, которые пытаются повысить права.Видишь 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