MSI vs MSIX : que choisir en 2026 ?
Deux formats d'installateur Windows coexistent en 2026. MSI (Windows Installer) est le format historique, universel, compatible Windows 7 à 11, déployable via GPO et SCCM. MSIX est le format moderne de Microsoft, sandboxé, compatible Microsoft Store, mise à jour différentielle native — mais limité à Windows 10/11.
- Choisir MSI : parc mixte Windows 7/8/10/11, déploiement SCCM/GPO, environnement enterprise classique.
- Choisir MSIX : Windows 10/11 uniquement, distribution via Store ou Intune, isolation des processus requise.
- Choisir les deux : Universal Installer V2 génère les deux depuis la même source.
Un MSI sans signature Authenticode déclenche des avertissements SmartScreen sur tous les Windows modernes. La signature n'est pas optionnelle pour une distribution professionnelle.
Prérequis et outils
# Outils requis (Windows uniquement pour MSI)
# 1. WiX Toolset v4 (remplace WiX v3 en 2024)
dotnet tool install --global wix
# 2. PyInstaller pour bundler Python
pip install pyinstaller
# 3. SignTool (inclus dans Windows SDK)
# Chemin typique :
# C:\Program Files (x86)\Windows Kitsin.0.22621.0d\signtool.exe
# 4. Certificat code signing
# EV Code Signing Certificate (DigiCert, Sectigo) : ~300€/an
# Standard OV : ~100€/an (moins de confiance SmartScreen)
Étape 1 : bundler avec PyInstaller
# pyinstaller.spec
a = Analysis(
['main.py'],
pathex=[],
binaries=[],
datas=[(r'assets/', 'assets')],
hiddenimports=[],
)
pyz = PYZ(a.pure)
exe = EXE(
pyz, a.scripts, a.binaries, a.datas,
name='MonApp',
icon='assets/icon.ico',
version='version_info.txt',
uac_admin=False,
console=False,
)
# version_info.txt (métadonnées du binaire)
VSVersionInfo(
ffi=FixedFileInfo(
filevers=(1,1,0,0),
prodvers=(1,1,0,0),
),
kids=[
StringFileInfo([StringTable('040904B0', [
StringStruct('ProductName', 'MonApp'),
StringStruct('CompanyName', 'TRUvector'),
StringStruct('FileVersion', '1.1.0.0'),
])])
]
)
Étape 2 : générer le MSI avec WiX v4
<!-- MonApp.wxs -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
<Package
Name="MonApp" Version="1.1.0"
Manufacturer="TRUvector"
UpgradeCode="PUT-GUID-HERE"
Language="1036" Codepage="1252">
<MajorUpgrade DowngradeErrorMessage="Version plus récente installée."/>
<MediaTemplate EmbedCab="yes"/>
<Feature Id="Main" Level="1">
<ComponentGroupRef Id="AppFiles"/>
</Feature>
<ComponentGroup Id="AppFiles" Directory="INSTALLFOLDER">
<Component>
<File Source="dist/MonApp.exe" KeyPath="yes"/>
</Component>
</ComponentGroup>
</Package>
</Wix>
# Compiler le MSI
wix build MonApp.wxs -o dist/MonApp_v1.1.msi
Étape 3 : signer avec Authenticode
# Signer l'EXE (avant de l'inclure dans le MSI)
signtool sign ^
/tr http://timestamp.digicert.com /td sha256 ^
/fd sha256 ^
/a ^
dist/MonApp.exe
# Signer le MSI lui-même
signtool sign ^
/tr http://timestamp.digicert.com /td sha256 ^
/fd sha256 ^
/a ^
dist/MonApp_v1.1.msi
# Vérifier la signature
signtool verify /pa /v dist/MonApp_v1.1.msi
Important : signer avant le timestamp. Le timestamp garantit que la signature reste valide même après expiration du certificat.
Étape 4 : personnaliser l'UI d'installation
WiX v4 propose plusieurs UI sets prédéfinis. Pour une UI personnalisée avec votre logo :
<!-- Ajouter dans le .wxs -->
<WixVariable Id="WixUIBannerBmp" Value="assets/banner.bmp"/>
<WixVariable Id="WixUIDialogBmp" Value="assets/dialog.bmp"/>
<UIRef Id="WixUI_InstallDir"/>
Intégration CI/CD
# .gitlab-ci.yml
build-msi:
tags: [windows]
script:
- pip install pyinstaller
- pyinstaller MonApp.spec
- wix build MonApp.wxs -o dist/MonApp_$CI_COMMIT_TAG.msi
- signtool sign /tr http://timestamp.digicert.com /td sha256 /fd sha256
/f $env:CERT_PATH /p $env:CERT_PASSWORD
dist/MonApp_$CI_COMMIT_TAG.msi
artifacts:
paths: [dist/*.msi]
only: [tags]
Universal Installer — génération automatique
Universal Installer V2 automatise l'ensemble de ce pipeline depuis une interface graphique ou en ligne de commande :
# Générer MSI + MSIX depuis une archive UXC
universal-installer make-installer --source dist/app_v1.1.uxc --type msi,msix --name "MonApp" --version "1.1.0" --manufacturer "TRUvector" --sign --cert-store MY --output dist/installers/
Le Canvas MSI interactif (section §24 du manuel) permet de visualiser et modifier le flowchart d'installation graphiquement avant compilation.
Conclusion
Générer un MSI professionnel depuis Python en 2026 requiert PyInstaller + WiX Toolset v4 + SignTool Authenticode. Universal Installer V2 automatise l'ensemble de ce pipeline et génère simultanément MSI, MSIX, Snap et PKG depuis la même source UXC. La signature Authenticode est non négociable pour la distribution professionnelle.