Comment faire un MSI qui enveloppe simplement un fichier EXE

Après beaucoup trop d'expériences, je suis arrivé à la conclusion que Windows Installer est tout simplement une mauvaise technologie. Mais les clients veulent des fichiers MSI.

Alors, comment puis-je créer un fichier MSI qui extrait un fichier EXE dans un répertoire temporaire et l'exécute avec des options identiques ou similaires à celles qui ont été transmises au fichier EXE?

Les Options d'un MSI sont expliquées dans Msiexec (options de ligne de commande) (Le "run" de bas niveau D'un MSI est un package d'options msiexec.msi).

Modifier: la solution Wix de mjmarsh semble fonctionner. Je n'ai tout simplement pas encore eu la chance de l'essayer (crunch time). Si cela fonctionne, je vais l'accepter.

EDIT: cela ne fonctionne pas. Pièce manquante: assisté / sans surveillance ne semble pas être disponible.

Quoi qu'il en soit, le seul à faire fonctionner ce serait que l'action personnalisée tue son processus parent!

EDIT: donc quelqu'un a posté comme une réponse supplémentaire enveloppant le tout comme une action personnalisée post-installation. Théoriquement possible mais depuis un redémarrage peut être nécessaire (merci MS pour. NET 4 nécessitant un redémarrage parfois) nous devons faire plus de hackery. Donc, à partir de la matrice des avantages:

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.

Pas de point.

32
demandé sur Stein Åsmul 2009-05-13 01:06:25

12 réponses

Eh bien, il y a la voie libre et la voie$$$. Je ne peux pas tout documenter ici, mais cela devrait vous aider à démarrer.

Sur une note de côté, oui, Windows Installer est une technologie exaspérante. Il y a plusieurs fois où je pense qu'une tâche sera simple, mais cela devient compliqué. Vous devez absolument vous immerger pour le comprendre.

En tout cas, voici:

Gratuit: WiX (ici)

C'est un outil gratuit de générer des fichiers MSI à partir d'un ensemble de fichiers de configuration XML. Je vais vous laisser trouver des tutoriels en ligne, mais voici le point crucial:

Vous pouvez compresser votre fichier EXE dans le programme d'installation en utilisant la balise suivante dans le fichier WXS:

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

Ensuite, vous pouvez créer une action personnalisée qui lance votre fichier EXE:

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

Ensuite, vous insérez votre action personnalisée dans le InstallExecuteSequence à l'endroit approprié (Je cours presque toujours le mien quelque part entre InstallInitialize et InstallFinalize)

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

$$$: Obtenez de l' InstallShield (ICI)

Créez D'abord un projet" Basic MSI " et assurez-vous de ne pas vouloir aucune configuration.exe généré . Vous définissez cela dans les paramètres de publication.

Ensuite, vous faites essentiellement la même chose qu'avec WiX, mais vous avez une interface utilisateur pour cela.

  • Vous pouvez spécifier votre fichier exe d'assistance en utilisant L'éditeur Direct et en plaçant votre fichier EXE dans la table' binaire '
  • Vous pouvez créer une action personnalisée pour lancer ce fichier EXE à partir de le nœud "actions personnalisées" dans l'arborescence de gauche
  • Vous pouvez insérer l'action personnalisée en sélectionnant "Install Sequences" et en la plaçant dans le InstallExecuteSequence quelque part entre InstallInitialize et InstallFinalize comme je l'ai déjà dit.

Désolé, Je ne pouvais pas être plus détaillé, mais cela devrait être un bon début.

15
répondu Mike Marshall 2013-12-17 19:09:48

Je pense que la meilleure façon de créer un .Le fichier MSI doit utiliser WiX .

Leçon 1 du tutoriel WiX est tout ce dont vous avez besoin pour créer une installation simple.

6
répondu GvS 2013-03-30 22:55:16

Joshua, je comprends très bien votre frustration. MSI est pour le moins original - une toute nouvelle façon de penser au déploiement. Pourtant, appliqué correctement MSI offre le meilleur déploiement possible, en particulier pour les entreprises clientes.

Quelles opérations votre programme d'installation EXE effectue-t-il? Est-ce en grande partie une copie de fichier, un enregistrement COM et des Écritures de registre, ou exécute-t-il une logique d'installation complexe, la mise en place de bases de données, etc...? La raison pour laquelle je demande est parce que ce serait probablement très rapide pour créer un bon fonctionnement Wix MSI pour vous afin que vous puissiez abandonner L'approche EXE.

Il est en effet possible d'exécuter un EXE à partir d'un MSI, mais il nécessite un séquençage approprié, et il est garanti de vous causer plus de blues qu'un simple MSI. Si l'application est petite et ne fait rien de fou lors de l'installation, je serais heureux de vous fournir une conversion Wix de base.

4
répondu Stein Åsmul 2017-05-23 11:54:15

Pas de solution. Nous sommes allés NSIS car l'installation de MSI d'entreprise va être cassée de toute façon en raison d'un problème D'imbrication MSI (juste Essayez d'installer EXE wrapping MSI à L'intérieur de MSI un jour).

2
répondu Joshua 2010-11-03 19:47:50

Il existe également une version gratuite du Wrapper MSI . Il prend également en charge la désinstallation et les mises à niveau. En outre, il ne crée qu'une entrée dans L'ajout ou la suppression de programmes.

2
répondu J. Rasmussen 2013-02-17 19:45:33

En ajoutant à la réponse weir's, Changez le custom action attribute comme ci-dessous:

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

Le paramètre Return=asyncNoWai n'attend pas le retour du exe. Le programme d'installation fait son travail et se ferme normalement. Pendant ce temps, le exe continue son exécution.

-Madhuresh

2
répondu now he who must not be named. 2016-02-23 09:45:41

Essayez ceci:

Dans le package MSI, il y a un appel de comportement "lancer une application après l'installation", cela signifie que votre fichier exe sera exécuté après l'installation de MSI (le MSI est fermé).

Essayez d'exécuter votre exe là-bas, donc lorsque votre exe appelle d'autres paquets MSI, il ne sera pas en conflit avec le premier.

1
répondu James Yang 2014-07-21 00:24:43

Wix peut le faire. Voici mon exemple de code pour 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
répondu weir 2014-07-28 11:56:43

Si vous ne voulez pas gérer MSI, mais seulement exécuter EXE, essayez Exe to msi Converter Free . Vous venez de mettre dans le chemin de L'EXE et obtenir un MSI.

0
répondu pawelek 2012-06-21 15:46:04

J'avais le même problème (wrap EXE, appelez d'autres MSI de L'EXE, y compris.Net setup, etc.), et voici ma solution:

Je construis l'exe d'installation en utilisant InstallAware. Il a son propre Wrapper MSI qui enveloppe L'EXE généré avec MSI.

Cela fonctionne bien, L'EXE peut appeler d'autres MSIs sans aucun problème (y compris. Net setup, d'autres configurations tierces), mais c'est parce que le lancement de MSI termine ("renvoie") les droits après le lancement du fichier exe d'installation, et de cette façon ils évitent le Limitation MSI des appels MSI récursifs.

Mais-certains clients (entreprises) qui utilisent des outils de déploiement MSI, nécessite le MSI (msiexec) pour retourner (fin) seulement après la fin du processus d'installation, et qui est un problème avec la solution ci-dessus.

Donc-pour résoudre ceci:

Il y a un autre Wrapper MSI (exemsi.com) qui génère MSI qui ne retourne qu'après la fin de L'installation EXE, mais pour l'utiliser, vous devez utiliser une autre option unique D'InstallAware:

InstallAware a l'option pour générer la configuration EXE en utilisant leur propre moteur natif, et non basé sur Windows Installer engine, pour éviter la limitation récursive MSI. Combinez les deux, et vous avez la solution parfaite.

J'espère que cela aidera quelqu'un, bien que de nombreuses années se soient écoulées depuis que cette question a été postée.

0
répondu Oren 2014-11-27 10:57:40

Astuce Simple:

Image du projet

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
répondu user2684935 2015-11-13 07:25:27

Nah man, il suffit d'utiliser L'assistant de configuration Inno. Il fait un exe d'installation mais pas un MSI. C'est comme 5 minutes et vous aurez un programme d'installation de windows.

Simplement Téléchargez , Installez-le, pointez-le sur votre EXE et suivez les instructions à l'écran

-2
répondu Jonathan 2015-09-29 23:31:44