You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WiX升级依赖组件误卸载:SKIP_UNINSTALL值异常变更排查

问题:WiX升级程序时依赖组件被意外卸载

问题场景

安装1.0版本时,RabbitMQ、Erlang等依赖组件可正常安装;但升级到2.0版本时,这些组件会被自动卸载,不符合预期。

现有卸载自定义操作配置

已定义UninstallRabbitMQ等自定义操作,触发条件如下:

<Custom Action="SetUninstallErlang" Before="UninstallErlang"></Custom>
<Custom Action="UninstallErlang" After="UninstallHandleExe">(REMOVE="ALL") AND (SKIP_UNINSTALL_ERLANG="0")</Custom>

<Custom Action="SetUninstallRabbit" Before="UninstallRabbit" />
<Custom Action="UninstallRabbit" Before="UninstallErlang">(REMOVE="ALL") AND (SKIP_UNINSTALL_RABBITMQ="0")</Custom>

注:SKIP_UNINSTALL_RABBITMQ="0"表示执行卸载操作,但实际安装后注册表中该值为1

相关属性配置代码

代码中涉及SKIP_UNINSTALL_*属性的部分仅包含以下内容:

注册表搜索与属性赋值

<Property Id="SKIP_UNINSTALL_HANDLEEXE_SEARCH" Secure="yes">
    <RegistrySearch Id="SKIP_UNINSTALL_HANDLEEXESearch"
                                          Root="HKLM"
                                          Key="Software\PRO\ServerPrereq"
                                          Name="SKIP_UNINSTALL_HANDLEEXE"
                                          Type="raw" />
</Property>
<SetProperty Id="SKIP_UNINSTALL_HANDLEEXE" Value="[SKIP_UNINSTALL_HANDLEEXE_SEARCH]" Sequence="both" After="AppSearch">(WIX_UPGRADE_DETECTED OR Installed) AND SKIP_UNINSTALL_HANDLEEXE_SEARCH</SetProperty>

<Property Id="SKIP_UNINSTALL_ERLANG_SEARCH" Secure="yes">
    <RegistrySearch Id="SKIP_UNINSTALL_ERLANGSearch"
                                          Root="HKLM"
                                          Key="Software\PRO\ServerPrereq"
                                          Name="SKIP_UNINSTALL_ERLANG"
                                          Type="raw" />
</Property>
<SetProperty Id="SKIP_UNINSTALL_ERLANG" Value="[SKIP_UNINSTALL_ERLANG_SEARCH]" Sequence="both" After="AppSearch">(WIX_UPGRADE_DETECTED OR Installed) AND SKIP_UNINSTALL_ERLANG_SEARCH</SetProperty>

<Property Id="SKIP_UNINSTALL_RABBITMQ_SEARCH" Secure="yes">
    <RegistrySearch Id="SKIP_UNINSTALL_RABBITMQSearch"
                                          Root="HKLM"
                                          Key="Software\PRO\ServerPrereq"
                                          Name="SKIP_UNINSTALL_RABBITMQ"
                                          Type="raw" />
</Property>
<SetProperty Id="SKIP_UNINSTALL_RABBITMQ" Value="[SKIP_UNINSTALL_RABBITMQ_SEARCH]" Sequence="both" After="AppSearch">(WIX_UPGRADE_DETECTED OR Installed) AND SKIP_UNINSTALL_RABBITMQ_SEARCH</SetProperty>

Product.wsx中的初始属性定义

<Property Id="SKIP_UNINSTALL_HANDLEEXE" Value="0" />
<Property Id="SKIP_UNINSTALL_ERLANG" Value="0" />
<Property Id="SKIP_UNINSTALL_RABBITMQ" Value="0" />

异常现象

  1. 安装1.0版本后,RabbitMQ和Erlang正常安装,SKIP_UNINSTALL_*值为0;
  2. 升级到2.0版本时,程序卸载旧版本并安装新版本,此时SKIP_UNINSTALL_*值被改为1,触发依赖组件卸载,进而导致RabbitMQ配置失败。

排查步骤

  • 开启MSI日志追踪属性变化:执行升级时添加日志参数,如msiexec /i yourinstaller.msi /l*v upgrade.log,在日志中搜索SKIP_UNINSTALL_*,查看属性何时被修改,以及触发变更的操作上下文。
  • 检查旧版本卸载逻辑:手动卸载1.0版本,查看卸载完成后注册表中SKIP_UNINSTALL_*的值是否变为1,如果是,说明旧版本的卸载流程存在修改该属性的逻辑。
  • 验证SetProperty条件合理性:当前SetProperty的条件包含WIX_UPGRADE_DETECTED,如果旧版本卸载时修改了注册表值,新版本会读取到变更后的值并覆盖初始的0。可临时修改条件为(Installed) AND SKIP_UNINSTALL_*_SEARCH,排除升级场景的属性覆盖,测试是否复现问题。
  • 排查注册表写入操作:检查整个安装包中所有写入Software\PRO\ServerPrereq路径的自定义操作或Registry元素,确认是否有逻辑在升级过程中修改SKIP_UNINSTALL_*的值。
  • 测试属性传递行为:WiX升级时旧版本属性可能传递到新版本,确认旧版本安装包中是否存在未被发现的SKIP_UNINSTALL_*属性修改逻辑。

内容的提问来源于stack exchange,提问作者kollodziej

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:51:02