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


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

Entonces, ¿cómo puedo crear un archivo MSI que extrae un archivo EXE a un directorio temporal y lo ejecuta con opciones iguales o similares a las que se pasaron al archivo EXE?

Las opciones de un MSI se explican en Msiexec (opciones de línea de comandos) (el "run" de bajo nivel de un MSI es el paquete de opciones msiexec.msi).

EDITAR: la solución WiX de mjmarsh parece que funciona. Simplemente no he tenido la oportunidad de probarlo todavía (crunch time). Si funciona, lo aceptaré.

EDITAR: no funciona. Pieza faltante: atendido / desatendido no parece estar disponible.

De todos modos, lo único para hacer que esto funcione sería que la acción personalizada matara a su proceso padre.

EDITAR: Así que alguien publicó como una respuesta adicional envolviendo todo el asunto como una acción personalizada posterior a la instalación. Teóricamente posible, pero desde un puede ser necesario reiniciar (gracias MS para. NET 4 que requiere un reinicio a veces) tenemos que hacer más hackery. Así que 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.

Author: Stein Åsmul, 2009-05-13

12 answers

Bueno, existe el camino libre y el way camino. No puedo documentar todo aquí, pero esto debería ayudarte a empezar.

En una nota al margen, sí, Windows Installer es una tecnología enloquecedora. Hay muchas veces 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:

Libre: WiX (aquí)

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

Puede comprimir su EXE en el instalador utilizando 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 tu acción personalizada en el InstallExecuteSequence en el lugar apropiado (casi siempre corro la mía en algún lugar entre InstallInitialize y InstallFinalize)

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

$$$: Obtener InstallShield (AQUÍ)

Primero cree un proyecto "MSI básico" y asegúrese de decir que no quiere ninguna configuración.exe generado . Esto se establece en la configuración de la versión.

Entonces esencialmente haces lo mismo que con WiX, pero tienes una interfaz de usuario para ello.

  • Puede especificar su archivo EXE de ayuda utilizando el Editor directo y poniendo su archivo EXE en la tabla' Binaria '
  • 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 esto debería ser un buen comienzo.

 15
Author: Mike Marshall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-17 19:09:48

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

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

 6
Author: GvS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-30 22:55:16

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

¿Qué operaciones realiza su instalador EXE? Es en gran parte copia de archivos, algunos registros COM y algunas escrituras de registro,o se ejecuta la lógica de instalación compleja, la creación de bases de datos, etc...? La razón por la que pregunto es porque probablemente sería muy rápido para crear un WIX MSI que funcione bien para usted para que pueda abandonar el enfoque EXE.

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

 4
Author: Stein Åsmul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:15

No hay solución. Fuimos NSIS como instalación MSI corporativa va a ser roto de todos modos debido al problema de anidamiento MSI (solo intente instalar EXE empaquetando MSI desde dentro de MSI algún día).

 2
Author: Joshua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-03 19:47:50

También hay una versión libre del Wrapper MSI. También es compatible con desinstalación y actualizaciones. Además, solo crea una entrada en los programas Agregar o Quitar.

 2
Author: J. Rasmussen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-17 19:45:33

Añadiendo a weir's respuesta, cambiar el custom action attribute como a continuación:

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

El ajuste Return=asyncNoWai no espera a que vuelva el exe. El instalador hace su trabajo y cierra normalmente. Mientras tanto, el exe continúa su ejecución.

-Madhuresh

 2
Author: now he who must not be named.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-23 09:45:41

Prueba esto:

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

Intente ejecutar su exe allí, por lo que cuando su exe invoque otros paquetes MSI, no entrará en conflicto con el primero.

 1
Author: James Yang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-21 00:24:43

Wix puede hacerlo. Aquí está mi código de ejemplo 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
Author: weir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-28 11:56:43

Si no desea administrar MSI, sino solo ejecutar EXE, pruebe Exe to MSI Converter Free. Usted acaba de poner en el camino a la EXE y obtener un MSI.

 0
Author: pawelek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-21 15:46:04

Estaba teniendo el mismo problema (empaquetar EXE, llamar a otro MSI desde el EXE incluyendo la configuración de.net, etc.), y aquí está mi solución:

Compilo el exe de instalación usando InstallAware. Tiene su propia envoltura MSI que envuelve el EXE generado con MSI.

Funciona bien, el EXE puede llamar a otros MSIs sin ningún problema (incluida la configuración de. net, otras configuraciones de terceros), pero eso es porque el MSI de lanzamiento termina ("devuelve") los derechos después de lanzar el archivo EXE de configuración, y de esa manera evitan MSI limitación de llamadas recursivas MSI.

PERO - algunos clientes (empresas) que usan herramientas de implementación de MSI, requieren que el MSI (msiexec) regrese (end) solo después de que finalice el proceso de configuración, y eso es un problema con la solución anterior.

Así que-para resolver esto:

Hay otra envoltura MSI (exemsi.com) que genera MSI que devuelve solo después de que finalice la configuración de EXE, pero para usarlo debe usar otra opción única de InstallAware:

InstallAware tiene la opción para generar la configuración de EXE usando su propio motor nativo, y no basado en el motor de Windows Installer, para evitar la limitación recursiva de MSI. Combine ambos, y tendrá la solución perfecta.

Espero que esto ayude a alguien, aunque pasaron muchos años desde que esta pregunta se publicó por primera vez.

 0
Author: Oren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-27 10:57:40

Truco simple:

Imagen del proyecto

using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;

namespace Setup
{
    internal class Program
    {
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        private static void Main(string[] args)
        {
            ShowWindow(GetConsoleWindow(), 0);
            Stream st = Assembly.GetExecutingAssembly().GetManifestResourceStream("Setup.MSI.Temp.msi");
            string path = Path.Combine(System.IO.Path.GetTempPath(), "Temp.msi");
            using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
            {
                st.CopyTo(fileStream);
            }
            Process p = new Process();
            p.StartInfo.FileName = path;
            p.Start();
            p.WaitForExit();
            File.Delete(path);
        }
    }
}
 -1
Author: user2684935,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-13 07:25:27

Nah man, solo usa el asistente de configuración de Inno. Hace un EXE de configuración pero no un MSI. Son como 5 minutos y tendrás un instalador de Windows.

Simplemente descárguelo , instálelo, apunte a su EXE y siga las indicaciones en pantalla

 -2
Author: Jonathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-29 23:31:44