【问题标题】:Elevated installer with elevated custom action does not elevate executable具有提升的自定义操作的提升的安装程序不会提升可执行文件
【发布时间】:2016-06-11 01:21:23
【问题描述】:

我有一个InstallPrivileges="elevated" 的安装程序。我在文件表中包含一个 app.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 自定义操作(文件密钥等)并使用 requiredadministrator 将 app.manifest 包含到 myapp.exe 中。

在安装过程中没有提升 myapp.exe..。

我发现的解决方法是在安装完成后手动启动 myapp.exe(转到 [INSTALLDIR] 并双击 myapp.exe,会提示 uac 等),但我想避免这种情况。 我也想过尝试使用runas,但不确定这是否可行或是否可行。

所有这些都基于http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.htmlhttps://stackoverflow.com/a/10028939/4096653 以及更多关于 SO 的问题。

我缺少什么或者我还能尝试什么?

【问题讨论】:

    标签: c# .net wix installation


    【解决方案1】:

    默认情况下,仅当自定义操作在 InstallInitialize 和 InstallFinalize 之间被延迟、不模拟和排序时才会提升,并且如果它是每台计算机安装,然后它将使用系统帐户提升运行。它是否真正起作用取决于代码是否准备好处理意识到它不是作为具有访问 HKCU、用户配置文件项目(如 PersonalFolder)的交互式用户运行的代码,并且代码知道其数据在哪里。当自定义操作可执行文件被触发时,它是通过 CreateProcess() 类型的调用(不是 shell 执行调用),因此没有 UAC 对话框/清单检查内容正在进行。因此,如果您被推迟并且在 InstallFinalize 之前发布,那么您发布的 WiX 看起来是正确的。我不知道 UACHelper 类是否作为系统运行并提升了。 ProcessMonitor/Explorer 可能会告诉您您的权利/令牌是什么。

    如果您创建一个模拟的启动器自定义操作,该操作执行您的 exe 的显式 Shell 执行,它应该可以工作,因为它的行为就像交互式用户从资源管理器运行一样。只要执行安装的用户是管理员,它将运行应用程序,然后请求提升。在类似于 ProcessStartInfo.UseShellExecute=true, ShellExecute() Win32 的代码中。

    如果您需要提升模拟 CA,则 MSI 需要以管理员身份运行,或者从具有提升清单的程序启动,然后运行 ​​MSI。

    您会看到很多建议(我希望)说您应该安排在您的应用第一次运行时自动运行它,只需启动它并记住它是否已经运行。除非您有一个提升的启动引导程序,否则从 MSI 以提升的用户身份运行太复杂了。

    【讨论】:

    • 澄清一下:我有提升 CA 的所有要求,我的 MSI 也以管理员身份运行。但即便如此,type 2、type 18 CA 和 quiet exec 也无法提升 myapp.exe。要将其提升为当前用户(而不是系统帐户),我必须创建另一个将调用 Launcher 应用程序的提升 CA。然后,此启动器应用程序将使用 shellexecute 调用 myapp.exe,以 UAC 窗口提示当前用户。我理解对了吗?
    • 这听起来很正确 - 进行健全性检查应该相当容易,并且您需要决定在启动器完成后是否应该继续整个安装,或者是否应该等待启动 CA。
    【解决方案2】:

    我假设您希望它以执行顺序运行,并已在 InstallExecuteSequence 中安排了您的自定义操作

    这可能是因为您的应用无法以本地系统用户身份运行,因此请尝试将 Impersonate 切换为 yes Impersonate="Yes"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 1970-01-01
      相关资源
      最近更新 更多