2010-02-24 124 views
6

后,我有以下WiX的片段:执行需要提升一个自定义操作安装

<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1" /> 
<CustomAction Id="StartAppOnExit" 
       FileKey="Configurator.exe" 
       ExeCommand="" 
       Execute="immediate" 
       Impersonate="yes" 
       Return="asyncNoWait" /> 
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" 
      Value="Configure initial settings" /> 
<UI> 
    <Publish Dialog="ExitDialog" 
      Control="Finish" 
      Order="1" 
      Event="DoAction" 
      Value="StartAppOnExit" 
    >WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish> 
</UI> 

基本上就退出对话框我显示一个对话框,上面写着:启动应用程序。注意:这个应用程序需要提升。这一切工作正常,除了一个障碍。如果启用了UAC,似乎MSI会用用户令牌剔除并剥离它的组,因此当它试图启动需要提升的应用程序时,它不再是一个选项。

我如何将这些字符串串起来工作?

我试图夹住Impersonate =“no”,但在这一点上工作已经太迟了。

回答

12

UI序列作为受限用户运行,并通过调用CreateProcess启动应用程序。如果您将类似WixShellExec的内容与[WixShellExecTarget]一起使用,则它将像资源管理器一样运行,并在目标需要提升时显示UAC提示。或者你可以修改Configurator.exe以允许在没有提升特权的情况下启动,检测到这种情况并使用提升的权限重新启动。

例如,这应该工作:

<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1" /> 
<CustomAction Id="StartAppOnExit" BinaryKey="WixCA" DllEntry="WixShellExec" Execute="immediate" Return="check" Impersonate="yes"/> 
<Property Id="WixShellExecTarget" Value="[#Configurator.exe]"/> 
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Configure initial settings" /> 
<UI> 
    <Publish Dialog="ExitDialog" Control="Finish" Order="1" Event="DoAction" Value="StartAppOnExit">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish> 
</UI> 
0

仅供参考,立即自定义操作始终是模拟的(即他们总是因为谁执行MSI用户运行)。

我喜欢Michael Urman关于如何让Configurator.exe处理海拔问题的想法。

我不知道你是否也可以在EXE中包含一个清单,以便操作系统知道总是需要提升。

+2

关于您的疑问,问题是需要提升的组合,以及CreateProcess无法提升其创建的进程的事实。相反,CreateProcess返回ERROR_ELEVATION_REQUIRED,这是自定义代码可以处理的。 Windows Installer只报告错误。 – 2010-02-25 14:31:06

相关问题