我在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设置。)
请有人给我解决方案。
提前致谢。
答案 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。)