web-dev-qa-db-fra.com

Comment créer un fichier 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 fichier MSI sont expliquées dans Msiexec (options de ligne de commande) (le "niveau" d'exécution de bas niveau d'un fichier MSI correspond à l'option msiexec package.msi).

EDIT: la solution WiX de mjmarsh semble fonctionner. Je n'ai juste pas encore eu l'occasion de l'essayer (moment critique). Si cela fonctionne, je l'accepterai.

EDIT: ça ne marche pas. Pièce manquante: assisté/sans surveillance ne semble pas être disponible.

Quoi qu'il en soit, la seule solution pour que cela fonctionne est que l'action personnalisée tue son processus parent!

EDIT: Quelqu'un a donc posté une réponse supplémentaire qui résume le tout sous la forme d’une action personnalisée post-installation. Théoriquement possible mais comme un redémarrage peut être nécessaire (merci à MS pour .NET 4 nécessitant parfois un redémarrage), nous devons procéder à un piratage supplémentaire. 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
Joshua

Pas de solution. Nous nous sommes lancés dans NSIS car l’installation de MSI en entreprise va de toute façon être interrompue à cause d’un problème d’imbrication de MSI (essayez juste d’installer essayer d’installer EXE en enveloppant MSI un jour).

2
Joshua

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

En passant, oui, Windows Installer est une technologie exaspérante. Il y a de nombreuses fois où je pense qu'une tâche sera simple, mais cela devient en réalité compliqué. Vous devez absolument vous immerger pour le comprendre. 

En tout cas, voici:

Gratuit: WiX ( ici )

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

Vous pouvez compresser votre fichier EXE dans le programme d'installation à l'aide de 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 la variable InstallExecuteSequence à l’endroit approprié (j’exécute presque toujours la mienne quelque part entre InstallInitialize et InstallFinalize).

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

$$$: Obtenir InstallShield ( ICI )

Commencez par créer un projet "Basic MSI" et assurez-vous de dire que vous voulez pas de fichier setup.exe. Vous définissez ceci dans les paramètres de publication.

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

  • Vous pouvez spécifier votre fichier EXE auxiliaire à l'aide de l'éditeur direct et en plaçant votre fichier EXE dans la table 'Binary'
  • Vous pouvez créer une action personnalisée pour lancer ce fichier EXE à partir du nœud "Actions personnalisées" dans l'arborescence de gauche.
  • Vous pouvez insérer l'action personnalisée en sélectionnant "Installer les séquences" et en la mettant dans InstallExecuteSequence quelque part entre InstallInitialize et InstallFinalize, comme je l'ai dit précédemment.

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

15
Mike Marshall

Je pense que le moyen le plus simple de créer un fichier .MSI consiste à utiliser WiX .

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

6
GvS

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

Quelles opérations votre EXE d'installation effectue-t-il? S'agit-il principalement d'une copie de fichier, de certains enregistrements COM et de certaines inscriptions dans le registre, ou exécute-t-il une logique d'installation complexe, la configuration de bases de données, etc.? La raison pour laquelle je pose cette question est parce qu’il serait probablement très rapide de créer pour vous un MSI WIX qui fonctionne bien afin que vous puissiez abandonner l’approche EXE. 

Il est en effet possible d'exécuter un fichier EXE à partir d'un fichier MSI, mais cela nécessite un bon séquençage et vous garantit plus de blues qu'un simple fichier MSI. Si l'application est petite et ne fait rien de fou lors de l'installation, il me fera plaisir de vous fournir une conversion WIX de base.

4
Stein Åsmul

En ajoutant weir's answer, 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étrage de Return=asyncNoWai n'attend pas le retour de la exe. L'installateur fait son travail et se ferme normalement. En attendant, la exe continue son exécution.

-Madhuresh

Il existe également une version gratuite du MSI Wrapper . Il prend également en charge la désinstallation et les mises à niveau. En outre, il crée uniquement une entrée dans les programmes Ajout/Suppression. 

2
J. Rasmussen

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
weir

essaye ça:

Dans le package MSI, il existe un appel de comportement "Lancer une application après l'installation", ce qui 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, ainsi, lorsque votre exe invoquera d'autres packages MSI, cela n'entrera pas en conflit avec le premier.

1
James Yang

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

0
pawelek

J'avais le même problème (emballer EXE, appeler d'autres MSI à partir de l'EXE, y compris la configuration .net, etc.), Et voici ma solution:

Je construis le fichier exe d’installation à l’aide de InstallAware . Il possède son propre wrapper MSI qui enveloppe l’EXE généré avec MSI.

Cela fonctionne bien, le fichier EXE peut appeler d’autres MSI sans aucun problème (y compris la configuration .net, les autres configurations tierces), mais c’est parce que le lancement du MSI met fin aux droits ("retourne") après le lancement du fichier EXE de configuration. ils évitent la limitation MSI des appels MSI récursifs.

MAIS - certains clients (entreprises) qui utilisent des outils de déploiement MSI exigent que MSI (msiexec) renvoie (fin) uniquement à la fin du processus d’installation, ce qui pose un problème pour la solution ci-dessus.

Donc, pour résoudre ceci:

Il existe un autre wrapper MSI (exemsi.com) qui génère un MSI qui ne sera renvoyé qu’après la fin de la configuration EXE, mais pour l’utiliser, vous devez utiliser une autre option unique d’InstallAware:

InstallAware a la possibilité de générer la configuration EXE à l'aide de son propre moteur natif, et non basé sur le moteur Windows Installer, afin d'éviter toute limitation récursive MSI . Combinez ces deux éléments pour obtenir la solution idéale.

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

0
Oren