使用管理员权限在 Wix msi 中运行 .exe

Posted

技术标签:

【中文标题】使用管理员权限在 Wix msi 中运行 .exe【英文标题】:Run .exe inside Wix msi with admin rights 【发布时间】:2016-03-01 01:26:25 【问题描述】:

我正在通过 Wix 中的 CustomAction 运行 .exe 文件。可执行文件正在运行,但没有管理员权限。似乎我做的一切都是正确的,但不确定出了什么问题。这是我的自定义操作的示例

<CustomAction Id="RunExe" FileKey="Setup" ExeCommand="-switch" Execute="deferred" Return="check" Impersonate="no"/>

<InstallExecuteSequence>
<Custom Action="RunExe" Before="InstallFinalize">NOT Installed</Custom>  
</InstallExecuteSequence>

实际的问题是这个通过ExeCommand执行的.exe无法访问注册表项(HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders)。

以管理员身份运行 msi 可以解决问题,但我需要一个解决方案,其中 WIX 本身应该能够以管理员身份运行命令或至少向用户提示。

【问题讨论】:

您希望提升的 exe 能够访问谁的 HKCU? HKCU 是在用户每次登录系统时创建的,并且始终适用于当前登录并使用系统的用户。 是的,但是带有 Execute="deferred" 和 Impersonate="no" 的自定义操作可能不会以登录用户身份运行。它可能以 SYSTEM 帐户运行。 除了使用 Execute="deferred" 和 Impersonate="no" 之外,没有其他选项可以在 msi 中运行 exe。还作为 s 系统帐户运行应该可以访问当前用户的注册表值吗?此外,我通过不读取 Shell 文件夹中的注册表值而不是调用 C++ 的 Shell 函数来获取用户字体目录的路径来解决了这个问题 如果这是唯一的方法,那些属性就没有必要了;也许您的 EXE 上有一个不正确的清单。无论如何,虽然您已经朝着正确的方向迈出了一步,但仍不清楚自定义操作的作用,我怀疑它应该使用本机 Windows Installer 功能来实现。 【参考方案1】:

每台机器安装中的延迟自定义操作使用系统帐户提升。目前尚不清楚访问 HKCU 密钥是什么意思,但是使用系统帐户运行的可执行文件的 HKCU 密钥是系统帐户的 HKCU,而不是安装用户的 HKCU。如果您确切地说出您想要实现的目标,那将会有所帮助,因为您可能根本不需要代码。如果您使用 WiX/MSI 的注册表功能,安装将为安装用户更新 HKCU,因此这可能是根本不需要代码的情况。

还不清楚为什么以管理员身份运行 MSI 可以解决问题,因为该自定义操作已经在每台计算机安装中提升了 InstallPrivileges。您的帖子中没有足够的信息作为您的安装上下文,但我的猜测是您可能会在没有提升 InstallPrivileges 的情况下进行每个用户安装 - 这是 MSI 将在安装用户的帐户下运行 CA 但他们不会的一种情况除非您按照您所说的方式提升整个安装 - 以管理员身份运行 MSI。

【讨论】:

以上是关于使用管理员权限在 Wix msi 中运行 .exe的主要内容,如果未能解决你的问题,请参考以下文章

一旦通过Wix安装到程序文件文件夹,C#exe就无法正常工作

如何设置 wix msi 以运行管理员广告

尝试从 WIX msi 运行嵌入式工具以进行选择性安装

如何使用 WiX 和 MSI 进行静默安装和卸载?

用于包装的 WiX 工具

Wix - 如何从安装目录安装后运行exe文件?