我有一个安装程序InstallPrivileges="elevated"
。我在文件表中包含一个app.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的自定义操作(binarykey等),类型18的自定义操作(filekey等),并使用requiredadministrator将app.manifest包含在myapp.exe中。
在安装过程中没有任何措施可以提升myapp.exe..。
我发现的解决方法是在安装完成后手动启动myapp.exe(转到[INSTALLDIR]并双击myapp.exe,将提示uac等),但我想避免这种情况。我也考虑过尝试使用,runas
但不确定是否可行或可行。
所有这一切都基于http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.html,https://stackoverflow.com/a/10028939/4096653这里这么多的更多的问题。
我想念什么或还能尝试什么?
默认情况下,仅当自定义操作被推迟,不模拟并在InstallInitialize和InstallFinalize之间排序时(如果是每台计算机安装),它才会提升,然后使用系统帐户运行。它是否真正有效取决于代码是否准备好处理,因为它知道它不是以具有HKCU,PersonalFolder之类的用户个人资料项访问权限的交互式用户身份运行的,并且代码知道其数据在哪里。当自定义操作可执行文件被触发时,它是通过CreateProcess()类型的调用(不是外壳执行调用)触发的,因此没有UAC对话框/清单检查工作继续进行。因此,如果您推迟了安装WiF并在InstallFinalize之前发布的WiX看起来是正确的。我不知道如果UACHelper类作为系统运行并提升运行状态,会怎么想。
如果您创建一个模拟的启动器自定义操作来执行您的exe的显式Shell Execute,它应该可以工作,因为它的行为就像是交互式用户从Explorer运行的行为。它将运行该应用程序,然后该应用程序将要求提升权限,只要执行安装的用户是admin。在类似ProcessStartInfo.UseShellExecute = true的代码中,ShellExecute()Win32。
如果需要提升模拟的CA,则MSI需要以管理员身份运行,或者从带有提升清单的程序启动,然后再运行MSI。
您会看到很多建议(希望如此),您应该安排在首次运行应用程序时自动运行它,只是启动它并记住它是否已运行。除非您具有提升的启动引导程序,否则从MSI以提升的用户身份运行太复杂了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句