如何检测已安装旧版机器级MSI并获取版本以终止用户级MSI安装
MSI安装包检测机器级旧版本实现方案
核心逻辑是利用WiX自带的注册表搜索能力遍历Uninstall注册表分支,通过固定的应用属性(如显示名、发行商、版本范围)匹配旧版安装记录,无需自定义动作,天然可区分机器级/用户级安装。
具体实现步骤
引入WiX工具扩展
在你的.wxs文件的根<Wix>节点中添加util扩展命名空间声明:xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"编写旧版安装检测逻辑
通过通配符遍历HKLM下的32位Uninstall分支所有子键,匹配旧版应用的固定标识:
<util:RegistrySearch Id="DetectOldMachineMSI" Root="HKLM" Key="SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" Value="DisplayName" Variable="OLD_MACHINE_MSI_EXIST" Result="exists" Condition="Value = '你的旧版应用官方显示名' AND Version < '旧版最高版本号'" />
如果存在64位的旧版机器级安装,额外新增一段搜索逻辑,添加Win64="yes"属性即可:
<util:RegistrySearch Id="DetectOld64BitMachineMSI" Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" Win64="yes" Value="DisplayName" Variable="OLD_64BIT_MSI_EXIST" Result="exists" Condition="Value = '你的旧版应用官方显示名' AND Version < '旧版最高版本号'" />
- 添加安装终止条件
在<Product>节点下添加启动条件,检测到旧版存在时直接中止安装:
<Condition Message="检测到已安装机器级旧版本应用,请卸载旧版后再执行安装。"> NOT (OLD_MACHINE_MSI_EXIST OR OLD_64BIT_MSI_EXIST) </Condition>
关键说明
- 该方案天然符合你利用安装范围差异判断的需求:搜索路径固定为HKLM下的注册表分支,只会匹配机器级安装的应用,不会匹配到HKCU下的用户级安装记录,避免误判。
- 可自行调整匹配规则,比如增加
Publisher属性的匹配判断,进一步降低误识别其他软件的概率。 - 此前你查到的
ProductSearch仅支持提前知道固定ProductCode的场景,不适用于ProductCode动态生成的旧版本检测,无需再尝试该方案。
内容的提问来源于stack exchange,提问作者Alonzzo2
相关产品推荐
相关产品推荐

