Wix 在每台计算机上删除HKCU下的注册表项
我使用WIX3.6构建了一个perMachine安装程序来安装一个我没有开发的软件。不幸的是,该软件在执行过程中在HKCU下创建了一些注册表项 卸载时,还应删除自行创建的密钥。拔下这些钥匙似乎不那么容易。我正在与ICE57和/或ICE38“战斗”。两者都抱怨perUser和perMachine数据的混合Wix 在每台计算机上删除HKCU下的注册表项,wix,wix3.6,Wix,Wix3.6,我使用WIX3.6构建了一个perMachine安装程序来安装一个我没有开发的软件。不幸的是,该软件在执行过程中在HKCU下创建了一些注册表项 卸载时,还应删除自行创建的密钥。拔下这些钥匙似乎不那么容易。我正在与ICE57和/或ICE38“战斗”。两者都抱怨perUser和perMachine数据的混合 希望您能为我指出解决此问题的正确方向。Windows Installer会考虑此用户数据,最佳做法是不删除它。无论哪种方式,都很难尝试删除它,因为其他用户配置文件超出范围/上下文。理论上,可以编
希望您能为我指出解决此问题的正确方向。Windows Installer会考虑此用户数据,最佳做法是不删除它。无论哪种方式,都很难尝试删除它,因为其他用户配置文件超出范围/上下文。理论上,可以编写自定义操作来枚举配置文件和加载注册表配置单元,但在某些版本的Windows(Vista)上,由于授予Windows installer服务的权限受限而无法工作 如果您确实必须能够在卸载时删除自定义操作数据,请查看: 您需要将一个组件标记为永久,从而留下一个程序(例如exe)。然后,您将需要一个自定义操作来在卸载期间写入注册表值(因为Windows Installer不支持此操作) 这个概念是在安装过程中你放下一个EXE,在卸载过程中你离开你。然后写入ActiveSetup注册表项,告诉它为每个后续用户登录到计算机运行一次EXE。然后EXE将删除您的注册表值。如果需要从资源管理器卸载扩展,请重新启动(礼貌地)
但老实说,一个设计更好的应用程序并不需要所有这些。为了克服ICE,您应该将每个用户的注册表移动到单独的组件,并使用一些注册表项作为该组件的键路径,即:
<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的观点:卸载时保留每个用户的数据是常见的做法,但是如果需要删除,那么活动安装是唯一的实际选择
首先,我建议您在安装或重新安装时删除它们,而不是卸载,您只需添加RemoveRegirty条目和活动安装程序,即使用以下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>
注意:[PackageCode]非常推荐在ActiveSetup中使用,因此在MSI软件包的每个新版本(构建)中,您都会添加单独的条目(另请参见我的最终说明)。我故意使用每个用户的活动安装注册表作为键路径,所以您不会为当前用户运行它两次
至于卸载后删除它们,
现在,希望您需要删除整个键,而不仅仅是一些值。在任何一种情况下,我都会创建自定义操作,以便在卸载期间为活动安装程序添加注册表项(或者,如果有许多这样的键/值,则使用这些键/值创建并部署.CMD文件,并在卸载时启动该文件,然后再执行RemoveFiles操作,以便将它们全部添加到注册表)
注意:我强烈建议在安装期间添加或删除此注册表,否则在软件尚未安装时,您可能会删除每个用户的值
下面是所有这些的WiX代码:
<CustomAction Id="CA_UninstallRegistryCleanUp" Directory="SystemFolder" ExeCommand="REG.exe ADD "HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\MySoftName_CleanUp" /v StubPath /d "reg add ^"HKCU\Key\To\Be\Removed^" /va /f" /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终端服务器上要小心;一旦为current.MSI的一个用户运行了活动安装程序,如果您决定重新安装同一软件包,它将不会再次运行,除非您在ActiveSetup注册表项下更改其PackageConde或提升版本。这些是另一天的话题,如果需要澄清,请告诉我
不要忘记将上述所有组件添加到某些功能中。扩展资源管理器上下文菜单的注册表项。如果不删除它,将导致放弃菜单。为什么它是按用户而不是按机器扩展的?更新了答案,在我当前的解决方案中包含对黑客的引用我在安装时创建密钥,以便在卸载时删除它们。遗憾的是,并非所有用户都通过软件配置了上下文菜单。谢谢你指出我的活动设置方式。链接引用的文章似乎不再可用,我在谷歌上搜索这是相同的吗?