Wix installer - как запустить изменение с правами администратора при запуске из программы удаления или изменения программы в панели управления - PullRequest
3 голосов
/ 01 февраля 2012

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

При первой установке, когда пользователь нажимает кнопку «Установить», она отображается с приглашением UAC и установка успешно завершена.Тем не менее, когда пользователь решает изменить продукт (добавить новую функцию), вызов службы не удастся!Это происходит потому, что установщик не запускается в привилегированном режиме.Когда я запускаю установщик из командной строки с правами администратора, операция изменения также успешно завершается.

Я наткнулся на следующую статью , в которой предлагается создать загрузчик.Есть ли более простой способ сделать это?

Правильно ли я реализовал пользовательское действие ?.Вот код настраиваемого действия

     <CustomAction Id='SetParams' BinaryKey='Setup.CustomAction' DllEntry='SetParameters' Execute='deferred' Impersonate='no' Return='asyncWait'/>
<Binary Id='Setup.CustomAction' SourceFile='$(var.CustomActionDll)' />

<InstallExecuteSequence>
  <Custom Action='SetParams' Before='InstallFinalize'><![CDATA[REMOVE <> "ALL"]]></Custom>
</InstallExecuteSequence>

Обновление: после комментария Космина я понял, что получаю доступ к данным сеанса в ЦС.SetParams CA использует динамические свойства, сгенерированные в последовательности пользовательского интерфейса.Чтобы получить доступ к данным в отложенном ЦС, я создал немедленный ЦС, который динамически извлекает эти данные и помещает их в CustomActionData.

<CustomAction Id='SaveParams' BinaryKey='Setup.CustomAction' DllEntry='SaveParameters' Execute='immediate'  Return='check'/>
<CustomAction Id='SetParams' BinaryKey='Setup.CustomAction' DllEntry='SetParameters' Execute='deferred' Impersonate='no' Return='check' />

<Custom Action='SaveParams' Before='SetParams'><![CDATA[REMOVE <> "ALL"]]></Custom>
  <Custom Action='SetParams' Before='InstallFinalize'><![CDATA[REMOVE <> "ALL"]]></Custom>

Ниже приведена часть метода SaveParameters в настраиваемом действии

propertyName = moduleInfo.GetPropertyName(moduleParameter.Name);
customActionData.Append(string.Format(CultureInfo.InvariantCulture, "{0}={1};", propertyName, session[propertyName]));

Этот подход работает!При запуске из административного сеанса cmd [propertyName] возвращает правильное значение, но когда я запускаю изменение установщика из командной строки без повышенных полномочий, я не могу получить доступ к значениям свойств в ближайшем CA - сеанс [propertyName] возвращает пустую строку?!

Я могу получить доступ к (статическому) свойству, определенному в файле wxs

<Property Id="INSTALL" Secure="yes" /> 

, но не к тому, которое я добавил в некоторых других непосредственных пользовательских действиях в последовательности пользовательского интерфейса, подобных этому

session[property] = parameters[paramcount++];

1 Ответ

1 голос
/ 10 февраля 2012

Отложенное настраиваемое действие без установленного атрибута олицетворения обеспечит запуск CA в режиме повышенных прав.

Я добавил новый вопрос для решения другой возникшей проблемы.

Решение проблемы доступа к динамическому значению свойства

  1. Немедленное действие, которое считывает свойства, которые нужно перенести из исполнения последовательность в UI последовательность
  2. Действия на этапе выполнения могут получить доступ к данным из защищенных свойств, как указано в вопросе. Если свойства динамически создаются в CA, они должны быть добавлены в Системное свойство SecureCustomProperties. Символ разделителя - ';'. "
...