Как вы запрашиваете разрешения администратора, используя NSIS?

Я очень новичок в NSIS. Я пытаюсь запросить разрешения администратора для запуска установщика, поскольку он немного разбирается в реестрах. Моя проблема с "RequestExecutionLevel" и "MULTIUSER_EXECUTIONLEVEL" заключается в том, что они оба блокируют любого пользователя, не являющегося администратором, от открытия установщика даже при выборе "Запуск от имени администратора" в контекстном меню. Я попытался использовать DLL RunAs, но я не нашел ни одного потока о том, что положить в переменную $command, переданную функции "RunAsW".

Вот мой (довольно взломанный) код:

     StrCpy $0 0
     StrCpy $1 ""
     System::Call 'RunAs::GetAdministrators(w r1, *i .r0) i .r2 ? u'
     System::Alloc 64
     Pop $4
     StrCpy $4 $2
     StrCpy $5 ""
     loop:
          IntCmp $0 0 endloop
          System::Call '*$4(w .r3)'
          StrCpy $5 "$5|$3"
    endloop:
    System::Free $4   ; we free the memory used by the array
    StrCpy $5 "$5" "" 1
    !insertmacro MUI_INSTALLOPTIONS_WRITE "Settings.ini" "Field 1" "ListItems" $5
     !insertmacro MUI_INSTALLOPTIONS_DISPLAY "Settings.ini"
     !insertmacro MUI_INSTALLOPTIONS_READ $1 "UserPass" "Field 1" "State"
     !insertmacro MUI_INSTALLOPTIONS_READ $2 "Settings.ini" "Field 2" "State"
     StrCpy $3 "%%LOGONSERVER%%"
     StrCpy $3 0
     StrCpy $4 0
     System::Call 'RunAs::RunAsW(w r1, w r2, w r3, *w .r4) i .r0 ? u'
     MessageBox MB_OK $0
     IntCmp $0 1 success
     Quit
     success:
     !insertmacro MUI_LANGDLL_DISPLAY

Многие из них просто догадываются о работе, проб и ошибок. (btw - Я также пытался запустить цикл, чтобы получить всех администраторов, но, похоже, 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 $0
${If} $0 != "admin" ;Require admin rights on NT4+
    MessageBox mb_iconstop "Administrator rights required!"
    SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
    Quit
${EndIf}
FunctionEnd

Page InstFiles

Section
SectionEnd

- это основной код, который я обычно рекомендую, чтобы программа установки работала от имени администратора.

ИМХО, не имеет смысла запрашивать учетные данные на пользовательской странице, если только часть процесса установки не требует доступа администратора, а другая часть требует доступа к профилю пользователя. Если это относится к вам, вам следует взглянуть на UAC-плагин (он немного сложен в использовании и делает невозможным для вашего exe файла значок наложения экрана)

Я не думаю, что плагин RunAs правильно работает на Vista+, когда UAC включен, поэтому попытка заставить его работать - это тупик...

рекомендуемый способ получить щит - запросить повышение в exe-манифесте, RequestExecutionLevel admin делает это. Если вы вообще не используете RequestExecutionLevel в своем скрипте, ваш установщик может быть обнаружен как устаревший установщик, и он также получит наложение экрана.

В Windows Vista, если для запуска исполняемого файла требуется повышение прав, тогда значок исполняемого файла должен быть "проштампован" значком щита, чтобы указать этот факт. Манифест исполняемого приложения должен помечаться "requireAdministrator" для обозначения исполняемого файла как требующего полного токен административного доступа. Наложение значка щита также будет автоматически помещается в исполняемые файлы, которые, как считается, требуют высота согласно эвристике обнаружения установщика. Например, файл с именем setup.exe автоматически получит наложение значка щита даже если исполняемый файл не имеет встроенного манифеста приложения.