UAC и шаблон подсказки высот - PullRequest
8 голосов
/ 26 июня 2010

Я прочитал несколько вопросов, касающихся UAC и повышения привилегий, но я не нашел удовлетворительного / исчерпывающего ответа.

У меня есть такой сценарий: в Windows 6 или выше, когда пользователь открывает окно конфигурацииЯ должен показать экран (BCM_SETSHIELD) на кнопке ОК только , если для выполнения задачи потребуется повышение привилегий.- Я знаю, что в пользовательском интерфейсе Windows экран всегда визуализируется для «административных задач», даже если UAC отключен, но у клиента был этот конкретный запрос.

У меня есть черновик этого условия, чтобы показать значок:

  1. Пользователь имеет не права администратора
    ИЛИ
  2. Текущий процесс имеетTOKEN_ELEVATION_TYPE == TokenElevationTypeLimited

Условие № 1 простое: если у пользователя нет прав администратора, всегда требуется повышение прав независимо от UAC.№ 2 подразумевает, что у пользователя есть права администратора, а любое другое значение TOKEN_ELEVATION_TYPE означает, что повышение прав не требуется.

Неужели это так просто?Я что-то упустил?И - есть ли задокументированный или хорошо известный шаблон по этой теме?

Ответы [ 2 ]

3 голосов
/ 26 июня 2010

Вы правы. Большинство людей просто надевают экран, если кнопка будет работать с повышенными правами, но правильнее всего включить экран, если кнопка вызовет повышение (то есть подавить его, если вы уже подняты, поскольку все, что вы запускаете, останется поднятым если только у вас не возникнут проблемы с запуском процесса без повышенных прав и подавлением его, если UAC выключен.)

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

2 голосов
/ 19 августа 2015

Я вижу, что в этой теме много путаницы, и ответ от Кейт здесь не является правильным и неполным.

Начиная с Vista, администратор может войти в систему, но его процессы не запускаются с повышенными правами. У администратора есть так называемый «Split Token». Это означает, что могут быть процессы, запущенные для одного и того же пользователя-администратора, и некоторые из них работают с повышенными правами, а другие НЕ работают с повышенными правами. Когда администратор запускает процесс без повышенных прав, некоторые привилегии его токена были удалены. Это больше не так, как в XP, где ВСЕ процессы работают с повышенными или не повышенными.

Установите Process Explorer с www.sysinternals.com и включите столбец «Уровень целостности». Если вы видите «Средний», этот процесс не выполняется с повышенными правами. Если вы видите «Высокий», процесс запускается с повышенными правами. Если процесс выполняется с уровнем целостности «Высокий», запрос UAC не требуется для запуска другого процесса с повышенными правами.

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

HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System

установка ключа "EnableLUA". Изменение этого параметра требует перезагрузки.

Но есть еще один момент, который еще не был упомянут здесь. В панели управления можно настроить «Поднять без запроса». И в этом случае пользователь с правами администратора может запустить процесс с повышенными правами из другого процесса без повышенных прав, и на экране появится сообщение «Нет UAC».

Этот параметр хранится в том же пути реестра в разделе "ConsentPromptBehaviorAdmin" для пользователей с правами администратора.

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

Как узнать, работает ли ваш процесс с повышенными правами: Позвоните OpenProcess(), затем OpenProcessToken(), затем GetTokenInformation(TokenElevation).

И чтобы получить уровень целостности, позвоните GetTokenInformation(TokenIntegrityLevel), а затем GetSidSubAuthority()

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

Обратите внимание, что API IsUserAnAdmin() устарел. Его нельзя использовать с Vista. Проверка, принадлежит ли пользователь группе администраторов, теперь намного больше кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...