含MsiEmbeddedChainer表的MSI无法正常卸载问题咨询
解决MsiEmbeddedChainer卸载未触发的问题
嘿,我来帮你搞定这个MsiEmbeddedChainer的卸载坑——之前做链式MSI部署时我也踩过类似的雷,咱们一步步拆解问题根源和解决办法:
问题根源分析
你遇到的核心问题是卸载时MsiEmbeddedChainer的Condition条件没有正确触发,加上链式程序可能没处理好卸载上下文,导致Windows Installer跳过了链式调用,最终卸载不彻底。
具体解决步骤
1. 修正Condition字段的取值
你当前用的Condition=REMOVE太宽泛了,Windows Installer里REMOVE属性在不同卸载场景下的取值不一样:
- 只有完全卸载(比如从「程序和功能」删除,或执行
msiexec /x {ProductGUID})时,REMOVE才会被设为ALL - 如果是移除单个组件,
REMOVE会是组件的ID,这时候你的条件不会匹配
所以把第二个条目的Condition改成:
REMOVE="ALL"
这样就能精准匹配完全卸载的场景,确保链式程序被触发。
2. 确保链式可执行文件处理卸载逻辑
安装时链式程序能正常调用是因为你处理了安装上下文,但卸载时需要做额外判断:
- 在链式程序里,通过
MsiGetProperty获取当前的安装动作(比如检查ACTION属性,卸载时它的值是REMOVE) - 拿到事务句柄后,调用嵌入式MSI的卸载命令,比如:
一定要带上msiexec /x "路径\你的嵌入式MSI.msi" TRANSACTION=[事务句柄] /qnTRANSACTION参数,让嵌入式MSI加入到当前的卸载事务中,保证同步完成。
3. 检查MsiEmbeddedChainer表的其他配置
Chainer字段要确保路径正确:推荐用Windows Installer属性拼接,比如[SystemFolder]你的链式程序.exe,避免硬编码路径导致找不到程序- 链式程序的位数要和MSI匹配:如果是64位MSI,链式程序也要编译成64位,否则Windows Installer会静默跳过调用
4. 用日志排查问题
如果还是没触发,启用MSI卸载日志来定位:
执行命令:
msiexec /x {你的MSI产品GUID} /l*v uninstall.log
打开日志搜索MsiEmbeddedChainer,看看:
- 条件
REMOVE="ALL"是否被评估为true - 链式程序是否被启动,有没有返回错误码(比如1603表示执行失败)
额外提醒
移除MsiEmbeddedChainer表后卸载正常,说明原MSI本身的卸载逻辑是没问题的,问题完全集中在链式调用的配置和处理上。只要把Condition改对,再让链式程序正确处理卸载事务,就能解决这个问题。
内容的提问来源于stack exchange,提问作者Paul Dolphin
相关产品推荐
相关产品推荐

