我使用WiX 3.6构建了一个perMachine安装程序来安装我没有开发的软件。不幸的是,软件在执行过程中会在HKCU下创建一些注册表项。
卸载时,还应删除自创建的密钥。删除这些密钥似乎并不容易。我正在与ICE57和/或ICE38“战斗”。两人都抱怨perUser和perMachine数据的混用。
希望你能为我指出解决这个问题的正确方向。
发布于 2012-11-23 22:09:27
要克服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的观点:在卸载时保留每个用户的数据是一种常见的做法,但如果需要删除,那么活动安装是唯一真正的选择。
首先,我建议您在安装或重新安装时删除它们,而不是卸载,您只需添加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>注意:非常推荐在ActiveSetup中使用PackageCode,因此对于每个新版本(内部版本)的MSI包,您都会添加单独的条目(也请参阅我的最后说明)。我故意使用每个用户的活动设置注册表作为key-path,所以您不会为当前用户运行它两次。
至于在卸载后删除它们,现在,希望您需要删除整个键,而不仅仅是一些值。在任何一种情况下,我都会创建自定义操作,以便在卸载期间为活动设置添加注册表项(或者,如果有许多这样的项/值,则使用这些项/值创建和部署.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终端服务器上要小心;一旦为当前.MSI的一个用户运行了活动安装程序,如果您决定重新安装相同的软件包,它将不会再次运行,除非您在ActiveSetup注册表项下更改其PackageConde或提升版本。这些是另一天的主题,如果需要澄清,请让我知道。
不要忘记将上述所有组件添加到某些功能中。
发布于 2012-11-23 10:30:50
Windows Installer会考虑此用户数据,最佳做法是不将其删除。无论哪种方式,尝试删除它都是非常困难的,因为其他用户配置文件超出了范围/上下文。从理论上讲,可以编写自定义操作来枚举配置文件和加载注册表配置单元,但在某些版本的Windows ( Vista )上,由于授予windows installer服务的权限有限,这些操作将不起作用。
如果你真的,真的必须能够在卸载时删除自定义操作数据,那么看看:
Active Setup Explained
您需要留下一个程序(例如exe),方法是将一个组件标记为永久组件。然后,您将需要一个自定义操作来在卸载期间写入注册表值(因为Windows Installer不支持此操作)。
其概念是,在安装过程中,您放置了一个EXE,而在卸载过程中,您离开了。然后,您写入ActiveSetup注册表项,告诉它为每个后续用户运行一次EXE以登录到计算机。然后,EXE删除您的注册表值。如果需要从资源管理器中卸载扩展,请重新启动(礼貌地)。
但老实说,一个设计得更好的应用程序不需要所有这些。
https://stackoverflow.com/questions/13516684
复制相似问题