Как запросить разрешения администратора с помощью NSIS?
Я совершенно новичок в NSIS. Я пытаюсь запросить разрешения администратора для запуска установщика, поскольку он немного возится с реестрами. Моя проблема с "RequestExecutionLevel" и "MULTIUSER_EXECUTIONLEVEL" заключается в том, что они оба абсолютно блокируют любого пользователя, не являющегося администратором, от открытия установщика, даже при выборе "Запуск от имени администратора" в контекстном меню. Я попытался использовать DLL RunAs, но я не нашел ни одного потока о том, что нужно поместить в переданную переменную $command для функции "RunAsW".
вот мой (довольно взломанный) код:
StrCpy 0
StrCpy ""
System::Call 'RunAs::GetAdministrators(w r1, *i .r0) i .r2 ? u'
System::Alloc 64
Pop
StrCpy
StrCpy ""
loop:
IntCmp 0 endloop
System::Call '*(w .r3)'
StrCpy "|"
endloop:
System::Free ; we free the memory used by the array
StrCpy "" "" 1
!insertmacro MUI_INSTALLOPTIONS_WRITE "Settings.ini" "Field 1" "ListItems"
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "Settings.ini"
!insertmacro MUI_INSTALLOPTIONS_READ "UserPass" "Field 1" "State"
!insertmacro MUI_INSTALLOPTIONS_READ "Settings.ini" "Field 2" "State"
StrCpy "%%LOGONSERVER%%"
StrCpy 0
StrCpy 0
System::Call 'RunAs::RunAsW(w r1, w r2, w r3, *w .r4) i .r0 ? u'
MessageBox MB_OK
IntCmp 1 success
Quit
success:
!insertmacro MUI_LANGDLL_DISPLAY
многое из этого-просто догадка, проб и ошибок. (кстати-я также попытался запустить цикл, чтобы получить всех администраторов, но, похоже, DLL предназначалась только для 32-битных машин, поэтому...).
в любом случае, мой вопрос:
кто-нибудь знает способ (используя "RunAs" или иначе) открыть диалоговое окно с запросом имени пользователя и пароля, проверить учетные данные и продолжить установка только если они проверяют?
кроме того, я знаю, что есть способ настроить установщик, чтобы он поставляется с этим красивым значком экрана, который позволяет пользователям знать, что будет запрошено разрешение администратора. Кто-нибудь знает, как это сделать?
любая помощь будет очень ценится, так как это единственное, что в настоящее время предотвращение развертывания моего приложения.
1 ответов
Outfile RequireAdmin.exe
RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on)
!include LogicLib.nsh
Function .onInit
UserInfo::GetAccountType
pop
${If} != "admin" ;Require admin rights on NT4+
MessageBox mb_iconstop "Administrator rights required!"
SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
Quit
${EndIf}
FunctionEnd
Page InstFile
Section
SectionEnd
- это основной код, который я обычно рекомендую, чтобы убедиться, что установщик работает как администратор.
IMHO нет смысла запрашивать учетные данные на пользовательской странице, если только часть процесса установки не требует доступа администратора, а другая часть-доступа к профилю пользователей. Если это относится к вам, то вы должны взглянуть на UAC плагин (это немного сложно использовать и делает невозможным для вашего exe-файла получить значок наложения щита)
Я не думаю, что подключаемый модуль RunAs работает правильно на Vista+, когда UAC включен, поэтому попытка заставить его работать может быть тупиком...
на рекомендуется чтобы получить щит, нужно запросить высоту в манифесте exe,RequestExecutionLevel admin
это. Если вы не используете RequestExecutionLevel
вообще в вашем скрипте ваш установщик может будет обнаружен как устаревший установщик, и он также получит щит перекрывать.
В Windows Vista, если исполняемый файл требует повышения для запуска, затем значок исполняемого файла должен быть "выбит" со значком щита укажите этот факт. Манифест приложения исполняемого файла должен содержать пометку "requireAdministrator" для обозначения исполняемого файла как требующего полного маркер доступа администратора. Наложение значков экрана также будет автоматически помещается на исполняемые файлы, которые считаются требующими высота согласно обнаружению установщика эвристика. Например, файл с именем Setup.exe автоматически получит значок экрана overlay даже если исполняемый файл не имеет встроенного манифеста приложения.