【问题标题】:Run the executable file as administrator in Installshield MSI project using LaunchAppAndWait使用 LaunchAppAndWait 在 Installshield MSI 项目中以管理员身份运行可执行文件
【发布时间】:2014-11-12 19:56:42
【问题描述】:

我在 Installshield 中创建了一个 MSI 项目,并添加了我的 installscript 方法作为安装某些支持驱动程序项的自定义操作。我正在使用“LaunchAppAndWait”方法来启动带有参数的可执行文件。

LaunchAppAndWait("C:\\Windows\\System32\\RUNDLL32.exe", szWBW, LAAW_OPTION_WAIT);

szWBW 是我传递给 EXE 文件的参数字符串。当我以管理员身份通过命令行执行此可执行文件时,它工作正常。如果没有管理员权限,它将失败。

当我运行我的 MSI 设置时,此行将无法正常运行并返回类似“无法完成操作 0x000007b”错误消息。所以为了解决这个问题,我想以管理员身份运行它。到目前为止,我找不到任何解决方案来以管理员身份运行此特定行。

我也尝试了另一种方法来运行 EXE。使用以下内容创建了 bat 文件

cd C:\Windows\System32\
C:\Windows\System32\RUNDLL32.exe szWBW

然后我通过转换器工具将其制作为 EXE。在我的项目中从自定义操作调用这个 EXE。此方法在 EXE 设置中运行良好。因为 EXE 安装程序以管理员权限运行我的 EXE。但是 MSI 没有这样做并且无法正常运行。

(注意:我必须需要 MSI 设置而不是 EXE 设置。)

请任何人给我解决这个问题的解决方案。

提前致谢。

【问题讨论】:

  • 自定义操作可能是即时的,因此不会以提升的方式运行。改为延迟,这是开始的地方,并基于 [WindowsFokder] 属性 msdn.microsoft.com/en-us/library/aa372816(v=vs.85).aspx 的路径,如果这是 64 位系统上的 32 位设置,您可能会遇到问题。

标签: windows-installer installshield installscript


【解决方案1】:

我们鼓励您以有限的权限运行基于 MSI 的设置。其中一部分溢出到始终在启动 MSI 的用户上下文中运行的非延迟操作,以及具有该选项的延迟操作。因此,正如 PhilDW 评论的那样,如果您可以将自定义操作设置为运行 Deferred in System Context,则可以为操作(以及它启动的 exe)提供所需的提升。您应该进一步考虑使用 UseDLL 和相关的 InstallScript API,而不是调用 RunDll32,但这只是一种潜在的优化。

在某些情况下(这种情况很少见),您需要在 Windows Installer 不允许的时候提升。在这种情况下,您有两个不好的选择。第一个不好的选择是将 setup.exe 上的清单更改为始终以管理员身份运行。这试图完全避免受限权限上下文,但这通常会在维护期间或如果 setup.exe 不用于启动安装时失效。

第二个不好的选择是使用LaunchApplication 而不是LaunchAppAndWait,并包含选项LAAW_OPTION_USE_SHELLEXECUTE。使用 ShellExecute,可以显示 UAC 提示以提升新启动的可执行文件。如果没有 ShellExecute(即使用 CreateProcess),则不会显示 UAC 提示。这种情况是不可取的,因为它会导致用户接受额外的 UAC 提示。

(顺便说一句,在 Windows Vista 及更高版本上,将 LAAW_SHELLEXECUTEVERB 设置为 runas 允许您提升不需要管理权限的 exe。)

【讨论】:

  • 根据您的指导,我使用“LaunchApplication”而不是“LaunchAppAndWait”,并且还使用“Deferred in System Context”进行自定义操作。它对我来说效果很好。 :)
猜你喜欢
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
相关资源
最近更新 更多