Я вижу, что есть много путаницы в этой теме, и ответ от Кейт здесь не правильный и неполный.
С 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. Проверка того, принадлежит ли пользователь группе администраторов, теперь намного больше.
Это хорошо написанный вопрос, если я его видел. – badp
@badp: Я немного подумал об этом, но это все еще озадачивает меня, поскольку кажется слишком легким ... возможно, я не принял во внимание некоторые граничные условия. – Wizard79