如何防止注册表删除作为已安装的 MSI 卸载的一部分?

How to prevent registry delete as part of already installed MSI's uninstallation?

我们目前有一个 MSI 正在生产中(比如 Broker.msi)。作为安装的一部分,MSI(在 Wix 中定义)创建一个新的注册表项 (Broker) 并在其下添加 2 个子项。安装后,当用户注册我们的产品时,在 "Broker" 下又添加了 1 个名为 "Key3" 的注册表项 节点。请注意,"Key3" 包含极其重要的注册密钥,可由产品的其他层访问。

[注册表结构 post 安装并注册]

HKLM\Software\Microsoft\Broker

[Wix 代码片段]

  <Component Id="RegistryEntries" Guid="*" Win64="$(var.WIN64_COMPONENT)">
          <RegistryKey Root="HKLM" Key="Software\Microsoft\Broker"  Action="createAndRemoveOnUninstall">
            <RegistryValue Type="string" Name="Key1" Value="1rp1users" KeyPath="yes"/>
            <RegistryValue Type="string" Name="Key2" Value="http://windowsbackup/m1" />
          </RegistryKey>
    </Component>
....
 <ComponentRef Id="RegistryEntries" />

问题: 到目前为止,自从我们使用补丁以来,我们就不会面临升级的任何问题。从下一个版本开始,我们希望进行重大升级,但最大的挑战是:在重大升级期间,旧产品将被卸载。根据 Wix 片段,"Broker" 注册表元素的操作元素是 "CreateAndRemoveOnUninstall" 所以整个 "Broker" 节点连同 "Key3" 子键一起被删除。

如果我将操作更新为 "Create",问题将通过新安装得到解决,但由于 msi 已经在生产中,我如何防止它删除注册表作为现有产品主要升级的一部分?

您需要实施 Remember Property 模式。这将导致新的 MSI 在主要升级删除旧版本之前检索数据,然后在最后重新应用它。