2010-06-26 4 views
8

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

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

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

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

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

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

+1

Это хорошо написанный вопрос, если я его видел. – badp

+0

@badp: Я немного подумал об этом, но это все еще озадачивает меня, поскольку кажется слишком легким ... возможно, я не принял во внимание некоторые граничные условия. – Wizard79

ответ

3

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

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

+1

Ну, на самом деле есть обоснование при установке экрана, даже если приложение уже поднято (или если UAC отключен): таким образом пользователь сразу же признает, что кнопка выполняет «административный материал». Я поддерживаю этот стиль пользовательского интерфейса, но клиент этого не делает. – Wizard79

+0

Как вы думаете, я могу полагаться только на проверку №1? – Wizard79

+0

Я думаю, что вы должны закодировать его как «если вы не админ, не надели щит», а затем запустите все свои тестовые примеры, чтобы убедиться, что этого достаточно. Мое подозрение в том, что так оно и будет. –

2

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

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

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

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

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

установки ключа «EnableLUA». Для изменения этого параметра требуется перезагрузка.

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

Этот параметр хранится по тому же пути реестра в ключе «ConsentPromptBehaviorAdmin» для пользователей admin.

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

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

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

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

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