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 :
- utiliser l’installeur trouvé sur le site clubic
- installer le module « Win32 Development Tools » du SDK Windows et utiliser l’installeur Orca.msi du répertoire
Bindu SDK.
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 ») :
- Ouvrir le MSI
- Transform → New Transform…
- faire les modifications
- Transform → Generate 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 :
-
faire une installation « administrative » du MSI dans C:\MSP\OLD
msiexec /a LibO…msi TARGETDIR=C:\MSP\OLD -
copier le répertoire
OLDet le renommer cette copieNEW -
faire les modification voulu dans le répertoire
NEW- ajouter/modifier/supprimer des fichiers
- modifier le MSI avec Orca, à minima :
- modifier la table « File » pour refléter les changement appliqués à l’étape précédente
- changer le « package code » du MSI : View → Summary Information → Package Code → New GUID
- dans la table « Properties », changer (ou non) le « Productcode » et le « ProductVersion » suivant le type de MSP que vous voulez obtenir
-
télécharger le fichier template.pcp
-
éditer le avec Orca, modifier à minima les tables (documentation officiel des tables) :
- PatchMetadata
- pour générer le GUID du MSP, utiliser le bouton « past new guid » de la barre d’outils
- Properties
- TargetImages
- UpgradedImages
- PatchMetadata
-
enregistrer le pcp
-
lancer l’invite de commande du SDK :
- Démarrer → Programmes → Microsoft Windows SDK … → CMD Shell
-
générer le MSP via la commande
msimsp.exe -d -s template.pcp -p output.msp
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 :
- ouvrir le MSP dans Orca
- View → Summary Information
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é :
- ouvrir le MSI dans Orca
- appliquer le MSP :
- Transform → View patch…
- lancer les tests :
- Tools → Validation…
- Evaluation File: Full MSI Validation Suite
- « ICEs To Run: » reste vide
- décocher « Show “INFO” Messages »
- Go
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.