如何防止注册表删除作为已安装的 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
Key1(由安装程序添加)
Key2(由安装程序添加)
Key3(用户注册产品时添加)
[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 在主要升级删除旧版本之前检索数据,然后在最后重新应用它。
我们目前有一个 MSI 正在生产中(比如 Broker.msi)。作为安装的一部分,MSI(在 Wix 中定义)创建一个新的注册表项 (Broker) 并在其下添加 2 个子项。安装后,当用户注册我们的产品时,在 "Broker" 下又添加了 1 个名为 "Key3" 的注册表项 节点。请注意,"Key3" 包含极其重要的注册密钥,可由产品的其他层访问。
[注册表结构 post 安装并注册]
HKLM\Software\Microsoft\Broker
Key1(由安装程序添加)
Key2(由安装程序添加)
Key3(用户注册产品时添加)
[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 在主要升级删除旧版本之前检索数据,然后在最后重新应用它。