You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:12:21