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