具有提升的自定义操作的提升安装程序不会提升可执行文件
本文关键字:可执行文件 程序 自定义 操作 安装 | 更新日期: 2023-09-27 18:32:05
我有一个安装程序,InstallPrivileges="elevated"
.我在文件表中包含一个应用程序.EXE
<Component Id="myapp" Guid="*">
<File Id="myapp" Source="myapp.exe"/>
</Component>
使用这些 CA 在提升状态下运行它:
<CustomAction Id="SetProp" Property="Launch" Value =""[INSTALLDIR]myapp.exe""/>
<CustomAction Id="Launch" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="ignore" Impersonate="no"/>
安排如下:
<Custom Action="SetProp" Before="Launch">NOT Installed</Custom>
<Custom Action="Launch" Before="InstallFinalize">NOT Installed</Custom>
但根据 Uachelper 类 (c#) 和缺少的结果,这个过程不是提升的,而是详细的日志和 myapp.exe 日志显示没有错误。
我还尝试使用类型 2 自定义操作(二进制密钥等)、类型 18 自定义操作(文件密钥等),并将 app.manifest 包含在 myapp 中.exe并具有 requiredadministrator。
在安装过程中,没有任何工作可以提升myapp.exe..。
我发现的解决方法是在安装完成后手动启动 myapp.exe(转到 [INSTALLDIR] 并双击 myapp.exe,将提示 uac 等),但我想避免这种情况。我也考虑过尝试使用runas
但不确定这是否有效或是否可行。
所有这些都是基于 http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.html,https://stackoverflow.com/a/10028939/4096653 以及更多关于SO的问题。
我错过了什么,或者我还能尝试什么?
默认情况下,仅当自定义操作在 InstallInitialize 和 InstallFinalize 之间延迟、不模拟和排序时,并且如果是每台计算机安装,才会提升自定义操作,然后它将使用系统帐户提升运行。它是否真正有效取决于代码是否准备好处理它不是以访问 HKCU、用户配置文件项(如 PersonalFolder)的交互式用户身份运行的,并且代码知道其数据的位置。当自定义操作可执行文件被触发时,它是通过 CreateProcess() 类型的调用(而不是 shell 执行调用),因此没有 UAC 对话框/清单检查内容正在进行。因此,如果您被推迟并且在安装完成之前,您的WiX发布看起来是正确的。我不知道 UACHelper 类是怎么想的,如果作为系统运行并提升。ProcessMonitor/Explorer可能会告诉您您的权限/令牌是什么。
如果创建一个模拟的启动器自定义操作来执行 exe 的显式 Shell 执行,它应该可以工作,因为这的行为类似于交互式用户从资源管理器运行的运行。它将运行该应用程序,只要执行安装的用户是管理员,该应用程序就会要求提升。在类似于ProcessStartInfo.UseShellExecute=true,ShellExecute() Win32的代码中。
如果需要提升模拟的 CA,则 MSI 需要以管理员身份运行,或者从具有提升清单的程序启动,然后运行 MSI。
你会看到很多建议(我希望)说你应该安排在你的应用程序第一次运行时自动运行它,只需启动它并记住它是否已运行。从 MSI 以提升的用户身份运行太复杂,除非您具有提升的启动引导程序。
我假设您希望它以执行顺序运行,并在 InstallExecuteSequence 中安排了自定义操作
可能是因为你的应用无法以本地系统用户身份运行,因此请尝试将模拟切换为是Impersonate="Yes"