Frage

Gibt es eine Möglichkeit, die Eigenschaften in der msi-Datei zu lesen?

Zum Beispiel gegeben ein msi Dateinamen Testpackage.msi

Ich brauche zu finden

productName
PackageCode
version

Das habe ich es mit WMI uninstall

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

Update:      Orca ist eine großartige Option, wenn diese programmatisch erreicht werden kann, dann kann ich diese verwenden, um die automatischen Versionshinweisen zu erzeugen. und in un-Installationsprogramm zu.

War es hilfreich?

Lösung

Sie können die COM-basierte API für die Arbeit mit MSI , und tun so etwas wie

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

Andere Tipps

Sie können mit Microsofts Orca.exe . Orca können Sie die MSI und Bearbeiten / Ansicht werden die Tabellen alle in sie öffnen. Sie müssen die gesamte Windows SDK herunterladen müssen in um es zu bekommen, aber zum Glück, dass frei ist.

Eine Alternative (die schneller durch sein könnte auf die Download-Größe des SDK) ist dark.exe aus dem WiX zu verwenden Projekt . Dark ist ein MSI-Decompiler, die alles in eine XML-Datei und Sammlung von Ressourcen exportieren. Die XML-es gibt die Informationen, die Sie suchen.

Ich möchte nur erwähnen, dass die Dinge jetzt noch einfacher geworden. Es gibt eine volle .NET Wrapper für das Windows Installer-Objektmodell, so dass Sie jede COM-Interop clunkiness vermeiden .

Der Wrapper heißt " Deployment Tools Foundation " (DTF) und hier ist die grundlegende Beschreibung: „ Deployment Tools Foundation ist eine reiche Reihe von .NET-Klassenbibliotheken und verwandten Ressourcen, die zusammen bringen die Deployment-Plattform Windows-Technologien in die .NET-Welt. Es wurde entwickelt, um stark Bereitstellung bezogene Entwicklungsaufgaben zu vereinfachen und gleichzeitig die komplette Funktionalität der zugrunde liegenden Technologie aussetzt “.

Hier ist eine abgespeckte, Hands-on-Probe :

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'");
}

Primäre DTF-Dateien (die beiden letzteren sind die am häufigsten verwendeten sind):

  • Microsoft.Deployment.Compression.dll -. Rahmen für Archiv und Auspacker
  • Microsoft.Deployment.Compression.Cab.dll -. Implementiert Schrank Archiv Packen und Entpacken
  • Microsoft.Deployment.Resources.dll -. Klassen zum Lesen und Schreiben von Ressourcendaten in ausführbaren Dateien
  • Microsoft.Deployment.WindowsInstaller.dll -. Komplett .NET basierte Klassenbibliothek für die Windows Installer-APIs
  • Microsoft.Deployment.WindowsInstaller.Package.dll -. Erweiterte Klassen für Windows Installer Installation und Patch-Pakete arbeiten

Nur eine C # -Projekt erstellen, diese Dateien verweisen und Ihre eigene Bereitstellung Anwendungscode mit dem, was Sie Steuerung und Notwendigkeit wünschen. Ich bin nicht mit den Werkzeugen für DTF im Moment, aber finden Sie unter diese Probe einrichten für eine allgemeine Vorstellung davon, wie ein C # Programm funktionieren würde.

  • DTF mit WIX enthalten. Herunterladen WiX von hier .
  • Der DTF-DLLs in den SDK-Ordnern im Haupt WiX-Installationsordner (das Standardverzeichnis ist:% Programfiles (x86)% \ WiX Toolset v3.10 \ SDK). Die Versionsnummer wird wahrscheinlich anders sein durch die Zeit, die Sie sehen. Suchen Sie einfach nach dem WiX-Ordner unter% Programfiles (x86)%.
  • Achten Sie auf die DTF-Hilfedateien im "doc" -Ordner. DTF.chm und DTFAPI.chm . Absolut ausgezeichnete Dokumentation für das Objektmodell und seine Verwendung.
  • Siehe dieses serverfault.com Post anzeigen für einige weitere DTF Details
  • Einige Starter Vorschläge mit WiX arbeiten: MSI vs nuget Pakete: die für die kontinuierliche Lieferung ist besser
  • ?

Hier ist ein ähnliches Beispiel in VBScript, die ich als Teil meines Build-Prozesses ausführbare Dateien bei der Schaffung von Bootstrap-Programm verwenden ...

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 

fand ich eine leichte nicht-programmatische Lösung in lessmsi . Es nutzt offenbar wix und explodiert einfach die ganze .msi in einen bestimmten Ordner. (Es hat auch eine Benutzeroberfläche, aber es hat für mich auf Win7 nicht groß machen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top