2010-02-24 87 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