2015-04-20 3 views
1

У меня естьNSIS Installer: Обнаружить, если RequestExecutionLevel не работает

RequestExecutionLevel admin 

в моем NSIS скриптом.

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

Что бы я хотел сделать, это быстро выйти из строя и сразу показать диалог: «Пожалуйста, запустите как администратор».

Я попытался добавить следующий snippit, который я нашел, но он ВСЕГДА терпит неудачу, если пользователь не является администратором (но не нормальным пользователем с уровнем выполнения администратора).

UserInfo::GetAccountType pop $0 ${If} $0 != "admin" MessageBox mb_iconstop "Administrator rights required!" SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED Quit ${EndIf}

+0

Windows версия? Что такое значение ConsentPromptBehaviorAdmin и ConsentPromptBehaviorUser в вашем реестре в HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System? – Anders

+0

Я вижу, что на самом деле происходит сейчас. Даже если пользователь использует Right Click -> Run as administrator, так как UAC «никогда не уведомляет», он все равно будет запускать программу как обычный пользователь. Код у меня в порядке, но я собираюсь изменить сообщение об ошибке, чтобы указать, что это может быть их проблемой. – Will

ответ

1

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

Использование UserInfo :: GetAccountType - правильное решение.