在MSI(InstallExecuteSequence)的哪一步提示UAC?

时间:2014-05-30 08:46:49

标签: wix windows-installer

当我使用UAC ON执行我的MSI时,UAC不会被提示一段时间。我试图在“CostFinalize”之前阅读自定义操作中的一些注册表项。如果找不到注册表项,我的注册表读取功能将考虑默认值。但在我的情况下,注册表项是存在的,但它无法读取,因为该键没有“用户”的读取权限。虽然管理员有完全许可。

在UAC提示之前,似乎发生了注册表读取。如何确保仅在启动时提示UAC,以便注册表读取成功。

问题解释

我们有一个用WIX编写的旧安装程序。我们在哪里编写安装位置的注册表项,如下所示

HKLM \ Software \ CompanyName \ Product \ Install \ CompInstallDir = [InstallDir] \ Product \ Component。

这个注册表项确实只有Admin的权限,即使用户没有读取权限我不知道为什么(我没有写那个代码)。 HKLM \ Software \ CompanyName \ Product \ Install

下还有一些其他条目

现在我必须更改安装程序代码才能进行升级。我必须阅读此安装位置,即[InstallDir] Product \ Component并将其修剪为[InstallDir]。所以我已经有一个现有的自定义操作(仅来自以前的安装程序代码),它读取注册表并设置Property INSTALLDIR,还有一些其他属性并做一些配置文件的备份。此自定义操作位于“InstallExecuteSequence”下,根据我的理解,如果需要,应提示UAC。在“CostFinalize”之前调用此自定义操作。

旧安装程序中应该存在的东西是编写仅包含[InstallDir]的注册表项,该注册表项不存在。由于这种自定义操作不是一种好的方法,但遗留代码必须维护它:(

希望我能够解释我的问题:)

2 个答案:

答案 0 :(得分:1)

this SO thread I explain how UAC prompts are triggered.。基本上,您需要一个引导程序,并在其manifest中相应地设置执行级别。

关于读取注册表的自定义操作。 为什么不使用Windows Installer的内置支持使用AppSearchRegLocator表进行注册表搜索?作为一般规则,不建议重新发明轮子。只需在Property table中定义属性(搜索名称)即可指定搜索的默认值。

答案 1 :(得分:0)

通常的最佳做法是将Install UI序列作为标准用户运行,并且如果构建MSI以使其需要,则Install Execute序列将提升。 (例如,写入每用户位置的每用户安装可能不需要提升)。

另一种最佳做法是使用AppSearch将注册表值读入属性。 AppSearch也以InstallUI序列运行,因此通常期望这些读取可以使用标准用户权限执行。

在您的情况下,您需要管理员进行阅读。在我写这些数百名安装程序的过程中,我从未有过这样的要求。为了给你更好的建议,我必须问这个注册表值的本质是什么,为什么它只能由管理员读取?读完之后,你打算用它做什么?

选项包括一个引导程序,用于提升整个安装程序,包括UI顺序,但通常不建议这样做。否则,您需要在没有模拟(SYSTEM上下文)的情况下运行延迟的自定义操作来执行读取,但此时您无法设置属性,因此您必须在此处使用注册表值以用于任何目的。

非常奇怪的要求......我正在检测代码味道。