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



我的安装程序有一个自定义操作,它可以联系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>

更新:在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会话启动时[propertyName]返回正确的值,但当我从非提升的cmd提示符运行安装程序更改时,我无法访问即时CA中的属性值-会话[propertyName]返回空字符串?!

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

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

但不是我在UI序列中添加的其他即时自定义操作,比如这个

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

没有模拟属性集的延迟自定义操作将确保CA在提升模式下运行。

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

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

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

最新更新