Pregunta

¿Hay alguna forma de leer las propiedades dentro del archivo msi?

Por ejemplo, dado un nombre de archivo msi Testpackage.msi

Necesito encontrar

productName
PackageCode
version

Esto lo voy a usar con la desinstalación de WMI

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

Actualización:      Usar Orca es una gran opción, si esto se puede lograr mediante programación, entonces puedo usar esto para generar notas de lanzamiento automáticas. y en el programa de desinstalación también.

¿Fue útil?

Solución

Puede usar la API basada en COM para trabajar con MSI , y hacer algo como

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

Otros consejos

Puede usar Microsoft's Orca.exe . Orca le permitirá abrir el MSI y editar / ver todas las tablas en él. Tendrá que descargar todo el Windows SDK en para obtenerlo, pero afortunadamente eso es gratis.

Una alternativa (que podría ser más rápida debido al tamaño de descarga del SDK) es usar dark.exe desde el WiX proyecto . Dark es un descompilador MSI, que exportará todo a un archivo XML y una colección de recursos. El XML que genera tendrá la información que está buscando.

Solo quiero mencionar que las cosas se han vuelto aún más fáciles ahora. Existe un contenedor completo de .NET para el modelo de objetos de Windows Installer, por lo que puede evitar cualquier cliché de interoperabilidad COM .

El contenedor se llama " Deployment Tools Foundation " (DTF) y aquí está la descripción básica: " Deployment Tools Foundation es un rico conjunto de bibliotecas de clase .NET y recursos relacionados que juntas traen las tecnologías de la plataforma de implementación de Windows al mundo .NET. Está diseñado para simplificar enormemente las tareas de desarrollo relacionadas con la implementación y al mismo tiempo exponer la funcionalidad completa de la tecnología subyacente " ;.

Aquí hay una muestra práctica y despojada :

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

Archivos DTF primarios (los dos últimos son los más utilizados):

  • Microsoft.Deployment.Compression.dll - Marco para empaquetar y desempaquetar archivos.
  • Microsoft.Deployment.Compression.Cab.dll : implementa el empaquetado y desempaquetado de archivadores de gabinete.
  • Microsoft.Deployment.Resources.dll : clases para leer y escribir datos de recursos en archivos ejecutables.
  • Microsoft.Deployment.WindowsInstaller.dll : completa la biblioteca de clases basada en .NET para las API de Windows Installer.
  • Microsoft.Deployment.WindowsInstaller.Package.dll - Clases extendidas para trabajar con la instalación de Windows Installer y paquetes de parches.

Simplemente cree un proyecto C #, haga referencia a estos archivos y codifique su propia aplicación de implementación con el control que desee y necesite. No estoy configurado con las herramientas para DTF en este momento, pero vea esta muestra para una idea general de cómo funcionaría un programa C #.

  • DTF se incluye con WIX. Descargue WiX desde aquí .
  • Los archivos DTF están en la carpeta SDK en la carpeta principal de instalación de WiX (la ubicación predeterminada es:% ProgramFiles (x86)% \ WiX Toolset v3.10 \ SDK). El número de versión probablemente será diferente para cuando vea esto. Simplemente busque la carpeta WiX en% ProgramFiles (x86)%.
  • Busque los archivos de ayuda DTF en el " doc " carpeta. DTF.chm y DTFAPI.chm . Documentación absolutamente excelente para el modelo de objetos y su uso.
  • Consulte esta publicación de serverfault.com para obtener más detalles sobre DTF
  • Algunas sugerencias iniciales para trabajar con WiX: Paquetes MSI vs nuget: ¿cuáles son mejores para la entrega continua?

Aquí hay un ejemplo similar en VBScript que utilizo como parte de mi proceso de compilación al crear ejecutables de arranque ...

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 

Encontré una solución no programática liviana en lessmsi . Aparentemente usa wix y simplemente explota todo el .msi en una carpeta específica. (También tiene una interfaz de usuario, pero no me funcionó muy bien en Win7).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top