Как я могу изменить MSI в памяти? - PullRequest
4 голосов
/ 03 марта 2010

Я бы хотел прочитать файл MSI в MemoryStream (или что-то подобное) и изменить его. Какой самый простой способ сделать это, не повредив MSI?

Все, что мне нужно сделать, это изменить значение одного из свойств в MSI. Я бы предпочел что-то в .Net, но я открыт для других платформ.

Обновление:

Вот мой рабочий код, использующий SDK для платформы Windows, ссылку COM на библиотеку объектов установщика Microsoft Windows и пространство имен WindowsInstaller:

Installer installer = Activator.CreateInstance(Type.GetTypeFromProgID("WindowsInstaller.Installer")) as Installer;

Database msi = installer.OpenDatabase("WixTest.msi", MsiOpenDatabaseMode.msiOpenDatabaseModeTransact);

View view = msi.OpenView("update `Property` SET `Property`.`Value`='99' where `Property`='USERID'");

view.Execute(null);

msi.Commit();

Ответы [ 2 ]

3 голосов
/ 04 марта 2010

Проверьте Windows SDK , есть несколько примеров использования Windows Installer API *1003*.

Вот упрощенная версия командной строки VBScript, которую я использую для этого:

Option Explicit


Const msiOpenDatabaseModeReadOnly     = 0
Const msiOpenDatabaseModeTransact     = 1

Dim openMode : openMode = msiOpenDatabaseModeTransact

Dim argCount:argCount = Wscript.Arguments.Count

If (argCount < 3) Then  WScript.Echo "usage: msisetproperty.vbs <msi> <property> <value>" :     WScript.Quit 1

Dim MY_MSI : MY_MSI = Wscript.Arguments(0)
Dim sProp1 : sProp1 = Wscript.Arguments(1)
Dim sVal1  : sVal1 = Wscript.Arguments(2)

Dim filesys : Set filesys=CreateObject("Scripting.FileSystemObject")

If Not filesys.FileExists(MY_MSI) Then WScript.Echo "Unable to find msi, exiting" : WScript.Quit 1

Dim installer, database, view, result

Set installer = CreateObject("WindowsInstaller.Installer")
Dim sumInfo  : Set sumInfo = installer.SummaryInformation(MY_MSI, 0)

Set database = installer.OpenDatabase (MY_MSI, openMode)

Set view = database.OpenView ("UPDATE Property SET Value='" & sVal1 & "' WHERE Property='" & sProp1 & "'")
view.Execute

database.Commit
Set database = nothing
0 голосов
/ 03 мая 2012

Несмотря на то, что этот пост действительно старый, для пользователей, попавших сюда через поисковые системы, существует очень аккуратная библиотека .Net, которая реализует почти все функциональные возможности Windows Installer SDK и активно поддерживается Роб Меншинг, старший разработчик в Microsoft. Он присутствует в наборе инструментов Wix, и вы можете получить v3.6 RC0 здесь. После установки этого набора инструментов добавьте ссылку на файл Microsoft.Deployment.WindowsInstaller.dll, присутствующий в каталоге установки этого набора инструментов, и все готово. Вы можете легко загрузить всю базу данных MSI в DataSet, выполнить необходимые операции чтения / записи и, наконец, зафиксировать изменения в MSI.

...