Как вы запрашиваете разрешения администратора с помощью NSIS? - PullRequest
11 голосов
/ 04 января 2012

Я новичок в NSIS. Я пытаюсь запросить разрешения администратора для запуска установщика, так как он немного мешает с реестрами. Моя проблема с «RequestExecutionLevel» и «MULTIUSER_EXECUTIONLEVEL» заключается в том, что они оба абсолютно блокируют любого пользователя, не являющегося администратором, от открытия программы установки, даже при выборе «Запуск от имени администратора» в контекстном меню. Я пытался использовать библиотеку 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

Многое из этого - просто догадка, проба и ошибка. (Кстати, я также попытался запустить цикл, чтобы получить всех администраторов, но, похоже, DLL была предназначена только для 32-битных машин, так что ...).

В любом случае, мой вопрос:

Кто-нибудь знает способ (с помощью «RunAs» или иным образом) открыть диалоговое окно с запросом имени пользователя и пароля, проверить учетные данные и продолжить установку только в случае их проверки?

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

Буду очень признателен за любую помощь, поскольку это единственное, что в настоящее время препятствует развертыванию моего приложения.

1 Ответ

22 голосов
/ 05 января 2012
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 InstFile

Section
SectionEnd

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

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

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

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

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

...