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

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

Вы можете объяснить, зачем вам это нужно?

Bob King 18.09.2008 23:04

Например, у меня есть приложение, которое использует API для внешней программы, которая требует, чтобы UAC даже работал. Если UAC выключен, я хотел бы сообщить пользователю диалоговое окно.

Matthew Ruston 03.10.2008 21:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
22
2
22 088
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

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

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

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

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

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

Ответ принят как подходящий

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

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

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

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

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

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

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

Это уловка 22. Если UAC включен, скорее всего, у вас не будет прав на его чтение.

Ryan Farley 18.09.2008 23:00

Небольшое исправление: ключ реестра - HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ Syst‌ em, а EnableLUA - это значение DWORD (это не ключ). HTH

Andrei Belogortseff 18.09.2008 23:09

Вы должны использовать! = 0, а не сравнивать с 1 в соответствии с источником Google Chrome (по-видимому, некоторые системы имеют> 1 значения)

Anders 23.05.2009 02:49

@RyanFarley Похоже, ACL, унаследованный ключом, дает всем пользователям полный доступ для чтения, поэтому чтение будет проблемой только в том случае, если кто-то изменил ACL.

Richard 01.11.2011 19:12

На моей 64-битной машине с Windows 7 можно включить UAC без этого ключа. Я предполагаю, что вместо этого мой UAC включен через групповую политику. Я считаю, что то же самое и с Vista.

TomG 16.12.2013 14:22

По крайней мере, в Windows Server 2016 этот ключ всегда равен «1», когда UAC отключен.

marsh-wiggle 03.11.2020 00:59

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

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

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

Дело в том, что в самой документации 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

Другие вопросы по теме