在每台计算机安装中删除 HKCU 下的注册表项

2024-05-17

我使用 WiX 3.6 构建了一个 perMachine 安装程序来安装我尚未开发的软件。不幸的是,该软件在执行期间在 HKCU 下创建了一些注册表项。

卸载时,还应删除自行创建的密钥。移除这些钥匙似乎并不那么容易。我正在与 ICE57 和/或 ICE38“战斗”。两者都抱怨每个用户和每个机器数据之间的混合。

希望您能为我指明解决此问题的正确方向。


为了克服 ICE,您应该将每用户注册表移至单独的组件,并使用某些注册表项作为该组件的 keyPath,即:

<Component Id='PerUserRegistry' Guid='*'>
  <RegistryValue Id="PerUserRegistry_KeyPAth" KeyPath="yes" Root="HKCU" Key="Software\[Manufacturer]\[ProductName]\[ProductCode]\PerUserRegistry" Name="[PackageCode]" Value="[ProductVersion]" Type="string" />
  <!--Other Per-user registry goes here-->
</Component>

我完全同意 Christopher 的观点:在卸载时保留每个用户的数据是常见的做法,但如果需要删除,那么 Active Setup 是唯一真正的选择。

首先,我建议您在安装或重新安装时删除它们而不是卸载,您只需要添加RemoveRegirty条目和Active Setup,即使用以下WiX代码:

<Component Id='ActiveSetup' Guid='*'>
  <RegistryValue Id="ActiveSetup00" Root="HKLM" KeyPath="yes" Key="SOFTWARE\SOFTWARE\Microsoft\Active Setup\Installed Components\[PackageCode]\" Name="StubPath" Value="msiexec /fup [ProductCode] /qb-!" Type="string" />
  <RegistryValue Id="ActiveSetup01" Root="HKLM" Key="SOFTWARE\SOFTWARE\Microsoft\Active Setup\Installed Components\[PackageCode]\" Value="[ProductName] [ProductVerion] Configuration" Type="string" />
</Component>
<Component Id='PerUserRegistryCleanup' Guid='*'>
  <RegistryValue Id="PerUserRegistry_KeyPath" Root="HKCU" KeyPath="yes" Key="SOFTWARE\SOFTWARE\Microsoft\Active Setup\Installed Components\[PackageCode]\" Name="StubPath" Value="msiexec /fup [ProductCode] /qb-!" Type="string" />
  <RemoveRegistryKey Id='PerUserRegCleanup' Root='HKCU' Action='removeOnInstall' Key='Key\To\Be\Removed'/>
</Component>

注意:强烈建议在 ActiveSetup 中使用 [PackageCode],因此对于 MSI 包的每个新版本(构建),您都需要添加单独的条目(另请参阅我的最后注释)。我故意使用每用户主动安装注册表作为密钥路径,因此您不会为当前用户运行它两次。

至于卸载后删除它们, 现在,希望您需要删除整个键,而不仅仅是某些值。在任何一种情况下,我都会创建自定义操作以在卸载期间添加活动安装程序的注册表条目(或者如果有许多此类键/值,请使用这些键/值创建和部署 .CMD 文件,并在卸载时启动它,然后在删除文件操作之前添加所有其中到注册表)。

注意:我强烈建议在安装过程中添加删除此注册表,否则您可能最终会在安装软件时删除每个用户的值。

这是所有这些的 WiX 代码:

<CustomAction Id="CA_UninstallRegistryCleanUp" Directory="SystemFolder" ExeCommand="REG.exe ADD &quot;HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\MySoftName_CleanUp&quot; /v StubPath /d &quot;reg add ^&quot;HKCU\Key\To\Be\Removed^&quot; /va /f&quot; /f" Return="ignore" />
<InstallExecuteSequence>
  <Custom Action='CA_UninstallRegistryCleanUp' After='RemoveRegistryValues'>REMOVE~="ALL"</Custom>
</InstallExecuteSequence>

<Component Id='RegCleanup_Remover' Guid='*'>
  <RegistryValue Id="PerUserRegistry_KeyPAth" Root="HKLM" KeyPath="yes" Key="SOFTWARE\[Manufacturer]\[ProductName]\[ProductCode]\" Name="DummyKey" Value="[ProductVersion]" Type="string" />
  <RemoveRegistryKey Id='RegCleanup_Remover' Root='HKLM' Action='removeOnInstall' Key='SOFTWARE\Microsoft\Active Setup\Installed Components\MySoftName_CleanUp'/>
</Component>

最后注意事项: 所有这些主动安装的东西只有两个小问题:在 Windows 终端服务器上要小心;一旦为当前 .MSI 的一个用户运行了主动安装,如果您决定重新安装相同的软件包,它将不会再次运行,除非您更改其 PackageConde 或在 ActiveSetup 注册表项下提升版本。这些是改天的主题,如果需要澄清,请告诉我。

并且不要忘记将上述所有组件添加到某些功能中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在每台计算机安装中删除 HKCU 下的注册表项 的相关文章

  • 无法使用 WiX 安装程序创建注册表项值

    以下组件按预期执行所有操作 但无法写入最后一个注册表项值 我没有收到任何错误
  • 我应该如何处理 WiX 安装程序中的产品升级?

    我有一个相当大的 WiX 安装程序 250 Mb 以上 我正在尝试制定合适的升级策略 安装程序中的大多数文件都不会更改 并且当只有一两个文件发生更改时 我们不希望分发整个包 我研究了主要和次要升级 我的理解是 如果产品 ID 发生变化 只要
  • 获取生成的 ProductCode 作为 Wix 中的变量

    在我们的产品中我们使用Product Id 在 Wix 中告诉它为每个新版本生成新的产品代码 现在 我们需要在安装期间将正在安装的 MSI 的产品代码记录到我们的注册表项之一中 我们可以通过循环遍历 卸载 注册表项中的条目来查找产品名称和版
  • 如何创建 heat.exe 收集的文件的快捷方式?

    使用 WiX Toolset 3 10 并尝试创建已使用 WiX Toolset 收获的某些文件的快捷方式heat exe效用 如 WIX bin heat exe dir SourceDir nologo platform x64 ke
  • 从对话框调用 CustomAction 时出现 WiX 安装错误 2762

    我是初学者 开始学习WiX 我想在安装过程中捕获 验证和注册用户详细信息 我创建了一个对话框来捕获用户注册并在用户单击 下一步 后调用自定义操作 但在这里我收到安装程序错误 2762 虽然错误描述说 必须在 InstallInitializ
  • 根据 VS 活动配置定义 Wix 属性和值

    如何定义根据激活的 Visual Studio 配置而变化的 Wix 属性和值 例如对于我们的发布版本 var x 1 对于导出版本 var x 2 我们使用 wixproj 文件将属性传递到 WiX
  • 使用“Any CPU”而不是“X86”编译wix项目

    当我编译一个wix项目 并且wix通过MSbuild启动所有现有项目的编译时 我可以使用 任何CPU 而不是 X86 或 64位 吗 如果没有 我如何使用 任何CPU 编译项目 如果您的问题是是否可以编译 WIXPROJAny CPU那么答
  • WiX - 安装 Windows 服务以在 x64 模式下运行

    我正在使用 WiX 3 5 及其 ServiceInstall 标签安装 Windows 服务
  • wix 3 安装程序:未解析的绑定时变量!(bind.fileVersion.Name.exe)

    我正在尝试使用 Wix3 中的绑定 bind fileVersion 即 3 11 1 由于某些原因 我收到以下错误消息 未解析的绑定时变量 bind fileVersion TestWix3 exe 我的目标是填写 产品 ID 行 特别是
  • 将构建参数传递给 .wxs 文件以动态构建 wix 安装程序

    我是一名学生开发人员 我已经为我现在工作的公司构建了几个安装程序 所以我对WIX还是比较熟悉的 我们最近决定拥有一个构建服务器来自动构建我们的解决方案 它构建调试和发布以及混淆 和非混淆 项目 你真的不需要理解这些 您需要了解的是 我有相同
  • 验证服务是否被标记为删除

    有时 当我卸载安装程序 使用 WIX 创建的 时 服务仍标记为删除 用户必须重新启动计算机才能再次安装 我如何验证该服务是否已标记为删除并告诉用户在进行其他安装之前重新启动计算机 一般来说 当某项服务仍然锁定在该服务上 从而阻止 Windo
  • 在 WiX 文件中,Name="SourceDir" 指的是什么?

    WiX 文件似乎总是包含这一行
  • 如何在自定义操作期间移动进度条

    在安装程序中运行自定义操作时 没有进度条 我们正在使用立即 C 管理代码自定义操作 运行自定义操作时是否有其他方法显示进度 预先致谢 维卢 使用 ProgressText 元素 模板 属性是放置标记以反映进度的地方 例如 请参阅标准 Ins
  • 让 WiX Bootstrapper 用于 .NET 4.0 的引导

    我一直在寻找让我的引导程序能够安装 NET 4 0 和我自己的应用程序 我查看了几个博客和教程 但无法让它发挥作用 我在 Stack Overflow 问题中读到在 WiX 中启动 调用引导程序 https stackoverflow co
  • 无法使用wix工具集创建postgresql数据库

    我正在尝试使用 Wix ToolSet 在 PostgreSQL 中创建数据库 但总是收到错误 错误 2147467259 无法创建 SQL 数据库 pontow 错误详细信息 未知错误 当我尝试创建数据库或错误 无法连接到 SQL 数据库
  • 如何引导 SQL Server 2008 Express SP1?

    我正在尝试将 SQL Server 2008 Express SP1 引导到我的应用程序中 之前我使用 Wise for Windows 来执行必备安装 但 Wise 尚不支持 Windows Installer 4 5 我现在尝试将 Vi
  • WiX Installer:获取正在升级的产品版本

    在从版本 X 到版本 Y 的主要升级过程中 我需要一个属性 变量来表明版本 X 正在升级 当使用 WiX Installer 构建的安装程序对产品进行主要升级时 是否有办法获取正在升级的版本号 假设您使用 WiX Majorupgrade
  • Wix 安装结束后添加多个复选框

    我的 C 应用程序有一个设置 在设置结束时 我添加了一个建议启动应用程序的复选框 效果很好 但我无法添加第二个复选框来提议启动可选安装程序 有我的代码
  • 在 Azure DevOps 中为 Wix MSI 文件生成 GUID

    我正在为 Web 服务器应用程序和 Sitecore 前端应用程序设置 Wix 安装程序 我的问题并非特定于 Web 服务器或 Sitecore 我的问题是 Wix 以及如何使用它进行持续交付 1 Wix 需要每个文件和产品本身的 GUID
  • 重新缓存的 msi 仍在运行旧的自定义操作

    我已对 msi 文件中的自定义操作进行了更改 以便在服务停止或停止挂起时不尝试停止 Windows 服务 但是 在使用 msiexec fv mymsi msi 重新缓存 msi 后 当运行到下一个版本的主要升级 其中也有更正的服务停止自定

随机推荐