2010-02-24 6 views
6

Je l'extrait de code WiX suivant:L'exécution d'une action personnalisée qui nécessite une élévation après l'installation

<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> 

Fondamentalement la boîte de dialogue de sortie j'afficher une boîte qui dit: application de lancement. Note: cette application nécessite une élévation. Tout cela fonctionne bien, sauf pour un problème. Si l'UAC est activé, il semble que le MSI faufile avec le jeton utilisateur et dépouille ses groupes, alors quand il essaie de lancer l'application qui nécessite une élévation, ce n'est plus une option.

Comment puis-je enchaîner ceci pour travailler?

J'ai essayé de taper un Impersonate = "non", mais il est trop tard à ce moment-là pour que cela fonctionne.

Répondre

12

La séquence de l'interface utilisateur s'exécute en tant qu'utilisateur limité et lance les applications avec un appel à CreateProcess. Si vous utilisez quelque chose comme un WixShellExec avec [WixShellExecTarget] à la place, il agira comme Explorer et affichera une invite UAC si la cible nécessite une élévation. Ou vous pouvez modifier votre Configurator.exe pour autoriser son lancement sans privilèges élevés, détecter ce cas et le relancer avec des privilèges élevés.

Par exemple, cela devrait fonctionner:

<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

Pour votre information, des actions personnalisées immédiates sont toujours emprunt d'identité (à savoir qu'ils exécutent toujours comme l'utilisateur qui exécute le MSI).

J'aime l'idée de Michael Urman concernant la création de votre Configurator.exe pour gérer le problème d'élévation.

Je me demande si vous pouvez également inclure un manifeste dans votre fichier EXE pour que l'OS sache que l'élévation est toujours requise.

+2

En ce qui concerne votre demande, le problème est la combinaison de l'élévation nécessitant, et le fait que CreateProcess ne peut pas élever les processus qu'il crée. Au lieu de cela CreateProcess renvoie ERROR_ELEVATION_REQUIRED, ce code personnalisé peut gérer. Windows Installer signale simplement l'erreur. –

Questions connexes