Как программно прочитать свойства внутри файла MSI?
-
08-07-2019 - |
Вопрос
Есть ли способ прочитать свойства внутри файла 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).