如何在卸载 MSI 时删除单个注册表值?

Posted

技术标签:

【中文标题】如何在卸载 MSI 时删除单个注册表值?【英文标题】:How to remove a single registry VALUE at uninstall of an MSI? 【发布时间】:2011-05-03 04:21:39 【问题描述】:

我的应用程序有时会在执行期间创建一个特定的注册表值,即不在安装时创建。该值在我不想删除的注册表项中;我只想删除我创建的值。因为它不是在安装时创建的,所以 Windows 安装程序在卸载时不会自动删除它。如果该值存在,我可以在 MSI 中做什么来删除它?

Registry 表似乎没有这个选项。这是否意味着我必须编写自定义操作?如果是这样,有人有任何例子吗?

我正在使用 Wise Windows Installer Edition 创建 MSI。

还发布了here。

【问题讨论】:

很遗憾微星没有提供标准技术来移除 RegistryValue。例如我们应该如何删除 HKCU/Windows/Current/Version/Run/My Program 【参考方案1】:

您确实需要执行自定义操作。

我最终通过在 Deferred 部分中的 WriteRegistryValues 之后放置一个自定义操作来实现这一点。

删除key的.vbs是这样的:

const HKLM = &H80000002
strComputer = "."
Set oReg=GetObject("winmgmts:impersonationLevel=impersonate!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\Mozilla\Firefox\Extensions"
strValueName = "myext@myco.com"
oReg.DeleteValue HKLM,strKeyPath,strValueName

【讨论】:

【参考方案2】:

抱歉,您需要自定义操作。

【讨论】:

不幸的是,这是在组件安装未卸载时删除注册表项。 你是对的。我正在考虑具有名为 msidbRemoveFileInstallModeOnRemove 的属性的 RemoveFile 表。我不知道此注册表值是什么,但可以将其保留在卸载状态,但确保在下次安装时将其删除吗?从应用程序运行时的角度来看,我认为结果是一样的。还是这个注册表值在操作系统级别而不是应用程序本身操作?我知道要在卸载期间写入一个新值,我需要一个自定义操作。 价值是将我的软件注册为 Firefox 的扩展,所以不,将它留在那里会很糟糕,因为它会影响其他软件。届时将是一个自定义操作!

以上是关于如何在卸载 MSI 时删除单个注册表值?的主要内容,如果未能解决你的问题,请参考以下文章

WiX:如何防止注册表值在卸载时被删除?

如何从包含多个 MSI 的 wix 自定义引导程序包中安装/卸载单个 msi,例如安装项目的添加/删除功能?

如何获取安装目录?

如何在卸载时取消注册 wpf clickonce 应用程序?

如何删除注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\rising

如何在卸载开始前执行程序?