WiX Bundle部署SP1目标MSP补丁失败,改ProductValidateFlags可正常运行
首先,从你提供的日志和配置来看,核心问题在于WiX Bundle对MSP补丁的ProductValidateFlags标志位评估逻辑,和原生Windows Installer(双击MSP时)存在差异,导致补丁被标记为无需执行(execute: None)。
问题原因解析
标志位差异导致误判:
你设置的0x00000922和可行的0x902之间,多了0x20这个十六进制位。根据Windows Installer官方定义,0x20对应MSIPATCHVALIDATE_TARGETEDPRODUCT标志,它要求补丁必须针对特定的已安装产品实例做验证。
原生Windows Installer双击MSP时,能正确识别并处理这个标志;但WiX Bundle的补丁规划逻辑对这个额外标志的兼容性不好,直接判定补丁不需要安装。日志关键信息佐证:
日志里的execute: None是核心线索——虽然Bundle接收到了安装补丁的请求(default requested: Present, ba requested: Present),但经过适用性计算后,它认为补丁没有执行的必要,这正是ProductValidateFlags中的特殊标志导致的误判。
解决方案
针对这个问题,你可以按照以下思路处理:
1. 沿用可行的标志位配置
既然将ProductValidateFlags改为0x902后,补丁既能通过Bundle正常部署,双击安装也没问题,说明这个标志位组合已经满足你的验证需求(包含MSIPATCHVALIDATE_UPGRADEVERSION(0x800)、MSIPATCHVALIDATE_TARGETLANGUAGE(0x100)和MSIPATCHVALIDATE_TARGETVERSION(0x2))。建议继续使用这个配置,除非你有必须保留0x20标志的特殊业务场景。
2. 若必须保留原标志位的处理方式
如果你确实需要保留0x00000922的所有标志,可以尝试两种方法:
- 显式指定目标产品代码:
在MspPackage中直接声明补丁对应的目标产品代码,帮助Bundle更精准地识别目标实例:<MspPackage Id="hotfix" DisplayName="Sample Hotfix" SourceFile="$(env.hotfix)" Permanent="no" Cache="yes" Vital="yes" TargetProductCode="{B8136533-98DA-40CD-BCB0-AC798AEB71B8}"> </MspPackage> - 自定义Bootstrapper Application(BA)逻辑:
编写自定义BA代码,覆盖Bundle默认的补丁适用性检查逻辑,强制让Bundle执行补丁安装。不过这种方式复杂度较高,需要熟悉WiX BA的开发流程。
3. 验证补丁适用性
无论采用哪种配置,建议用msiexec /p hotfix.msp /l*v patch.log命令再次验证补丁的适用性,确保它能正确匹配目标产品的SP1版本,避免因标志位调整带来其他问题。
内容的提问来源于stack exchange,提问作者Jeremy Ma

