Как запустить пользовательский исполняемый файл с повышенными привилегиями? - PullRequest
15 голосов
/ 08 марта 2012

Мне нужно запустить исполняемый файл для пользовательской настройки / удаления, после установки и перед удалением. Он должен работать с повышенными привилегиями. Как это сделать правильно?

Ответы [ 3 ]

18 голосов
/ 08 марта 2012

Загляните в этот блог в разделе Как создавать пользовательские действия, требующие прав администратора

Другая ссылка , которая действительно объясняет все типы пользовательских действий. Элемент CustomAction в Wix.

Это должно помочь вам немного больше.

Посмотрев на ваше Решение, вы, кажется, делаете CustomAction Type 18, здесь я вставил содержимое предыдущего блога для этих типов:

Тип настраиваемого действия 18 Вызывает исполняемый файл, который устанавливается вместе с приложением во время текущего сеанса. Столбец Источник в таблице CustomAction содержит ключ к записи в таблице файлов.

Столбец Target в таблице CustomAction содержит строку командной строки для исполняемого файла. Применяются все параметры обработки возврата, планирования выполнения и выполнения в сценарии.

Поскольку файл установлен вместе с приложением, существуют ограничения последовательности для настраиваемого действия. Тип 18:

If the source file is not already installed on the computer:
    Custom action must be sequenced after CostFinalize action because only after this action path to the file can be resolved.
If the source file is not already installed on the computer:
    Deferred custom actions of this type must be sequenced after the InstallFiles action.
    Non-deferred custom actions of this type must be sequenced after the InstallFinalize action.

Точка входа в настраиваемое действие получает дескриптор сеанса установки. Во время выполнения отложенного пользовательского действия сеанс может больше не существовать. Чтобы получить значение свойств, используйте свойство CustomActionData.

Вот как добавить настраиваемое действие типа 18 в Wix:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Component Id="Component1"
             Guid="*">
    <File Id="MyCA" Name="MyCA.exe" />
  </Component>
</Directory>

<CustomAction Id="DoSomething"
              FileKey="MyCA"
              ExeCommand="-switch"
              Execute="deferred"
              Return="check"
              HideTarget="no"
              Impersonate="no" />

<InstallExecuteSequence>
  <Custom Action="DoSomething" Before="InstallFinalize" />
</InstallExecuteSequence>

Сначала мы добавляем MyCA.exe в таблицу файлов.

Мы также добавляем настраиваемое действие типа 18 в таблицу CustomAction. Атрибут FileKey указывает на элемент с пользовательским действием dll. Атрибут ExeCommand указывает строку командной строки для исполняемого файла.

Последнее, что нужно сделать, - это запланировать наше настраиваемое действие во всех необходимых таблицах последовательности.

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

14 голосов
/ 13 марта 2012

Итак, окончательное решение было таким:

<CustomAction Id="Install" Directory="APPLICATIONROOTDIRECTORY"
              Execute="deferred" Impersonate="no" Return="ignore"
              ExeCommand="[APPLICATIONROOTDIRECTORY]MyExeName.exe -install" />

<CustomAction Id="Uninstall" Directory="APPLICATIONROOTDIRECTORY"
              Execute="deferred" Impersonate="no" Return="ignore"
              ExeCommand="[APPLICATIONROOTDIRECTORY]MyExeName.exe -uninstall" />

<InstallExecuteSequence>

  <Custom Action='Install' After='InstallFiles' >
    $ProductComponent = 3
  </Custom>

  <Custom Action='Uninstall' After='InstallInitialize' >
    ?ProductComponent = 3
  </Custom>

</InstallExecuteSequence>

Любой совет, чтобы улучшить это?

5 голосов
/ 20 февраля 2013

Вы можете добавить 'НЕ УДАЛИТЬ' для последовательности установки и восстановления. И 'Installed AND (REMOVE = "ALL") "только для последовательности удаления.

    <InstallExecuteSequence>
      <Custom Action='Install' After='InstallFiles' >
        NOT REMOVE
      </Custom>

      <Custom Action='Uninstall' After='InstallFiles' >
         Installed AND (REMOVE = "ALL")
      </Custom>

    </InstallExecuteSequence>
...