Pregunta Cómo hacer una MSI que simplemente envuelve un archivo EXE


Después de demasiados experimentos, llegué a la conclusión de que Windows Installer es simplemente una mala tecnología. Pero los clientes quieren archivos MSI.

Entonces, ¿cómo puedo crear un archivo MSI que extraiga un archivo EXE en un directorio temporal y lo ejecute con las mismas opciones o similares que se pasaron al archivo EXE?

Las opciones para un MSI se explican en Msiexec (opciones de línea de comando) ("ejecución" de bajo nivel de una MSI es la opción msiexec package.msi).

EDITAR: la solución WiX de mjmarsh parece que funciona. Simplemente no he tenido la oportunidad de probarlo aún (hora de la verdad). Si funciona, lo aceptaré.

EDITAR: no funciona. Pieza faltante: asistida / desatendida no parece estar disponible.

De todos modos, ¡el único para hacer que esto funcione es que la acción personalizada mate el proceso principal!

EDITAR: Alguien publicó como una respuesta más que envuelve todo el asunto como una acción personalizada posterior a la instalación. Teóricamente es posible, pero dado que se puede requerir un reinicio (gracias a MS para .NET 4 que requiere un reinicio a veces) tenemos que hacer más hackers. Entonces, de la matriz de ventajas:

Transparency: No. One big custom action.
Customizability: No.
Standardization: No. 
Management and reporting: No. Appears to work but will not.
Security: No benefit.
Validation: No. The hackery required to survive reboot makes this sure to not work.
Resiliency: Completely defeated.
Rollback: No. Rollback didn't work when we were using MSI anyway.
Patching & Updates: No. We have a local solution anyway.
Logging: No. Appears to work but will not.

No tiene sentido.


32
2018-05-12 21:06


origen


Respuestas:


Bueno, está la manera libre y la manera $$$. No puedo documentar todo aquí, pero esto debería ayudarte a comenzar.

En una nota lateral, sí, Windows Installer es una tecnología enloquecedora. Hay muchas ocasiones en las que creo que una tarea será sencilla, pero en realidad se vuelve complicada. Definitivamente tienes que sumergirte para entenderlo.

En cualquier caso, aquí va:

Gratis: WiX (aquí)

Esta es una herramienta gratuita para generar archivos MSI a partir de un conjunto de archivos de configuración XML. Te dejaré para encontrar tutoriales en línea, pero aquí está el quid:

Puede comprimir su EXE en el instalador usando la siguiente etiqueta en el archivo WXS:

<Binary Id="MYEXE" src="<path to my exe?"/>

Luego puede crear una acción personalizada que inicie su archivo EXE:

<CustomAction Id="EXECA_CALLMYEXE" Return="check" Execute="deferred" BinaryKey="MYEXE"
      ExeCommand="my command line"/>

Luego inserta su acción personalizada en el InstallExecuteSequence en el lugar apropiado (casi siempre corro el mío en algún lugar entre InstallInitialize y InstallFinalize)

<InstallExecuteSequence>
   <Custom Action="EXECA_CALLMYEXE" After="InstallInitialize"><![CDATA[Not REMOVE]]></Custom>

$$$: obtener InstallShield (AQUÍ)

Primero crea un proyecto de "MSI básico" y asegúrate de decir que quieres no setup.exe generado. Usted configura esto en la configuración de Liberación.

Entonces, básicamente haces lo mismo que con WiX, pero tienes una IU para ello.

  • Puede especificar su archivo EXE auxiliar utilizando el Editor directo y poniendo su archivo EXE en la tabla 'Binario'
  • Puede crear una acción personalizada para iniciar ese archivo EXE desde el nodo "Acciones personalizadas" en el árbol de la izquierda
  • Puede insertar la acción personalizada seleccionando "Instalar secuencias" y colocándola en el InstallExecuteSequence en algún lugar entre InstallInitialize y InstallFinalize Como dije antes.

Lo siento, no podría ser más detallado, pero este debería ser un buen comienzo.


15
2018-05-12 21:27



Creo que la forma más fácil de crear un archivo .MSI es usar WiX.

Lección 1 del tutorial de WiX es todo lo que necesita para crear una instalación simple.


6
2018-05-12 21:27



Joshua, entiendo tu frustración muy bien. MSI es peculiar por decir lo menos, una forma completamente nueva de pensar en la implementación. Aún así, se aplica correctamente. MSI ofrece la mejor implementación posible, especialmente para clientes corporativos.

¿Qué operaciones realiza su instalador EXE? ¿Es en gran medida una copia de archivo, algún registro COM y algunas escrituras de registro, o ejecuta lógica de instalación compleja, configuración de bases de datos, etc.? La razón por la que pregunto es porque probablemente sea muy rápido crear un WIX MSI que funcione bien para que pueda abandonar el enfoque EXE.

De hecho, es posible ejecutar un EXE desde dentro de un MSI, pero requiere una secuencia adecuada, y se garantiza que le causará más blues que un simple MSI. Si la aplicación es pequeña y no hace nada loco durante la instalación, con gusto le proporcionaré una conversión WIX básica.


4
2018-06-30 02:44



Sin solución. Fuimos NSIS ya que la instalación corporativa de MSI se va a romper de todos modos debido al problema de anidamiento de MSI (solo tratar instalando EXE envolviendo MSI desde dentro de MSI algún día).


2
2017-11-03 19:47



También hay una versión gratuita de la envoltura MSI. También es compatible con la desinstalación y las actualizaciones. Además, solo crea una entrada en los programas Agregar o Quitar.


2
2018-02-17 19:45



Añadiendo a weir's responder, cambiar el custom action attribute como abajo:

<!--Run Action-->
    <CustomAction Id="RunWrappedExe"
                  Return="asyncNoWait"
                  FileKey="ApplicationFileId"
                  Execute="deferred"
                  ExeCommand=""
                  HideTarget="no"
                  Impersonate="yes"/>

Ajuste Return=asyncNoWai no espera por el exe regresar. El instalador hace su trabajo y se cierra normalmente. Mientras tanto, el exe Continua su ejecución.

-Madhuresh


2
2018-02-23 09:45



prueba esto:

En el paquete MSI, hay una llamada de comportamiento "Iniciar una aplicación después de la instalación", lo que significa que su archivo exe se ejecutará después de la instalación de MSI (el MSI está cerrado).

Intenta ejecutar allí tu exe, de modo que cuando tu exe invoque otros paquetes MSI, no entre en conflicto con el primero.


1
2017-07-21 00:24



Wix puede hacerlo. Aquí está mi código de muestra para wix 3.5:

<?xml version='1.0'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
   <Product Id='*' UpgradeCode="11111111-2222-3333-4444-555555555555" 
        Name='My Setup' Language='1033' Version='1.0.0.0' 
        Manufacturer='Your company'>

    <Package Description='pak' InstallerVersion='200' Compressed='yes' />

    <Media Id='1' Cabinet='setup.cab' EmbedCab='yes' />

    <Directory Id='TARGETDIR' Name='SourceDir'>
        <Directory Id="TempFolder">
            <Directory Id="INSTALLLOCATION" Name="~_tmpdir">
                <Component Id='MyComponent' DiskId='1' Guid=''>
                    <File Id="File0" Name="setup.exe" Source="setup.exe" />
                    <File Id="File1" Name="file1.txt" Source="file1.txt" />
                </Component>
            </Directory>
        </Directory>
    </Directory>

    <Feature Id='InstallFeature' Title='Install Feature' Level='1'>
        <ComponentRef Id='MyComponent' />
    </Feature>

    <!-- Run Action -->
    <CustomAction Id="RunWrapExe" Return="ignore" Execute="deferred" 
                  FileKey="File0" ExeCommand="setup.exe param here"  
                  HideTarget="no" Impersonate="no" />

    <InstallExecuteSequence>
        <Custom Action="RunWrapExe" 
                After="InstallFiles">NOT REMOVE~="ALL"</Custom>
    </InstallExecuteSequence>

   </Product>
</Wix>

1
2017-11-04 09:36



Si no desea administrar MSI, sino solo ejecutar EXE, intente Exe to MSI Converter gratis. Usted acaba de poner en el camino al EXE y obtener un MSI.


0
2018-06-21 09:34