web-dev-qa-db-fra.com

Comment comparer le contenu de deux (ou plusieurs) fichiers MSI?

Comment puis-je comparer " le contenu " de deux (ou plus) fichiers MSI et voyez ce qui est réellement différent à l'intérieur des fichiers - au lieu de faire une comparaison binaire inutile ? (ce qui ne me dit évidemment que si j'ai affaire à des copies du même fichier ou non).

Quelques scénarios de problèmes pertinents et typiques :

  • Notre système de construction crache des fichiers MSI comme un fou, et parfois nous devons comprendre quelles différences existent entre les différents fichiers MSI (lire: quelque chose a changé, et maintenant nous échouons au déploiement).
  • Nous avons des fichiers MSI compilés à partir des mêmes sources dans différents emplacements, et certains d'entre eux ne parviennent pas à exécuter des rapports System.BadImageFormatException - comment pouvons-nous déboguer quelles sont les différences dans les fichiers MSI? (une réponse traitant spécifiquement de cette erreur ici: Les applications dépendent-elles de l'environnement où elles ont été compilées? ).
  • Les fichiers MSI peuvent être compilés avec toutes sortes d'outils, mais pour les utilisateurs de stackoverflow, ces fichiers sont probablement le plus souvent créés à l'aide de WiX ou Projets d'installation de Visual Studio (kits d'outils gratuits).

Ceci est une question de type Q/A sur le thème de la comparaison de vos fichiers MSI compilés pour déterminer quelles sont les "différences de contenu" réelles.

12
Stein Åsmul

_About MSI Files_

En gros MSI les fichiers sontFichiers de stockage structurés COM- essentiellement un système de fichiers dans un fichier - avec des flux de un contenu différent, dont l'un est une base de donnéesSQL Server simplifiée(dans les termes les plus génériques, je crois). À condition que les fichiers MSI soient lisibles, le contenu (de différents formats et types) peut être comparé.

Note technique: Il est concevable qu'un MSI qui déclenche un _System.BadImageFormatException_ ne soit tout simplement pas exécutable (_msiexec.exe_ ne peut pas l'exécuter), mais il peut toujours être lisible - et donc comparable (veuillez ajouter un commentaire pour le vérifier si vous en faites l'expérience).

Streams: Certainsstreamsdans le MSI sonttablesavec des valeurs de chaîne. Il peut également y avoir des flux pourarchives cab intégréesutilisées pour stocker les fichiers à déployer, et des tables aveccontenu binaireuniquement - comme le _Binary table_ où les actions personnalisées compilées et non compilées sont stockées avec d'autres contenus binaires dont la configuration a besoin. Et il y a un "résumé flux spécial" et un tableau avec des icônes stockées dans leur format binaire natif, et la liste continue ... Pour la plupart des tableaux, nous pouvons comparer les chaînes dans chaque tableau ressemble à peu près au texte d'un document Word (qui était également OLE/COM - bien que les versions plus récentes utilisent désormais Open Office XML ) et obtenir un rapport détaillé des différences. Pour ce faire, vous avez évidemment besoin d'unoutil spécialpour le travail - un capable de trouver son chemin à travers tous les flux pertinents. Certains commerciaux et gratuits les outils pour cela sont listés ci-dessous.

Contenu binaire: Avant d'élaborer cela, je dois noter que la comparaison du contenu dans les _Binary Table_, _Cabs Table_, _Icon Table_ - ou toute autre table binaire, sera généralement vous permet une comparaison binaire uniquement (en particulier pour les fichiers dll et exe d'action personnalisée compilés).Actions personnalisées de script- dans le tableau binaire - peuvent être comparées sous forme de texte, mais les actions personnalisées compilées sont uniquement des comparaisons binaires. Donc, si votre problème émane d'une action personnalisée compilée, vous ne pouvez pas vraiment le voir dans une comparaison directe (vous ne voyez que la différence binaire).Vous devez frapper votre système de contrôle de code source pour voir quel code a été utilisé pour les actions personnalisées compilées de toute nature- j'espère que vous avez unebonne pratique d'étiquettepour trouver le code source réel utilisé dans chaque configuration. Je n'utilise pas cette pratique, mais pour les versions internes internes, vous pouvez peut-être même inclure votre dll de création de débogage pour votre action personnalisée compilée, et tenter d'attacher le débogueur au code en cours d'exécution pour vraiment comprendre ce qui se passe? Je n'utiliserais pas de DLL de mode de débogage pour une version publique - à moins d'avoir clarifié les risques. Le code de débogage peut être criblé de boîtes de message de débogage (inattendues) (utilisées comme points d'entrée pour attacher le débogueur) et d'autres problèmes qui ne devraient jamais toucher un package de production.

À bien y penser, vos fichiers cab et vos fichiers d'icônes peuvent certainement être comparés à leurs versions correspondantes dans des fichiers MSI plus anciens (ou plus récents) en utilisant la technique pour décompiler les fichiers MSI en utilisant _dark.exe_ - qui est décrite ci-dessous. Ensuite, en utilisant un bon outil de comparaison (Beyond Compare est mentionné ci-dessous), vous pouvez faire une différence complète sur le contenu du fichier cab entre différentes versions de MSI (et certains des fichiers pourraient être des fichiers texte, qui pourraient être du texte comparé). Je suppose que les cabs et les icônes sont en quelque sorte des "binaires transparents" dans un format ouvert par opposition aux binaires compilés (avec des actions personnalisées et plus) qui ne sont pas intrinsèquement décompilables ou inspectables (sauf si vous savez décompiler les binaires gérés).

En conclusion: Les fichiers MSI sont entièrement transparents à l'exception des actions personnalisées compilées. Cette transparence est l'un des principaux avantages de MSI . La plupart des avantages de Windows Installer, par rapport aux technologies de déploiement précédentes, sont généralement centrés sur les avantages du déploiement d'entreprise. Malheureusement, les développeurs ne peuvent voir que les mauvais aspects de MSI: les anti-modèles MSI (potentiels) (vers le bas - très désordonnés et ad-hoc pour l'instant). Certes, certains de ces problèmes sont très graves et violent "le principe du moindre étonnement". Les développeurs - pourquoi avoir d'autres choses tout aussi importantes à faire - peuvent franchement se gratter la tête avec incrédulité.

Ne vous y trompez pas cependant: MSI a d'énormes avantages en termes de déploiement d'entreprise ( voir le même lien que ci-dessus, vers le bas ).Condensé: fonctionnement silencieux fiable, gestion à distance, restauration, journalisation, fonction de désinstallation implicite, droits élevés, ligne de commande normalisée, transparence, transformations pour une personnalisation de configuration normalisée et installation administrative pour extraire de manière fiable des fichiers. Juste pour nommer les grands rapidement. Avantages sous forme de liste ici .

Beaucoup de digressions jusqu'à présent -passons au point. Quels outils peuvent être utilisés pour comparer les fichiers MSI?


_Commercial Tools_

Plusieursoutils de déploiement commercialtels queInstallshield,Advanced Installeretde nombreux autres outils MSIprennent en charge l'affichage et la comparaison des fichiers MSI. Peut-être que j'ajoute trop de liens, mais permettez-moi d'utiliser ma politique habituelle de "si vous liez à un, vous liez à tout le monde" - cela devrait gagner du temps et des recherches sur Google.

Comme note spéciale - nostalgique - la meilleure fonctionnalité de diff MSI que j'ai jamais vue était dansWise Package Studio. Pour être honnête, c'était la tête et les épaules au-dessus du reste - toujours fonctionnel, bien codé par couleur et juste facile à comprendre. Cet outil n'est plus en vente comme décrit ici: Quel produit d'installation utiliser? InstallShield, WiX, Wise, Advanced Installer, etc (si vous avez une équipe de packaging dans votre entreprise, peut-être qu'ils ont une licence de rechange?).


_Free Tools_

Les outils commerciaux sont bons, mais il existe égalementplusieurs alternatives gratuitesqui peuvent être utilisées pour comparer les fichiers MSI - et ci-dessous est une liste de certains d'entre eux ainsi que quelques conseils sur la façon d'utiliser chaque outil (d'une manière plutôt minimaliste).

Il y a quelques détails supplémentaires ajoutés pour _dark.exe_ - qui n'est pas du tout un outil de comparaison pour les fichiers de stockage structurés COM, mais un moyen de décompiler les fichiers MSI en fichiers source XML WiX et d'extraire tous les fichiers de support (icônes, binaires, cabs, fichiers de configuration) - ce qui permet de les comparer avec des outils de comparaison texte/binaire standard par la suite.

1. Orca _(MSI SDK)_

Microsoft'sownMSI SDK tool/viewercalled Orca can view MSI files and edit them, but there n'est pas un support direct pour comparer deux fichiers MSI (que je sache). Je suppose que vous pouvez exporter les tableaux puis les comparer, mais d'autres outils ont des fonctionnalités plus intégrées. Cette option est mentionnée car vous avez peut-être déjà installé Orca et c'est probablement un moyen rapide d'obtenir une différence simple. L'option "pauvre homme".

Vous avez peut-être déjà le programme d'installation. Si Visual Studio est installé, essayez de rechercher _Orca-x86_en-us.msi_ - sousProgram Files (x86)- et installez-le. Recherchez ensuite Orca dans le menu Démarrer. Techniquement, Orca est installé dans le cadre du SDK Windows (téléchargement volumineux mais gratuit). Si vous n'avez pas installé Visual Studio, vous connaissez peut-être quelqu'un qui le fait? Demandez-leur simplement de rechercher ce MSI et de vous l’envoyer (il s’agit d’un minuscule fichier d’un demi-mb) - cela devrait leur prendre quelques secondes. Sinon, vous pouvez toujours télécharger le SDK Windows

2. _Super Orca_ _(free third party tool)_

Super Orca permettra une comparaison rudimentaire de deux fichiers MSI. Mon test de fumée semble révéler que des champs avancés tels que le flux de résumé peuvent être ignorés. En d'autres termes, un tableau simple ne compare que. Il pourrait y avoir d'autres limitations. C'est peut-être assez bon? C'est facile a utiliser.

3. _widiffdb.vbs_ _(MSI SDK)_

_MSI SDK_ possède un VBScript que vous pouvez utiliser pour afficher les différences entre deux fichiers MSI. Il s'appelle _widiffdb.vbs_ ( msdn ). Avec cet outil, je peux voir les différences de flux de résumé ignorées par Super Orca. Anything MSI SDK fait autorité.

[~ # ~] mise à jour [~ # ~]: Tous les scripts API du SDK MSI sur github.com (le code VBScript réel).

  • Ajout d'un lien vers la liste complète de ces scripts VBS SDK MSI - à diverses fins. Ne soyez pas confus, seul _widiffdb.vbs_ est nécessaire pour comparer les fichiers MSI, mais il existe de nombreux scripts utiles à d'autres fins.
  • Si Visual Studio est installé, recherchez simplement _widiffdb.vbs_. Lancez avec _cscript.exe_ et passez en chemin complet à deux fichiers MSI pour les comparer. Sortie dans la console.

Usage:

_cscript.exe widiffdb.vbs "Setup 1.msi" "Setup 2.msi"
_

Exemple de sortie:

_Property Value           [ALLUSERS] {1}->{2}
Property Value           [MSIINSTALLPERUSER] {}->{1}
Property INSERT          [MSIINSTALLPERUSER]
\005SummaryInformation   [9] {{00000000-0000-0000-0000-000000000000}}->{{00000000-0000-0000-0000-000000000001}}
\005SummaryInformation   [12] {28.03.2019 15:20:02}->{28.03.2019 14:40:52}
\005SummaryInformation   [13] {28.03.2019 15:20:02}->{28.03.2019 14:40:52}
\005SummaryInformation   [15] {2}->{10}
_

Pour trouver le script, vous pouvez le rechercher sousProgram Files (x86)si Visual Studio est installé (il fait partie du SDK Windows qui sera également installé avec Visual Studio ) - (actuellement le chemin est:C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86- remplacez simplement les numéros de version comme il convient et vous devriez trouver le MSI plus rapidement).

4. _dark.exe_ _(WiX toolkit - open source)_

dark.exebinaire de l'ensemble d'outils WiX (une boîte à outils qui était probablement utilisée pour compiler certains de vos fichiers MSI) . Ce _dark.exe_ est un "désassembleur" ou "décompilateur" pour les fichiers MSI. Il convertira les fichiers MSI en wxs au format XML (le propre format de WiX utilisé pour compiler les fichiers MSI en premier lieu), ainsi qu'un certain nombre de fichiers binaires extraits (si vous utilisez les options et drapeaux de décompilation appropriés).

Les fichiers source wxs peuvent être comparés en tant que fichiers source de texte standard (mon outil préféré est Beyond Compare , mais c'est un outil commercial - il existe de nombreux outils de comparaison de texte - y compris ceux de Visual Studio). Les fichiers binaires peuvent évidemment être comparés en binaire. Tout fichier CAB extrait peut être comparé à un autre fichier cab similaire d'une autre version de configuration MSI par exemple.

Voici un exemple de ligne de commande:

_dark.exe -x outputfolder MySetup.msi
_
  • Dans de nombreux cas, cela donnera une très bonne comparaison des fichiers MSI et vous devriez pouvoir déterminer ce qui est vraiment différent.

  • Les binaires extraits peuvent être des fichiers de script (VBScripts, etc ...) ou n'importe quel nombre d'autres binaires (par exemple compilés DLL actions personnalisées). Dans ce dernier cas, vous ne pouvez pas vraiment le décompiler plus loin - sauf s'il s'agit d'un binaire .NET et que vous avez une expertise dans la décompilation de tels fichiers binaires.

  • Cependant, il convient de noter que les fichiers MSI générés par WiX compilés à l'aide des mêmes fichiers source WiX peuvent être différents pour plusieurs raisons:

    • Le même fichier source WiX peut également être compilé avecdifferent compilateur et linker settings, et cela peut affecter le fichier MSI généré de plusieurs manières différentes. Pour voir tous les commutateurs, téléchargez et installez WiX et écrivez simplement _candle.exe_ ou _light.exe_ dans une invite de commande et appuyez sur enter.

    • Certains champs tels quepackage GUIDsetproduct GUIDspeuvent être définis surauto-generatedans le fichier wxs. Le champ correspondant résultant dans le fichier MSI généré sera évidemment différent pour chaque génération dans ce cas.

      • Je n'ai pas de liste complète des champs qui peuvent être définis pour se générer automatiquement à ce stade (si vous le savez, vous pouvez peut-être cliquer sur modifier et modifier cela in situ).

      • Les champs générés automatiquement mentionnés peuvent également être codés en dur (ce qui n'est pas bon pour le GUID du package, mais c'est une autre longue histoire - sachez que si vous trouvez deux fichiers MSI qui sont binaires différents avec le même GUID du package, alors vous avez de sérieux problèmes - s'ils sont dans la nature - Windows Installer les traitera comme le même fichier par définition). Les codes de package doivent toujours être générés automatiquement. Digression.

    • Les fichiers MSI eux-mêmes ont évidemment des informations de date de fichier différentes ayant été compilées séparément - juste pour indiquer l'évidence.

Et une note spéciale quelque peu sans rapport avec le sujet traité, mais importante néanmoins: vous pouvez utiliser _dark.exe_ pour décompiler les exécutables compilés avec la fonction Burn de WiX. Il s'agit de la fonctionnalitébootstrapper de WiXutilisée pour installer un ou plusieurs fichiers MSI et/ou EXE dans l'ordre - l'un après l'autre. Ces bootstrappers sont des fichiers EXE et vous pouvez les décompresser dans leurs fichiers MSI et/ou EXE constituants:

_dark.exe -x outputfolder setup.exe
_

Ouvrez simplement une invite de commande, CD dans le dossier où réside le fichier setup.exe. Spécifiez ensuite la commande ci-dessus. Échantillon de béton: _dark.exe -x outputfolder MySetup.exe_. Le dossier de sortie contiendra quelques sous-dossiers contenant à la fois les fichiers MSI et EXE extraits et les manifestes et le fichier de ressources pour l'interface graphique de gravure. Tous les fichiers MSI peuvent ensuite être désassemblés comme décrit ci-dessus pour produire un fichier source WiX (wxs).

5. InstEd _(free third party tool - with plus version available)_

Pour une raison quelconque, je n'ai jamais utilisé cet outil activement, mais je l'ai testé plusieurs fois. En le testant à nouveau, il semble faire le travail de comparaison de deux fichiers MSI, bien qu'à partir d'une option de menu étrange (ce qui m'a fait penser que la fonctionnalité ne fonctionnait pas auparavant).

  • Ouvrez un MSI, puis accédez à _Transform => Compare Against..._ et recherchez le MSI auquel vous souhaitez comparer le premier.
  • La comparaison semble OK, et je vois qu'il y a des changements dans le Résumé Stream - par exemple - mais le diff ne semble pas montrer ce qui est différent (sauf si je ne le vois pas).
  • Pour voir les modifications du flux récapitulatif, ouvrez les deux fichiers dans des instances InstEd distinctes et accédez à _Tables => Summary Info..._ dans les deux instances. Comparez maintenant les informations des fiches de propriétés. Vous pouvez également utiliser le script _widiffdb.vbs_ répertorié ci-dessus.

6. _Other Tools..._ _(COM-structured storage file viewers)_

Il existe sans aucun doute de nombreux autres outils capables de visualiser les fichiers de stockage structurés COM, mais je pense que les options ci-dessus devraient suffire pour la plupart des utilisateurs. J'ajouterai un lien vers la liste des outils MSI de installsite.org /.

7. _Advanced Installer_ _(commercial tool with some free features)_

Cet outil commercial pourra fonctionner comme un visualiseur et permettre certaines opérations de base sur les fichiers MSI même sans s'exécuter avec une licence complète. Le bon côté est que vous n'avez même pas besoin d'utiliser les tables brutes, mais pouvez utiliser une interface utilisateur beaucoup plus agréable pour "corriger" diverses choses dans le MSI. Par exemple, divers paramètres de mise à niveau (continuer ou échouer en cas d'échec des désinstallations majeures de la mise à niveau, etc.).

Les modifications apportées dans la vueEditeur de table(vue de table droite) ne seront pas visibles dans les autres "vues de l'assistant". La raison de ceci est expliquée ici .


Liens

13
Stein Åsmul