Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wix 在每台计算机上删除HKCU下的注册表项_Wix_Wix3.6 - Fatal编程技术网

Wix 在每台计算机上删除HKCU下的注册表项

Wix 在每台计算机上删除HKCU下的注册表项,wix,wix3.6,Wix,Wix3.6,我使用WIX3.6构建了一个perMachine安装程序来安装一个我没有开发的软件。不幸的是,该软件在执行过程中在HKCU下创建了一些注册表项 卸载时,还应删除自行创建的密钥。拔下这些钥匙似乎不那么容易。我正在与ICE57和/或ICE38“战斗”。两者都抱怨perUser和perMachine数据的混合 希望您能为我指出解决此问题的正确方向。Windows Installer会考虑此用户数据,最佳做法是不删除它。无论哪种方式,都很难尝试删除它,因为其他用户配置文件超出范围/上下文。理论上,可以编

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

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


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

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 &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终端服务器上要小心;一旦为current.MSI的一个用户运行了活动安装程序,如果您决定重新安装同一软件包,它将不会再次运行,除非您在ActiveSetup注册表项下更改其PackageConde或提升版本。这些是另一天的话题,如果需要澄清,请告诉我


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

扩展资源管理器上下文菜单的注册表项。如果不删除它,将导致放弃菜单。为什么它是按用户而不是按机器扩展的?更新了答案,在我当前的解决方案中包含对黑客的引用我在安装时创建密钥,以便在卸载时删除它们。遗憾的是,并非所有用户都通过软件配置了上下文菜单。谢谢你指出我的活动设置方式。链接引用的文章似乎不再可用,我在谷歌上搜索这是相同的吗?