首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在每台计算机上的安装中删除HKCU下的注册表项

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

Stack Overflow用户
提问于 2012-11-23 00:22:10
回答 2查看 9.4K关注 0票数 12

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

卸载时,还应删除自创建的密钥。删除这些密钥似乎并不容易。我正在与ICE57和/或ICE38“战斗”。两人都抱怨perUser和perMachine数据的混用。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-23 22:09:27

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

代码语言:javascript
运行
复制
<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代码:

代码语言:javascript
运行
复制
<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-path,所以您不会为当前用户运行它两次。

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

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

下面是所有这些的WiX代码:

代码语言:javascript
运行
复制
<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的一个用户运行了活动安装程序,如果您决定重新安装相同的软件包,它将不会再次运行,除非您在ActiveSetup注册表项下更改其PackageConde或提升版本。这些是另一天的主题,如果需要澄清,请让我知道。

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

票数 9
EN

Stack Overflow用户

发布于 2012-11-23 10:30:50

Windows Installer会考虑此用户数据,最佳做法是不将其删除。无论哪种方式,尝试删除它都是非常困难的,因为其他用户配置文件超出了范围/上下文。从理论上讲,可以编写自定义操作来枚举配置文件和加载注册表配置单元,但在某些版本的Windows ( Vista )上,由于授予windows installer服务的权限有限,这些操作将不起作用。

如果你真的,真的必须能够在卸载时删除自定义操作数据,那么看看:

Active Setup Explained

您需要留下一个程序(例如exe),方法是将一个组件标记为永久组件。然后,您将需要一个自定义操作来在卸载期间写入注册表值(因为Windows Installer不支持此操作)。

其概念是,在安装过程中,您放置了一个EXE,而在卸载过程中,您离开了。然后,您写入ActiveSetup注册表项,告诉它为每个后续用户运行一次EXE以登录到计算机。然后,EXE删除您的注册表值。如果需要从资源管理器中卸载扩展,请重新启动(礼貌地)。

但老实说,一个设计得更好的应用程序不需要所有这些。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13516684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档