MSI InstallFinalize ARP 移除条件

Posted

技术标签:

【中文标题】MSI InstallFinalize ARP 移除条件【英文标题】:MSI InstallFinalize ARP removal condition 【发布时间】:2020-11-09 11:49:13 【问题描述】:

我正在尝试配置 WiX 以构建安装程序,以便我可以通过命令行提供的属性激活功能并将它们迁移到下一次升级。

尝试使用我的 WiX 安装程序进行 MajorUpgrade 时,升级不会从 ARP-Menü 中删除以前的版本。在重新安装之前,似乎所有其他功能/组件都已被删除(日志列出了它们)。仅当我在以前的版本中通过命令行提供的属性激活功能时才会出现此问题。

v1 的 ARP 条目被删除:

msiexec /L*v install.log /i installerv1.msi
msiexec /L*v install.log /i installerv2.msi

v1 的 ARP 条目不会被删除:

msiexec /L*v install.log /i installerv1.msi EXTRAFEATURE=true
msiexec /L*v install.log /i installerv2.msi EXTRAFEATURE=true

或者

msiexec /L*v install.log /i installerv1.msi EXTRAFEATURE=true
msiexec /L*v install.log /i installerv2.msi

(v1 和 v2 的 ProductCode、PackageCode 和 Product Version 不同,UpgradeCode 保持不变)

简化的 WiX 配置:

<Product Id="$(var.CPACK_WIX_PRODUCT_GUID)"
    Name="$(var.CPACK_PACKAGE_NAME)"
    Language="1031"
    Version="$(var.CPACK_PACKAGE_VERSION)"
    Manufacturer="$(var.CPACK_PACKAGE_VENDOR)"
    UpgradeCode="$(var.CPACK_WIX_UPGRADE_GUID)">
    
    <Package InstallerVersion="301"
        InstallScope="perMachine"
        Compressed="yes"
        Description="$(var.CPACK_PACKAGE_NAME)"
        Keywords="!(loc.PackageKeywords)"
        Comments="!(loc.PackageComments)"/>

    <MajorUpgrade
        Schedule="afterInstallValidate"
        AllowSameVersionUpgrades="yes"
        DowngradeErrorMessage="!(loc.DowngradeErrorMessage)"/>

    <FeatureRef Id="ProductFeature"/>
    <FeatureRef Id="ExtraFeature"/>

    <Property Id="EXTRAFEATURE" Secure="yes"/>
    <Feature Id="ExtraFeature" Level="0">
        <Condition Level="1">EXTRAFEATURE</Condition>
        <ComponentRef Id="ExtraFeature"/>
    </Feature>
    
    ...
</Product>

查看日志我只看到一个区别:InstallInitialize 步骤不会触发生成删除 ARP 条目的脚本。

工作示例:

MSI (s) (14:10) [10:24:20:422]: Doing action: InstallInitialize
Aktion 10:24:20: InstallInitialize. 
Aktion gestartet um 10:24:20: InstallInitialize.
MSI (s) (14:10) [10:24:20:423]: Machine policy value 'AlwaysInstallElevated' is 0
MSI (s) (14:10) [10:24:20:423]: User policy value 'AlwaysInstallElevated' is 0
Aktion 10:24:20: GenerateScript. Für folgende Aktion werden Skriptvorgänge generiert:
GenerateScript: InstallInitialize
MSI (s) (14:10) [10:24:20:429]: PROPERTY CHANGE: Deleting ProductToBeRegistered property. Its current value is '1'.
MSI (s) (14:10) [10:24:20:430]: Note: 1: 2205 2:  3: Class 
MSI (s) (14:10) [10:24:20:430]: Note: 1: 2228 2:  3: Class 4: SELECT `CLSID` FROM `Class` WHERE `Icon_`=? AND `Class`.`Attributes`=1 
MSI (s) (14:10) [10:24:20:430]: Note: 1: 2205 2:  3: Class 
MSI (s) (14:10) [10:24:20:430]: Note: 1: 2228 2:  3: Class 4: SELECT `Component`,`CLSID` FROM `Component`,`Class` WHERE `Component`=`Component_` AND `Icon_`=? AND  (`Component`.`Installed` <> 0 AND `Component`.`Action` <> 0) 
MSI (s) (14:10) [10:24:20:430]: Note: 1: 2205 2:  3: Extension 
MSI (s) (14:10) [10:24:20:430]: Note: 1: 2228 2:  3: Extension 4: SELECT `Component`,`Extension` FROM `Component`,`Extension`,`ProgId` WHERE `Component`.`Component`=`Extension`.`Component_` AND `ProgId`.`ProgId`=`Extension`.`ProgId_` AND `ProgId`.`Icon_`=? AND  (`Component`.`Installed` <> 0 AND `Component`.`Action` <> 0) 
MSI (s) (14:10) [10:24:20:430]: 'ProductIcon.ico' icon will be removed.
Aktion beendet um 10:24:20: InstallInitialize. Rückgabewert 1.

不工作的例子:

MSI (s) (74:94) [09:50:04:656]: Doing action: InstallInitialize
Aktion 09:50:04: InstallInitialize. 
Aktion gestartet um 09:50:04: InstallInitialize.
MSI (s) (74:94) [09:50:04:658]: Machine policy value 'AlwaysInstallElevated' is 0
MSI (s) (74:94) [09:50:04:658]: User policy value 'AlwaysInstallElevated' is 0
Aktion beendet um 09:50:04: InstallInitialize. Rückgabewert 1.

在 InstallFinalize (https://docs.microsoft.com/en-us/windows/win32/msi/installfinalize-action) 的文档中,我找到了以下描述:

如果检测到产品被标记为完全删除,则会自动将操作添加到脚本中,以删除产品控制面板信息中的添加/删除程序、取消注册和取消发布产品,以及删除从 %WINDOWS% 缓存的本地数据库(如果存在)。

我找不到任何有关 ARP 条目被删除时的情况的文档。为什么添加该功能会阻止触发 ARP 删除?

【问题讨论】:

也许你可以略读这些关于特性和特性条件的答案:1)Feature control、2)ADDLOCAL Property、3)Feature installation options properties、4)Feature migration。跨度> 感谢您的参考。我考虑过 ADDLOCAL,但我选择了 FeatureConditions,因为 ADDLOCAL 没有按预期工作:我无法使用 ADDLOCAL 安装 ExtraFeature。也许是Level=0,或者组件只设置了一个注册表项,但如果我尝试使用msiexec /QN /i installerv1.msi ADDLOCAL="ProductFeature,ExtraFeature" 安装MSI,则只会安装ProductFeature。 InstallLevel 应该被 ADDLOCAL 属性覆盖。我还删除了没有效果的特征条件和属性。 这里的级别一直是我的问题:Level="0" 对于功能条件似乎没问题,但使用 ADDLOCAL 激活功能似乎需要级别 > 0。 【参考方案1】:

该功能已禁用,因此不会被删除。

http://www.joyofsetup.com/2008/05/16/make-sure-features-are-always-enabled-so-they-can-be-removed/

【讨论】:

以上是关于MSI InstallFinalize ARP 移除条件的主要内容,如果未能解决你的问题,请参考以下文章

Wix延迟自定义操作访问被拒绝

Wix Custom BA 正确处理升级

如何在使用WixUI_Advanced时将RemoveExistingProducts更改为InstallFinalize之后?

在 Bundle 或 MSI 中升级?

win8 win10 安装msi 提示25022503的错误代码

win8 win10 安装msi 提示25022503的错误代码