Мой установщик имеет настраиваемое действие, которое связывается со службой 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++];