Domanda

Esiste un modo per leggere le proprietà all'interno del file msi?

Ad esempio, dato un nome di file msi Testpackage.msi

Devo trovare

productName
PackageCode
version

Questo lo userò con la disinstallazione di WMI

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

Aggiornamento:      L'uso di Orca è un'ottima opzione, se ciò può essere ottenuto a livello di codice, quindi posso utilizzarlo per generare note di rilascio automatiche. e anche nel programma di disinstallazione.

È stato utile?

Soluzione

Puoi utilizzare API basata su COM per lavorare con MSI e fai qualcosa del genere

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

Altri suggerimenti

Puoi utilizzare Microsoft's Orca.exe . Orca ti permetterà di aprire l'MSI e modificare / visualizzare tutte le tabelle in esso contenute. Dovrai scaricare l'intero Windows SDK in per ottenerlo, ma per fortuna è gratuito.

Un'alternativa (che potrebbe essere più veloce a causa delle dimensioni del download dell'SDK) è utilizzare dark.exe dal WiX progetto . Dark è un decompilatore MSI, che esporterà tutto in un file XML e in una raccolta di risorse. L'XML che genera avrà le informazioni che stai cercando.

Voglio solo menzionare che le cose sono diventate ancora più facili ora. Esiste un wrapper .NET completo per il modello a oggetti di Windows Installer, quindi è possibile evitare qualsiasi tipo di interoperabilità COM interoperabilità .

Il wrapper si chiama " Deployment Tools Foundation " (DTF) ed ecco la descrizione di base: " Deployment Tools Foundation è un ricco set di librerie di classi .NET e risorse correlate che uniscono le tecnologie della piattaforma di distribuzione Windows nel mondo .NET. È progettato per semplificare notevolmente le attività di sviluppo correlate alla distribuzione, pur esponendo la completa funzionalità della tecnologia sottostante " ;.

Ecco un esempio ridotto e pratico :

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

File DTF primari (gli ultimi due sono i più utilizzati):

  • Microsoft.Deployment.Compression.dll - Framework per l'imballaggio e il disimballaggio dell'archivio.
  • Microsoft.Deployment.Compression.Cab.dll - Implementa l'imballaggio e il disimballaggio dell'archivio del cabinet.
  • Microsoft.Deployment.Resources.dll - Classi per la lettura e la scrittura dei dati delle risorse in file eseguibili.
  • Microsoft.Deployment.WindowsInstaller.dll : libreria di classi completa basata su .NET per le API di Windows Installer.
  • Microsoft.Deployment.WindowsInstaller.Package.dll - Classi estese per lavorare con i pacchetti di installazione e patch di Windows Installer.

Basta creare un progetto C #, fare riferimento a questi file e codificare la propria applicazione di distribuzione con qualsiasi controllo si desideri e sia necessario. Al momento non sono configurato con gli strumenti per DTF, ma vedi questo esempio per un'idea generale di come funzionerebbe un programma C #.

  • DTF è incluso con WIX. Scarica WiX da qui .
  • Le dll DTF si trovano nella cartella SDK nella cartella di installazione principale di WiX (il percorso predefinito è:% ProgramFiles (x86)% \ WiX Toolset v3.10 \ SDK). Il numero di versione sarà probabilmente diverso quando vedrai questo. Cerca la cartella WiX in% ProgramFiles (x86)%.
  • Cerca i file della guida DTF nel " doc " cartella. DTF.chm e DTFAPI.chm . Documentazione assolutamente eccellente per il modello a oggetti e il suo utilizzo.
  • Vedi questo post su serverfault.com per ulteriori dettagli sul DTF
  • Alcuni suggerimenti per iniziare a lavorare con WiX: Pacchetti MSI vs nuget: quali sono i migliori per la consegna continua?

Ecco un esempio simile in VBScript che utilizzo come parte del mio processo di creazione nella creazione di eseguibili 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 

Ho trovato una soluzione leggera non programmatica in lessmsi . Apparentemente usa wix ed esplode l'intero file .msi in una cartella specificata. (Ha anche un'interfaccia utente, ma non ha funzionato perfettamente su Win7).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top