wix - 在每台机器安装上删除 HKCU 下的注册表项

标签 wix wix3.6

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

卸载时,还应删除自己创建的 key 。删除这些键似乎并不容易。我正在与 ICE57 和/或 ICE38“战斗”。两者都提示 perUser 和 perMachine 数据之间的混合。

希望你能指出我解决这个问题的正确方向。

最佳答案

为了克服 ICE,您应该将 Per-User 注册表移动到单独的组件并使用一些注册表项作为该组件的 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 包的每个新版本(构建),您添加单独的条目(另请参阅我的最后说明)。我故意将每个用户的事件设置注册表用作 key 路径,因此您不会为当前用户运行它两次。

至于卸载后删除它们,
现在,希望您需要删除整个键,而不仅仅是一些值。在任何一种情况下,我都会创建自定义操作以在卸载期间为 Active Setup 添加注册表项(或者如果有很多这样的键/值,请创建和部署 .CMD 文件,并在卸载时启动它,在 RemoveFiles 操作之前,添加所有其中注册)。

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

所以这是所有这些的 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>

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

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

关于wix - 在每台机器安装上删除 HKCU 下的注册表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13516684/

相关文章:

crystal-reports - Wix 引导。检查 Sap Crystal reports 是否已安装

wix - 用于在失败的RegistrySearch未运行后设置属性的自定义操作

Wix 工具集 - 相同的 MSI 未重新安装

wix - 如何在 Wix Bootstrap 中使用复选框值?

installation - WIX:防止在卸载过程中删除预先存在的文件

WIX 数据库部署、安装

logging - Wix CustomAction session.Log 不起作用

WIX - 如何解决错误 LGHT0094 : Unresolved reference to symbol

localization - wix 内部字符串无法本地化

wix - '错误-2147467259 : failed to create SQL database' in WiX