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



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

〔注册表结构安装后注册〕

HKLM\Software\Microsoft\Broker

  • Key1(由安装程序添加)

  • Key2(由安装程序添加)

  • Key3(在用户注册产品时添加)

[Wix代码段]

<Component Id="RegistryEntries" Guid="*" Win64="$(var.WIN64_COMPONENT)">
<RegistryKey Root="HKLM" Key="SoftwareMicrosoftBroker"  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"注册表元素的action元素为"CreateAndRemoveOnUninstall",因此将删除整个"Broker"节点以及"Key3"子密钥。

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

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

最新更新