WiX创建注册表项后卸载不删除的非自定义操作实现方法
无自定义操作实现方案
不需要编写自定义操作即可满足需求,通过Windows Installer原生的组件属性配置就能实现,核心思路是给负责写入TLS注册表的组件标记永久属性,让MSI在卸载时不会删除该组件创建的资源;同时配置注册表写入规则,仅在键值不存在时才创建,不覆盖已有配置。
具体修改步骤
为注册表组件添加永久标记
给Win8TLS12Registry组件增加Permanent="yes"属性,该属性会告知Windows Installer:此组件安装后属于系统永久资源,后续产品卸载时不会移除该组件写入的任何内容(包括注册表项)。注意该组件的Guid一旦发布就不要随意修改,否则永久标记会失效。配置注册表写入规则避免覆盖/卸载删除
给组件和对应的注册表值增加NeverOverwrite="yes"属性,同时给注册表键增加ForceDeleteOnUninstall="no"属性:NeverOverwrite="yes":安装时如果对应注册表值已经存在(无论值是0还是1),MSI都不会修改原有配置,仅当值完全不存在时才会写入预设的TLS 1.2启用参数ForceDeleteOnUninstall="no":显式关闭卸载时强制删除注册表键的逻辑,和永久组件属性形成双重保险
修改后的完整组件代码
<!-- For Server2012 add necessary registry entries to support TLS 1.2 --> <Component Location="local" Id="Win8TLS12Registry" Guid="00000000-1111-2222-3333-123456789ABC" Permanent="yes" NeverOverwrite="yes"> <Condition><![CDATA[not WIN10FOUND and ((not TLS12CLIENTFOUND) or (TLS12CLIENTFOUND="#0"))]]></Condition> <RegistryKey Root="HKLM" Key="SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" ForceCreateOnInstall="no" ForceDeleteOnUninstall="no"> <RegistryValue Name="DisabledByDefault" Type="integer" Value="0" NeverOverwrite="yes"/> <RegistryValue Name="Enabled" Type="integer" Value="1" NeverOverwrite="yes"/> </RegistryKey> </Component>
场景覆盖验证
修改后的逻辑可以覆盖所有预期场景:
- Windows 10及以上版本系统:组件判断条件不成立,完全不执行注册表写入操作
- 安装前系统已正确启用TLS 1.2客户端配置:组件判断条件不成立,不修改原有配置,后续卸载也不会触碰对应注册表项
- 安装前系统未启用/不存在TLS 1.2客户端配置:安装时自动写入启用TLS 1.2的正确参数,后续卸载时不会删除这部分配置,不会影响其他依赖TLS 1.2的程序运行
内容的提问来源于stack exchange,提问作者Joseph Willcoxson
相关产品推荐
相关产品推荐

