WiX:使用msiexec / i Setup.msi / qn时不运行自定义操作(没有UI的安静模式安装)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WiX:使用msiexec / i Setup.msi / qn时不运行自定义操作(没有UI的安静模式安装)相关的知识,希望对你有一定的参考价值。

我们的问题是当使用msiexec / i Setup.msi / qn(没有UI的安静模式安装)时,自定义操作不会运行。它们仅在使用UI进行正常安装时运行。

例如,在我们的Product.wxs中,我们定义了以下内容:

<Binary Id="SetupCustomAction" SourceFile="$(var.SetupCustomActions.TargetDir)$(var.SetupCustomActions.TargetName).CA.dll" />

<CustomAction Id="UPDATE_CONFIG" BinaryKey="SetupCustomAction" DllEntry="UpdateConfiguration" Execute="commit" Return="check" Impersonate="no" />

<InstallExecuteSequence>
    ...
    <Custom Action="UPDATE_CONFIG" After="InstallFiles"><![CDATA[NOT Installed AND USEIMPERSONATE="0"]]></Custom>
    ...
</InstallExecuteSequence>

我们是否必须使用"Quiet Execution Custom Action",尝试这个虽然没有帮助!

请帮忙!

答案

显而易见的解释是USEIMPERSONATE的值为1,因此自定义操作不会运行,但我假设您可能在命令行上将其设置为0。

除此之外,知道安装是否实际成功是有用的,因为如果它通常需要使用UAC提示进行提升,则不会显示此UAC对话框,因此自定义操作将不会升级并且将失败。安装可能会成功,因为在安装后运行Commit自定义操作,因此“check”不相关,因为安装无法回滚。如果将该CA配置为安装自定义操作,则可能会失败并回滚安装。因此,InstallFiles也不相关,因为它是一个Commit CA.

日志应该显示一些东西。

另一答案

好的,我找到了错误的原因并修复了它:ALLUSERS OR PREVIOUSINSTALLSCOPE(从注册表中读取)属性必须设置为“1”。这样,DISABLE_IMPERSONATE自定义操作就会运行并将USEIMPERSONATE属性设置为“0”。然后UPDATE_CONFIG和其他自定义操作运行。

总之,解决方案是:

  1. DISABLE_IMPERSONATE Property更改为:<Custom Action="DISABLE_IMPERSONATE" After="AppSearch"><![CDATA[ALLUSERS=1 OR PREVIOUSINSTALLSCOPE="1"]]></Custom>
  2. 像这样叫msiexec:msiexec /i Bechtle.A365.Office.Client.msi /qn ALLUSERS=1

感谢@ Ritmo2k,@ Brian Sutherland和@PhilDW指出我正确的方向。

以上是关于WiX:使用msiexec / i Setup.msi / qn时不运行自定义操作(没有UI的安静模式安装)的主要内容,如果未能解决你的问题,请参考以下文章

在 Wix 中获取命令行参数

自动化 wix 小更新和小升级

Powershell:使用动态创建的参数运行 msiexec

通过MSI属性指定MSI转换

MSI安装的数据持久性

使用 msiexec 卸载特定功能