使用LaunchAppAndWait在Installshield MSI项目中以管理员身份运行可执行文件

时间:2014-09-18 12:59:12

标签: windows-installer installshield installscript

我在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。在我的项目中从Custom Action调用此EXE。此方法在EXE设置中正常工作。因为EXE设置使用管理员权限运行我的EXE。但MSI没有这样做,也没能正常运行。

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

请有人给我解决方案。

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

在某些情况下,这种情况非常罕见,您需要在Windows Installer不允许的情况下提升。在这种情况下,你有两个糟糕的选择。第一个错误选项是将setup.exe上的清单更改为始终以管理员身份运行。这会尝试完全避免有限的权限上下文,但这通常会在维护期间或者如果未使用setup.exe启动安装时崩溃。

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

(另外,将LAAW_SHELLEXECUTEVERB设置为runas可以在Windows Vista及更高版本上提升不需要管理权限的exe。)