Windows installeur

Published: 08-12-2014

Updated: 22-05-2016

By: Maxime de Roucy

tags: msi package windows

Différents types d’installeur et de « modifieur »

MSI

Les MSI (Windows Installer) sont des installeurs Windows. Ils sont composés de fichiers (supposition : dans un format cab) et d’une base de donnés détaillant les étapes et actions de l’installeur. On peut éditer la base de données d’un MSI (ou créer un patch) avec le logiciel Orca faisant partie du SDK Windows (on trouvera l’installeur d’Orca dans le répertoire Bin du SDK après avoir installé le module « Win32 Development Tools » de celui-ci). Pour installer Orca on peut :

Un MSI s’installe avec la commande suivante :

msiexec /i mon_installeur.msi

On peut extraire un MSI via une installation « administrative » :

msiexec /a mon_installeur.msi

Attention, dans Orca les options « Save As… » et « Save Transformed As… » ne font pas la même chose que « Save » concernant les fichiers binaire contenu dans le MSI. Le MSI généré via « Save As… » ou « Save Transformed As… » peut être corrompu. Je déconseille d’utiliser ces options.

Problèmes

Installation

Vous pouvez générer des logs détaillés en ajoutant l’option /log mes_logs.log à la commande msiexec. Il est aussi conseiller d’ajouter l’instuction cmd /c avant msiexec pour pouvoir déterminer quand la commande s’est terminer est si elle a échoué ou non :

cmd /c msiexec /install mon_msi.msi /passive /log mes_logs.log
echo %errorlevel%

Les codes d’erreurs sont détaillés dans l’aide Microsoft.

MST

On peut patcher la base de données d’un MSI avec un MST. Les modification contenu dans un MST ne peuvent s’appliquer qu’à la base de donnée du MSI, pas au fichiers qu’il contient/installe.

Création

Il est possible de créer un MST avec le logiciel Orca (menu « Transform ») :

Installation

Un couple MSI & MST s’installe avec la commande suivante :

msiexec /i mon_installeur.msi TRANSFORMS=mon_mst.mst

Parfois l’installation d’un MSI en mode graphique désactive certains paramètres modifié dans le MST. Je recommande d’utiliser les option /passive ou /quiet de msiexec.

Fusionner MSI & MST

Pour appliquer un MST à un MSI et générer un nouveau MSI patché, utiliser msitran disponible dans le SDK Windows.

On peut aussi utiliser le script WiUseXfm.vbs disponible dans le SDK Windows :

cscript WiUseXfm.vbs mon_installeur.msi mon_mst.mst

Comme indiqué dans la section MSI il ne faut pas utiliser les options « Save As… » et « Save Transformed As… » de Orca.

MSP

Un MSP est un patch binaire à appliquer à une installation réalisée à partir d’un MSI. Il permet de modifier les fichiers installé par le MSI.

Création

Pour générer un MSP vous installer msimsp, cet utilitaire se trouve dans le module « Win32 Development Tools » du SDK Windows.

Exemple de génération d’un MSP pour LibreOffice :

Plutôt que d’utiliser le fichier template.pcp que je fournis vous pouvez utiliser celui se trouvant dans le module « Win32 Development Tools » du SDK Windows.

Voici une procédure que j’ai utilisé pour générer un msp ou un grand nombre de fichier été modifiés. NEW_init est le dossier d’installation du nouveau MSI (avec les nouveaux fichiers). J’ai exporté la table « File » du msi de OLD dans File.idt.

Je créé le dossier NEW, avec les fichiers modifiés :

max@laptop % ls
NEW_init/  OLD/
max@laptop % cp -a OLD NEW
max@laptop % cp -a NEW_init/program NEW_init/share NEW_init/URE NEW_init/Win NEW/

Je récupère la liste de tous les nouveaux fichiers et leurs somme md5 :

max@laptop % find NEW_init/program NEW_init/share NEW_init/URE NEW_init/Win -type f -exec md5sum '{}' \; > md5s
max@laptop % sed -i 's/NEW_init/OLD/' md5s

Je génère la liste des fichier qui on été ajouté (« Échec d’ouverture ou de lecture ») et modifié (« Échec »). Les fichiers ajouté seront ajouté manuellement dans le MSI.

max@laptop % md5sum -c md5s 2> /dev/null | grep "Échec d'ouverture ou de lecture" > manuel
max@laptop % md5sum -c md5s 2> /dev/null | grep "Échec$" > "Échec"

Je détermine si plusieurs fichiers ont le même noms. Ceux-ci seront modifié manuellement dans le MSI.

max@laptop % sed -e 's/:.*//' -e 's/^OLD\///' Échec > filelist
max@laptop % while read i
do
	basename -z $i
	du -0 -b OLD/$i
	du -b NEW/$i
done < filelist | sponge filelist 
max@laptop % tr '\0' '\t' < filelist | cut -f 1,2,4 | sponge filelist
max@laptop % sort -u filelist | sponge filelist
cut -f 1,2 < filelist | while read i
do
	if [ ! `grep -c "$i" File.idt` -eq 1 ]
	then
		echo "$i"
	fi
done >> manuel

Je supprime les fichiers listé dans manuel de filelist.

Je modifie automatiquement la taille des fichiers de filelist dans File.idt :

max@laptop % while read i j k
do
	sed -i "s/$i\t$j/$i\t$k/" File.idt
done < filelist

J’effectue les modifications manuel de File.idt pour les fichiers listé dans manuel et j’importe le fichier dans le MSI.

Types de MSP

Source :

Small Update

Adéquate lorsqu’on veut modifier quelques fichiers mineurs sans pour autant modifier le numéro de version du logiciel.

Si on fait un « small update » on ne change ni le ProductCode ni le ProductVersion. Je conseille fortement de faire un « small update » plutôt qu’un « minor upgrade ». « small update » et « minor upgrade » sont listé de la même façon dans la liste des mises à jours « Mises à jour installées ».

Minor Upgrade

Adéquate lorsque les modifications sont assez importante pour justifier la modification du numéro de version.

Pour un « minor upgrade » on change le ProductVersion mais pas le ProductCode.

Major Upgrade

Adéquate lorsque les modifications sont assez importante pour qu’on considère que le produit/logicel à changer.

Pour un « major upgrade » on change le ProductVersion et le ProductCode.

Un paramètre important pour les « major upgrade » : le UpgradeCode.

Installation déjà patchée

Il est possible de créer un MSP x s’appliquant sur une installation déjà patchée par un MSP y ; le MSP x intégrant des modifications qui lui sont propre ainsi que les modifications du MSP y. Le MSP x remplace et complète donc le MSP y. Dans ce cas de figure il n’est pas nécessaire de désinstaller le MSP y avant d’installer le MSP x.

Pour créer le MSP x vous devez suivre la procédure de la document officiel.

ListOfPatchGUIDsToReplace est déprécié au profit de « PatchSequence ».

TODO : à compléter

Installation

msiexec /update output.msp

Désinstallation

msiexec /package target_guid /uninstall patch_guid /passive

Pour obtenir le target_guid et le patch_guid :

Problèmes

Création

Vous pouvez générer des logs détaillés en ajoutant l’option -l mes_logs.log à la commande msimsp.

Lors de la création d’un « major upgrade » j’ai reçut l’erreur suivante :

Since MSI 3.0 will block installation of major upgrade patches with sequencing information, creation of such patches is blocked.

Pour résoudre ce problème j’ai supprimer la table « PatchSequence » (pas sûre que ce soit utile) et j’ai ajouté le paramètre « SEQUENCE_DATA_GENERATION_DISABLED=1 » dans la table Properties du PCP.

Les codes d’erreurs renvoyé par msimsp sont généralement ceux retourné par patchwiz.dll.

Installation

Avant de faire un msp avec plusieurs modification faite un petit msp avec une modification très simple (eg changement d’un fichier déjà existant) et essayé de l’appliquer. Parfois le msi de base n’est pas bon et il est tous simplement impossible de créer un msp valide.

Comme pour les MST, si le MSP ne fonctionne pas essayer de l’appliquer en mode « /passive » ou « /quiet ». Le mode GUI désactive certaines fonctionnalités.

Voir la section « Problèmes » concernant les MSI.

Vous pouvez voir les modifications appliquées sur la base de donnés d’un MSI par un MSP en l’appliquant dans Orca via : Transform → View patch…

Pour valider le MSI patché :

Certaine erreurs peuvent être ignorées. Pour faire simple je conseille de lancer les tests sur le MSI non patché puis sur le MSI patché et de comparer les résultats.

Par exemple, lors de la création d’un MSP pour LibreOffice 4.1.6.2, j’ai obtenu le diff de test ICE suivant :

3973a3974,3976
> ICE03	ERROR	Table: Patch Column: StreamRef_ Missing specifications in _Validation Table (or Old Database)
> ICE03	ERROR	Table: MsiPatchHeaders Column: StreamRef Missing specifications in _Validation Table (or Old Database)
> ICE03	ERROR	Table: MsiPatchHeaders Column: Header Missing specifications in _Validation Table (or Old Database)

Cela signifie qu’il y a une erreur dans la table _Validation.

J’ai ajouté dans la tables _Validation les lignes correspondants aux colonnes manquante.

Après création des entrées dans la tables _Validation j’ai obtenu :

3974a3975,3977
> ICE32	ERROR	Possible Mis-Aligned Foreign Keys
> MsiPatchHeaders.1 = s38
> Patch.StreamRef_ = S72

J’ai donc supprimer l’indication de « Foreign Key » dans la table _Validation, les erreurs de validation ont disparue… mais je n’ai pas réussi a faire fonctionner mon MSP. Après vérification il s’agit d’un problème au niveau du MSI de la version 4.1.6.2 de LibreOffice. J’ai eu le même problème avec la version 4.1.4.2 mais pas avec la 4.3.3.1.

LibreOffice

Lors de la création d’un MSP pour LibreOffice 3.5.7 l’installation administrative bogue sur l’enregistrement d’une extension. Il faut désactiver l’action dans le MSI. Dans la colonne RegisterExtensions de la table AdminExecuteSequence il faut changer la condition Not REMOVE="ALL" pour Not REMOVE="ALL" And 1=2.