2008-11-18 5 views
5

Есть ли способ прочитать свойства внутри файла msi?Как программно читать свойства внутри файла MSI?

В приведенном примере имя файла MSI Testpackage.msi

Мне нужно найти

productName 
PackageCode 
version 

Это я собираюсь использовать его с WMI деинсталлировать

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

Обновление: Использование Orca - отличный вариант, если это может быть достигнуто программно, то я могу использовать это для создания автоматических заметок. и в программе установки.

ответ

6

Вы можете использовать COM-based API for working with MSI, и сделать что-то вроде

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 
+0

Также ознакомьтесь с инструментом командной строки MsiInfo.exe (также часть Windows SDK). Он может читать и записывать сводную информацию MSI (включая Oh-so-painful Package Code). – 2009-11-23 18:38:04

+0

Пожалуйста, см. Мой ответ ниже для того, что, по моему мнению, является более простым и надежным способом доступа к MSI. – 2011-05-14 17:29:00

6

Вы можете использовать Microsoft's Orca.exe. Orca позволит вам открыть MSI и отредактировать/просмотреть все таблицы в нем. Вам нужно будет скачать весь Windows SDK, чтобы получить его, но, к счастью, это бесплатно.

Одна из альтернатив (которая может быть быстрее из-за размера загрузки SDK) заключается в использовании dark.exe из WiX project. Dark - декомпилятор MSI, который будет экспортировать все в XML-файл и сбор ресурсов. Полученный XML-файл будет содержать информацию, которую вы ищете.

+0

Сам Orca также доступен здесь -> http://astebner.sts.winisp.net/Tools/Orca.zip – 2008-11-18 14:25:07

+0

Ссылка больше не действительна – Philm 2014-09-19 14:48:50

6

Я просто хочу сказать, что все стало еще проще. Существует полная оболочка .NET для объектной модели установщика Windows, поэтому вы можете избежать любой сложности взаимодействия COM.

Обертка называется «Средство развертывания Foundation» (DTF) и здесь является основным описанием: "Средство развертывания Фонда является богатым набором библиотек классов .NET и связанными с ними ресурсы, которые вместе приносят платформенные технологии развертывания Windows в мир .NET. Он призван значительно упростить задачи разработки, связанные с развертыванием, при этом все еще раскрывая полную функциональность базовой технологии ».

Вот урезанная, практический образец:

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

Первичные DTF файлы (последние два являются наиболее часто используемые из них):

  • Microsoft. Deployment.Compression.dll - Структура для архивирования упаковки и распаковки.
  • Microsoft.Deployment.Compression.Cab.dll - Осуществляет упаковку и распаковку шкафа архивов.
  • Microsoft.Deployment.Resources.dll - Классы для чтения и записи данных ресурсов в исполняемых файлах.
  • Microsoft.Deployment.WindowsInstaller.dll - Полная библиотека классов .NET для API-интерфейсов Windows Installer.
  • Microsoft.Deployment.WindowsInstaller.Package.dll - Расширенные классы для работы с установкой установщика Windows и пакетами исправлений.

Просто создайте проект C#, обратитесь к этим файлам и запрограммируйте свое собственное приложение развертывания с помощью любого управляемого элемента управления. На данный момент я не настроен с инструментами для DTF, но см. this sample для общего представления о том, как будет работать программа C#.

  • DTF прилагается к WIX. Download WiX from here.
  • DLL-файлы DTF находятся в папке SDK в основной папке установки WiX (по умолчанию выбрано:% ProgramFiles (x86)% \ WiX Toolset v3.10 \ SDK). Номер версии, вероятно, будет отличаться к тому моменту, когда вы это увидите. Просто найдите папку WiX в% ProgramFiles (x86)%.
  • Ищите файлы помощи DTF в папке «doc». DTF.chm и DTFAPI.chm. Абсолютно отличная документация для объектной модели и ее использования.
  • См this serverfault.com post для некоторых более DTF деталей
  • Некоторые предложения стартера для работы с WiX: MSI vs nuget packages: which are is better for continuous delivery?
3

Вот подобный пример в VBScript, который я использую как часть моего процесса сборки в создании загрузчика исполняемых файлов ...

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 
1

Я нашел легкое непрограммное решение в lessmsi. По-видимому, он использует wix и просто взрывает весь .msi в указанную папку. (У него также есть пользовательский интерфейс, но для Win7 он не выглядел отлично.

Смежные вопросы