UAC и шаблон подсказки высот
Я прочитал несколько вопросов, касающихся UAC и повышения привилегий, но я не нашел удовлетворительного / исчерпывающего ответа.
У меня есть такой сценарий: в Windows 6 или выше, когда пользователь открывает окно конфигурации, я должен показать экран (BCM_SETSHIELD
) на кнопку ОК только в том случае, если для выполнения задачи потребуется повышение привилегий. - Я знаю, что в пользовательском интерфейсе Windows экран всегда визуализируется для "административных задач", даже если UAC отключен, но у клиента был этот конкретный запрос.
У меня есть черновик этого условия, чтобы показать значок:
- Пользователь не имеет прав администратора
ИЛИ ЖЕ - Текущий процесс имеет
TOKEN_ELEVATION_TYPE == TokenElevationTypeLimited
Условие № 1 простое: если у пользователя нет прав администратора, всегда требуется повышение прав независимо от UAC. № 2 подразумевает, что пользователь имеет административные права, и любое другое значение TOKEN_ELEVATION_TYPE
означает, что высота не нужна.
Неужели это так просто? Я что-то упустил? И - есть ли задокументированный или хорошо известный шаблон по этой теме?
2 ответа
Вы правы. Большинство людей просто надевают экран, если кнопка будет работать с повышенными правами, но правильнее всего включить экран, если кнопка вызовет повышение (то есть подавить его, если вы уже подняты, поскольку все, что вы запускаете, останется поднятым). если только у вас не возникнут проблемы с запуском процесса без повышенных прав и подавлением его, если UAC выключен.)
Хорошей новостью является то, что если кто-то из группы "Администраторы" запускает (под UAC) приложение без повышенных прав, вы вернетесь false
когда вы спрашиваете, являются ли они администратором или нет. Так что я думаю, что вы можете быть в порядке только с этим тестом
Я вижу, что по этой теме много путаницы, и ответ от Кейт здесь не является правильным и неполным.
Начиная с Vista, администратор может войти в систему, но его процессы не запускаются с повышенными правами. У администратора есть так называемый "разделенный токен". Это означает, что могут быть процессы, запущенные для ТОГО ЖЕ пользователя-администратора, и некоторые из них работают с повышенными правами, а другие НЕ работают с повышенными правами. Когда администратор запускает процесс без повышенных прав, некоторые привилегии его токена были удалены. Это больше не так, как в XP, где ВСЕ процессы работают с повышенными или не повышенными.
Установите Process Explorer с www.sysinternals.com и включите столбец "Уровень целостности". Если вы видите "Средний", этот процесс не выполняется с повышенными правами. Если вы видите "Высокий", процесс запускается с повышенными правами. Если процесс выполняется с уровнем целостности "Высокий", запрос UAC не требуется для запуска другого процесса с повышенными правами.
Когда UAC полностью выключен, ВСЕ процессы запускаются "Высокий", поэтому повышение не требуется никогда. UAC можно отключить под
HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System
настройка ключа "EnableLUA
Msgstr "Изменение этого параметра требует перезагрузки.
Но есть еще один момент, который еще не был упомянут здесь. В панели управления можно настроить "Поднять без запроса". И в этом случае пользователь с правами администратора может запустить процесс с повышенными правами из другого процесса без повышенных прав, и появится сообщение "Нет UAC".
Этот параметр хранится в том же пути реестра в разделе "ConsentPromptBehaviorAdmin
"для пользователей с правами администратора.
Для всех пользователей без прав администратора есть ключConsentPromptBehaviorUser
"но это меняет только поведение, но повышение не может быть отключено. Не администраторы всегда получат приглашение UAC. (если UAC не полностью отключен)
Как узнать, работает ли ваш процесс с повышенными правами: Позвоните OpenProcess()
, затем OpenProcessToken()
, затем GetTokenInformation(TokenElevation)
,
И чтобы получить вызов уровня целостности GetTokenInformation(TokenIntegrityLevel)
а потом GetSidSubAuthority()
Поэтому, если вы хотите, чтобы ваш значок отображался только в том случае, если повышение прав действительно требуется, вы должны проверить, работает ли ваш процесс с повышенными правами, и дополнительно проверить эти ключи реестра, и вы должны знать, является ли пользователь администратором или нет. Это включает в себя несколько строк кода, и я хотел бы показать этот значок всегда, когда повышение может потребоваться, чтобы сделать его простым.
Обратите внимание, что API IsUserAnAdmin()
устарела. Его нельзя использовать с Vista. Проверка, принадлежит ли пользователь группе администраторов, теперь намного больше кода.