Question

Y a-t-il un moyen de lire les propriétés à l'intérieur du fichier msi?

Par exemple, donné un nom de fichier msi Testpackage.msi

J'ai besoin de trouver

productName
PackageCode
version

Je vais l'utiliser avec la désinstallation de WMI

string objPath = string.Format("Win32_Product.IdentifyingNumber='{0}',Name='{1}',Version='{2}'", "{AC9C1263-2BA8-4863-BE18-01232375CE42}", "testproduct", "10.0.0.0");

Mise à jour:      L'utilisation d'Orca est une excellente option. Si cela peut être réalisé par programme, je peux l'utiliser pour générer des notes de publication automatiques. et dans le programme de désinstallation aussi.

Était-ce utile?

La solution

Vous pouvez utiliser l’ API de travail basée sur COM. avec MSI , et faites quelque chose comme

Function GetVersion(ByVal msiName)

    Const msiOpenDatabaseModeReadOnly = 0
    Dim msi, db, view

    Set msi = CreateObject("WindowsInstaller.Installer")
    Set db = msi.OpenDataBase(msiName, msiOpenDatabaseModeReadOnly)
    Set view = db.OpenView("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductVersion'")
    Call view.Execute()

    GetVersion = view.Fetch().StringData(1)

End Function

Autres conseils

Vous pouvez utiliser Microsoft Orca.exe . Orca vous permettra d'ouvrir le fichier MSI et de modifier / afficher toutes les tables qu'il contient. Vous devez télécharger l'intégralité du SDK Windows dans pour l'obtenir, mais heureusement c'est gratuit.

Une alternative (qui pourrait être plus rapide en raison de la taille du téléchargement du SDK) consiste à utiliser dark.exe à partir du WiX. projet . Dark est un décompilateur MSI, qui exporte tout dans un fichier XML et une collection de ressources. Le XML qu’il génère contiendra les informations que vous recherchez.

Je veux juste mentionner que les choses sont devenues encore plus faciles maintenant. Il existe un wrapper .NET complet pour le modèle d'objet Windows Installer. Vous pouvez ainsi éviter toute claque interopérabilité COM .

Le wrapper s'appelle " Outils de déploiement Foundation ". (DTF) et voici la description de base: " Deployment Tools Foundation est un ensemble riche de bibliothèques de classes .NET et de ressources connexes qui, ensemble, amène les technologies de la plate-forme de déploiement Windows dans le monde .NET. Il est conçu pour simplifier considérablement les tâches de développement liées au déploiement tout en exposant toutes les fonctionnalités de la technologie sous-jacente ".

Voici un échantillon simplifié et concret :

using (var db = new Database(FullPath, DatabaseOpenMode.ReadOnly))
{    
  PackageCode = db.SummaryInfo.RevisionNumber;
  AppVendor = db.SummaryInfo.Author;
  AppName = db.SummaryInfo.Title;
  ProductName = db.SummaryInfo.Subject;
  ProductCode = (string)db.ExecuteScalar("SELECT `Value` FROM "+
                 "`Property` WHERE `Property` = 'ProductCode'");
  AppVersion = (string)db.ExecuteScalar("SELECT `Value` FROM "+
                 "`Property` WHERE `Property` = 'ProductVersion'");
  UpgradeCode = (string)db.ExecuteScalar("SELECT `Value` FROM "+
                 " `Property` WHERE `Property` = 'UpgradeCode'");
}

Fichiers DTF primaires (les deux derniers sont les plus utilisés):

  • Microsoft.Deployment.Compression.dll - Cadre pour l'archivage et le décompactage des archives.
  • Microsoft.Deployment.Compression.Cab.dll : implémente le compactage et le décompactage des archives .cab.
  • Microsoft.Deployment.Resources.dll - Classes pour la lecture et l'écriture de données de ressources dans des fichiers exécutables.
  • Microsoft.Deployment.WindowsInstaller.dll : bibliothèque de classes complète basée sur .NET pour les API Windows Installer.
  • Microsoft.Deployment.WindowsInstaller.Package.dll - Classes étendues permettant de travailler avec l'installation de Windows Installer et les packages de correctifs.

Créez simplement un projet C #, référencez ces fichiers et codez votre propre application de déploiement avec le contrôle que vous désirez et dont vous avez besoin. Je ne suis pas encore familiarisé avec les outils pour DTF, mais consultez cet exemple pour une idée générale du fonctionnement d'un programme C #.

  • DTF est inclus avec WIX. Téléchargez WiX à partir d'ici .
  • Les dll DTF se trouvent dans le dossier SDK du dossier d’installation principal de WiX (l’emplacement par défaut est:% ProgramFiles (x86)% \ WiX Toolset v3.10 \ SDK). Le numéro de version sera probablement différent au moment où vous verrez ceci. Recherchez simplement le dossier WiX sous% ProgramFiles (x86)%.
  • Recherchez les fichiers d'aide DTF dans la liste "doc". dossier. DTF.chm et DTFAPI.chm . Une documentation absolument excellente pour le modèle objet et son utilisation.
  • Voir cet article serverfault.com pour plus d'informations sur le format DTF
  • Quelques suggestions de démarrage pour utiliser WiX: Paquets MSI vs Nuget: quels sont les meilleurs pour la distribution continue?

Voici un exemple similaire dans VBScript que j'utilise dans le cadre de mon processus de construction pour créer des exécutables de bootstrapper ...

Option Explicit
Const MY_MSI = "product.msi"

Dim installer, database, view, result, sumInfo, sPackageCode

Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase (MY_MSI, 0)

Set sumInfo = installer.SummaryInformation(MY_MSI, 0)
sPackageCode =  sumInfo.Property(9) ' PID_REVNUMBER = 9, contains the package code.

WScript.Echo "ProductVersion=" & getproperty("ProductVersion")
WScript.Echo "ProductCode=" & getproperty("ProductCode") 
WScript.Echo "PackageCode=" & sPackageCode 
WScript.Echo "ProductName=" & getproperty("ProductName") 

Function getproperty(property)

    Set view = database.OpenView ("SELECT Value FROM Property WHERE Property='" & property & "'")
    view.Execute
    Set result = view.Fetch
    getproperty = result.StringData(1)

End Function 

J'ai trouvé une solution légère non programmatique dans lessmsi . Il utilise apparemment wix et fait exploser tout le fichier .msi dans un dossier spécifié. (Il a également une interface utilisateur, mais il n'a pas rendu grand pour moi sur Win7).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top