NSIS: установка приложения, чтобы всегда запускаться от имени администратора - PullRequest
9 голосов
/ 11 января 2012

У меня есть сценарий NSIS, который хорошо работает для большого приложения.Я прочитал много тем по всей сети, но не могу получить четкий ответ на следующие вопросы: возможно ли установить приложение с использованием NSIS, которое при запуске (независимо от типа пользователя) автоматически запускается от имени администратора?Если это возможно, как этого достичь?

Примечание. Я уже намекаю, что пакет NSIS должен запускаться как admin с использованием

RequestExecutionLevel admin

Я попытался написать требование UACв запись реестра приложений, используя этот метод , но я не смог заставить команду RUNASADMIN скомпилировать, поскольку она не имеет требуемого формата для NSIS.

1 Ответ

18 голосов
/ 11 января 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

Установленное приложение должно выполнить аналогичные шаги, если его всегда нужно запускать от имени администратора, для приложения Win32, которое будет:

  • Добавить элемент requestedExecutionLevel в манифест с атрибутом level, установленным в requireAdministrator
  • Позвоните IsUserAnAdmin или CheckTokenMembership , чтобы убедиться, что вы действительно являетесь администратором.

Если под «автоматически запускается от имени администратора» вы имеете в виду обойти повышение прав UAC, то нет, это на самом деле невозможно, весь смысл UAC состоит в том, чтобы позволить пользователю подтверждать / отклонять привилегированные операции! Некоторые приложения решают эту проблему, устанавливая службу NT, которая выполняет все необходимые действия от имени приложения. Я не рекомендовал бы это, потому что это заполняет пользовательскую машину службами и может ослабить безопасность системы, если служба не закодирована правильно.

Если вы не написали приложение, которое устанавливаете, тогда ваши возможности немного ограничены. Если приложение вообще не имеет манифеста, вы можете использовать external (myapp.exe.manifest) манифест.

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

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

...