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

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

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

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

 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 автоматически получит наложение значка экрана, даже если исполняемый файл не имеет встроенного манифеста приложения.

Interesting Posts
Давайте будем гением компьютера.