Pergunta

Existe alguma maneira para ler as propriedades dentro do arquivo msi?

Por exemplo dado um nome de arquivo msi Testpackage.msi

Eu preciso encontrar

productName
PackageCode
version

Esta vou usá-lo com WMI desinstalação

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

Update: Usando Orca é uma ótima opção, se isso pode ser conseguido através de programação, então eu posso usar isso para gerar notas de versão automática. e un-instalar o programa também.

Foi útil?

Solução

Você pode usar a API baseada em COM de trabalho com MSI , e fazer 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

Outras dicas

Você pode usar Orca.exe da Microsoft. Orca irá permitir que você abrir a MSI e editar / visualizar todas as tabelas nele. Você terá que baixar todo o Windows SDK em para obtê-lo, mas felizmente que é livre.

Uma alternativa (que pode ser mais rápido devido ao tamanho do download do SDK) é usar dark.exe do WiX projetar . Escuro é um decompiler MSI, que vai exportar tudo em um arquivo XML e coleta de recursos. O XML ele gera terá a informação que você está procurando.

Eu só quero mencionar que as coisas ficaram ainda mais fácil agora. Não é um wrapper .NET completo para o modelo de objeto Windows Installer, para que possa evitar qualquer interoperabilidade clunkiness .

O invólucro é chamado de " Ferramentas de Implantação Fundação " (DTF) e aqui é a descrição básica: " Ferramentas de Implantação Foundation é um rico conjunto de bibliotecas de classes .NET e recursos relacionados que juntos trazer as tecnologias de plataforma de implantação do Windows para o mundo da NET. Ele é projetado para tarefas de desenvolvimento de implantação relacionada simplificar bastante enquanto ainda expor a funcionalidade completa da tecnologia subjacente ".

Aqui é um despojado, hands-on de amostra :

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

Os arquivos DTF primária (os dois últimos são os mais utilizados):

  • Microsoft.Deployment.Compression.dll -. Framework para a embalagem de arquivo e de desembalar
  • Microsoft.Deployment.Compression.Cab.dll -. Implementos embalagem arquivo de gabinete e desembalar
  • Microsoft.Deployment.Resources.dll -. Classes para ler e escrever dados de recursos em arquivos executáveis ??
  • Microsoft.Deployment.WindowsInstaller.dll -. NET biblioteca de classes base completa para as APIs do Windows Installer
  • Microsoft.Deployment.WindowsInstaller.Package.dll -. Classes estendidas para trabalhar com pacotes de instalação e patch do Windows Installer

Apenas criar um projeto C #, referência a esses arquivos, e o código de seu próprio aplicativo de implantação com o que quer controlar você deseja e precisa. Não estou configurado com as ferramentas para DTF no momento, mas veja esta amostra para uma idéia geral de como um programa C # iria funcionar.

  • DTF está incluído no WIX. Fazer download WiX daqui .
  • As DLLs DTF estão na pasta SDK na pasta de instalação WiX principal (o local padrão é:% ProgramFiles (x86)% \ WiX Toolset v3.10 \ SDK). O número da versão provavelmente será diferente pelo tempo que você ver isso. Basta olhar para a pasta WiX sob% ProgramFiles (x86)%.
  • Procure o DTF arquivos de ajuda na pasta "doc". DTF.chm e DTFAPI.chm . Absolutamente excelente documentação para o modelo de objeto e sua utilização.
  • este post serverfault.com para mais alguns detalhes DTF
  • Algumas sugestões iniciais para trabalhar com WiX: MSI vs pacotes NuGet: que são é melhor para a entrega contínua
  • ?

Aqui está um exemplo semelhante em VBScript que eu uso como parte do meu processo de construção na criação de bootstrapper executáveis ??...

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 

Eu encontrei uma solução não-programática leve em lessmsi . Ele, aparentemente, usa Wix e apenas explode toda a .msi em uma pasta especificada. (Ele também tem uma interface do usuário, mas não prestou grande para mim no Win7).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top