2010-02-24 13 views
6

Tengo el siguiente fragmento de código WiX:La ejecución de una acción personalizada que requiere la elevación después de la instalación

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

Básicamente en la pantalla final, que muestran una casilla que dice: aplicación de inicio. Nota: esta aplicación requiere elevación. Todo esto funciona bien a excepción de un inconveniente. Si UAC está habilitado, parece que el MSI se revuelve con el token de usuario y quita sus grupos, por lo que cuando intenta iniciar la aplicación que requiere elevación ya no es una opción.

¿Cómo puedo unir esto para que funcione?

Intenté conectar un Impersonate = "no", pero ya es demasiado tarde para que esto funcione.

Respuesta

12

La secuencia de IU se ejecuta como un usuario limitado y lanza aplicaciones con una llamada a CreateProcess. Si usa algo como un WixShellExec con [WixShellExecTarget], actuará como Explorer y mostrará un aviso de UAC si el objetivo requiere elevación. O puede modificar su Configurator.exe para permitir que se inicie sin privilegios elevados, detectar ese caso y relanzarse con privilegios elevados.

Por ejemplo, esto debería funcionar:

<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

su información, acciones personalizadas inmediatas se hicieron pasar por SIEMPRE (es decir, que siempre se ejecutan como el usuario que ejecuta el MSI).

Me gusta la idea de Michael Urman sobre hacer que su Configurator.exe maneje el problema de elevación.

Me pregunto si también podría incluir un manifiesto en su EXE para que el sistema operativo sepa que la elevación siempre es necesaria.

+2

En cuanto a su maravilla, el problema es la combinación de necesidad de elevación, y el hecho de que CreateProcess no puede elevar los procesos que crea. En cambio, CreateProcess devuelve ERROR_ELEVATION_REQUIRED, que el código personalizado puede manejar. Windows Installer simplemente informa el error. –

Cuestiones relacionadas