具有提升的自定义操作的提升安装程序不会提升可执行文件

本文关键字:可执行文件 程序 自定义 操作 安装 | 更新日期: 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 ="&quot;[INSTALLDIR]myapp.exe&quot;"/>
<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"