Вопрос

Есть ли способ прочитать свойства внутри файла MSI?

Например, с именем файла MSI Testpackage.msi.

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

productName
PackageCode
version

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

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

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

Это было полезно?

Решение

Вы можете использовать API на базе COM для работы с 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

Другие советы

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

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

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

Обертка называется "Фонд средств развертывания(DTF) и вот основное описание:"Deployment Tools Foundation — это богатый набор библиотек классов .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.
  • Microsoft.Deployment.WindowsInstaller.Package.dll — Расширенные классы для работы с пакетами установки и исправлений установщика Windows.

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

  • DTF включен в WIX. Загрузите WiX отсюда.
  • DLL-файлы DTF находятся в папке SDK в основной папке установки WiX (по умолчанию:%ProgramFiles(x86)%\WiX Toolset v3.10\SDK).К тому времени, когда вы это увидите, номер версии, вероятно, будет другим.Просто найдите папку WiX в папке %ProgramFiles(x86)%.
  • Ищите Файлы справки DTF в папке «док». DTF.chm и DTFAPI.chm.Абсолютно отличная документация по объектной модели и ее использованию.
  • Видеть этот пост на serverfault.com для получения дополнительной информации о DTF
  • Некоторые начальные предложения по работе с WiX: MSI против пакетов nuget:какие лучше для непрерывной доставки?

Вот аналогичный пример на 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 

Я нашел легкое непрограммное решение в меньшемси.Очевидно, он использует Wix и просто взрывает весь .msi в указанную папку.(У него также есть пользовательский интерфейс, но он не очень хорошо отображался на Win7).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top