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.0版本后,RabbitMQ和Erlang正常安装,
SKIP_UNINSTALL_*值为0; - 升级到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
相关产品推荐
相关产品推荐

