Wix安装程序 - 从“卸载”运行或在“控制面板”中更改程序时,如何使用管理权限运行更改

时间:2012-02-01 13:18:24

标签: installer wix uac custom-action

我的安装程序有一个自定义操作,它会联系Windows服务并设置一些参数。 为了成功使用该服务,必须使用提升的权限运行它。

在用户单击“安装”按钮时首次安装时,会显示UAC提示并安装成功完成。但是,当用户决定更改产品(添加新功能)时,调用该服务将失败!发生这种情况是因为安装程序未在特权模式下运行。当我从具有管理权限的命令提示符启动安装程序时,更改操作也会成功完成。

我遇到了以下article,建议创建一个引导程序。有没有更简单的方法来实现这一目标?

我是否正确实施了自定义操作?这是自定义操作代码

     <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>

更新:在Cosmin的评论之后,我意识到我正在访问CA中的会话数据。 SetParams CA使用UI序列中生成的动态属性。为了访问延迟CA中的数据,我创建了一个即时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]));

这种方法有效! 从admin cmd session [propertyName]启动时返回正确的值,但是当我从非提升的cmd提示符运行安装程序更改时,我无法访问直接CA中的属性值 - session [propertyName]返回空字符串?!

我可以访问wxs文件中定义的(静态)属性

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

但不是我在UI序列中添加了一些其他立即自定义动作的那个

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

1 个答案:

答案 0 :(得分:1)

未设置模拟属性的延迟自定义操作将确保CA以提升模式运行。

我添加了一个新的question来解决出现的另一个问题。

访问动态属性值问题的解决方案

  1. 立即执行操作,读取要从执行中移出的属性 序列到UI序列
  2. 执行阶段的操作可以访问数据 来自问题中所述的安全属性。如果属性 在CA中动态创建,必须添加它们 SecureCustomProperties系统属性。分隔符char是';'。“