Как запросить разрешения администратора с помощью 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 даже если исполняемый файл не имеет встроенного манифеста приложения.