卸载MSI时能否应用.mst转换文件?如何在卸载时生效?
已发布MSI卸载异常的修复方案
首先明确核心限制:从「添加或删除程序」面板触发的卸载是Windows Installer直接调用系统缓存的原始MSI,默认不会加载外部MST转换文件,且MST必须在MSI执行引擎启动时就加载,无法在卸载流程运行中途传入,也不需要用户手动指定参数,通过系统级配置关联即可实现自动加载,完全不需要重新发布全新的Minor Upgrade安装包。
具体操作步骤
- 第一步:部署修复MST到终端
通过域组策略、终端管理工具(如SCCM、Intune)将你已经调整好Custom Action执行条件的MST文件,下发到所有已安装问题版本MSI的终端固定只读路径,例如C:\Program Files\你的产品目录\hotfixes\uninstall_fix.mst,确保SYSTEM账户、本地管理员组、普通用户组对该文件有读取权限,路径尽量使用全英文、无特殊字符,避免MSI路径解析失败。 - 第二步:注册MST为对应产品的默认关联转换文件
同样通过终端管理工具推送注册表修改,定位到系统MSI的产品配置路径:注意:该路径下的产品标识是ProductCode经过压缩转换的格式,你可以直接在
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products路径下搜索你的产品名,找到对应子项即可
找到对应产品子项后,修改其下的Transforms字符串值,在原有值(如果没有就新建)末尾追加你刚才下发的MST的完整本地路径,多个MST用;分隔即可。
这个配置是Windows Installer的全局配置,修改完成后,不管用户是从添加或删除程序触发卸载、还是后续安装高版本包触发旧版本自动卸载,MSI引擎都会自动加载这个MST,你在MST里配置的Custom Action卸载时跳过的逻辑会直接生效。 - 可选兜底配置:修改卸载命令参数
如果你担心部分老旧系统不识别上面的全局Transforms配置,可以同步修改对应产品的卸载注册表项的命令行:- 32位程序在64位系统下的路径:
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{对应产品的ProductCode} - 64位程序/32位系统下的程序路径:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{对应产品的ProductCode}
找到该键下的UninstallString值,原始值格式一般为MsiExec.exe /X{ProductCode},修改为MsiExec.exe /X{ProductCode} TRANSFORMS="C:\Program Files\你的产品目录\hotfixes\uninstall_fix.mst"即可。
- 32位程序在64位系统下的路径:
踩坑提醒
- 绝对不要直接修改
C:\Windows\Installer路径下系统缓存的原始MSI文件,该文件有Windows Installer的哈希校验,修改后会直接触发安装包损坏、卸载/升级完全失败的问题。 - 不要尝试在卸载流程已经启动后再注入MST,MSI的所有执行序列、Custom Action条件都是在引擎启动加载包的阶段就完成解析的,中途加载配置不会生效。
- 如果后续发布高版本安装包,你可以直接把这个修复MST打包进高版本MSI,在
RemoveExistingProducts操作执行前,先通过一个轻量自定义操作把MST释放到临时目录、写入旧版本的Transforms注册表项,就能保证升级时旧版本卸载自动加载修复逻辑,不需要提前给终端推任何补丁。
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

