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

时间:2014-11-27 02:03:14

标签: c# .net wix installer

我有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自定义操作(binarykey等),类型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的问题。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

我假设你希望它在Execute序列中运行并在InstallExecuteSequence中安排自定义操作

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