Wix4 如何在安装后启动 GUI 提升的应用程序

问题描述 投票:0回答:1

安装完成后,我需要以提升用户(管理员)身份启动 GUI 应用程序,并且我还想检查应用程序的退出代码。

我知道在 CustomAction 上,您可以将 Impersonate 设置为 false 以以 SYSTEM 用户身份执行它。 但我的应用程序无法以系统用户身份运行,它需要以管理员或提升用户身份执行。

如果我将 Impersonate 设置为 true,则应用程序将以普通用户身份启动,并且不会显示 UAC,因此我的应用程序没有足够的权限来执行。

我发现的唯一技巧是通过 cmd 启动我的应用程序,但这样我就丢失了退出代码,并且安装程序在我的应用程序启动之前成功完成。

<CustomAction Id="TRIGGER_CONFIGURE_AFTER_INSTALL_FINALIZE" Execute="immediate" Return="check" ExeCommand="cmd.exe /c start /b configure.exe &amp;&amp; exit 0" Directory="INSTALLDIR"></CustomAction>
<InstallExecuteSequence>
    <Custom Action="TRIGGER_CONFIGURE_AFTER_INSTALL_FINALIZE" After="InstallFinalize" Condition="NOT Installed"></Custom>
</InstallExecuteSequence>
wix windows-installer wix4
1个回答
0
投票

要在 WiX 设置中完成安装后以提升的用户身份启动 GUI 应用程序,您可以使用

CustomAction
元素和
ExeCommand
来运行以提升的权限启动应用程序的命令。但是,您需要小心处理退出代码。

如何实现此目标的示例:

<CustomAction Id="TRIGGER_CONFIGURE_AFTER_INSTALL_FINALIZE" Execute="immediate" Return="asyncNoWait" Impersonate="no"
              ExeCommand='cmd.exe /C "start /wait "" "[INSTALLDIR]configure.exe"" &amp;&amp; exit /b %errorlevel%"'
              Directory="INSTALLDIR">
</CustomAction>

<InstallExecuteSequence>
    <Custom Action="TRIGGER_CONFIGURE_AFTER_INSTALL_FINALIZE" After="InstallFinalize" Condition="NOT Installed"></Custom>
</InstallExecuteSequence>

利用具有

CustomAction
Execute="immediate", Return="asyncNoWait"
属性的
Impersonate="no"
元素。
ExeCommand
参数包括使用
cmd.exe
启动具有提升权限的应用程序
configure.exe
的命令。
start /wait
确保安装程序等待该过程完成,并且
exit /b %errorlevel%
将应用程序的退出代码传播回安装程序。尽管使用
cmd.exe
是一种常见的解决方法,但可以根据您的具体设置要求考虑替代方法,例如计划任务或单独的启动器可执行文件。

但是,如果您需要以提升的权限运行应用程序,但又不想使用

Impersonate="false"
,因为它以 SYSTEM 用户身份运行自定义操作,则可以考虑使用计划任务和单独的启动程序可执行文件的组合。此方法允许您以提升的权限执行应用程序,而无需牺牲 SYSTEM 用户。 开发一个小型可执行文件,负责以提升的权限启动主应用程序。您可以使用
rundll32
等工具或用
C#
等语言编写的自定义启动器。在 WiX 脚本中,安排一个任务来运行启动程序可执行文件。计划任务可以配置为以提升的权限运行。

WiX 自定义操作

<CustomAction Id="LaunchApp" Directory="INSTALLDIR" Execute="deferred" Impersonate="no" Return="asyncNoWait" 
              ExeCommand='"[INSTALLDIR]Launcher.exe"' />

安装执行序列

<InstallExecuteSequence>
    <Custom Action="LaunchApp" After="InstallFinalize" />
</InstallExecuteSequence>

最后创建一个单独的可执行文件

(e.g., Launcher.exe)
,它将以提升的权限运行您的主应用程序。为此,您可以使用 C++ 中的
ShellExecute
或 C# 中的
Process.Start
等工具

这种方式可以避免以系统用户身份运行自定义操作,同时仍然允许您的应用程序以必要的提升权限执行

© www.soinside.com 2019 - 2024. All rights reserved.