Самое простое решение для замены крошечного файла внутри MSI? - PullRequest
11 голосов
/ 26 ноября 2008

Многие наши клиенты имеют доступ к InstallShield, WISE или AdminStudio. Это не проблема. Я надеюсь, что есть какой-то способ предоставить нашим меньшим клиентам без доступа к коммерческим инструментам переупаковки бесплатный набор инструментов и шагов для самостоятельной замены файла.

Необходимо заменить только один файл конфигурации внутри сжатого MSI. Предполагается, что целевой пользователь уже установил Orca, знает, как его использовать для настройки таблицы свойств (для встраивания деталей лицензии для развертывания объекта групповой политики), и сгенерировал файл MST.



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

Ответы [ 5 ]

9 голосов
/ 06 февраля 2009

Хорошо, вернемся к этому вопросу с моим собственным ответом, предоставив хороший маленький VB-скрипт, который сделает всю тяжелую работу. Как упоминалось в первоначальном вопросе, цель состояла в том, чтобы предоставить пользователям sysadmin простое решение для внесения обновлений / изменений самостоятельно.

Ниже приведена упрощенная версия кода, который я сейчас предоставляю клиентам

Option Explicit

Const MY_CONFIG = "MyConfigApp.xml"
Const CAB_FILE = "config.cab"
Const MSI = "MyApp.msi"

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

If filesys.FileExists("temp.tmp") Then filesys.DeleteFile("temp.tmp")
filesys.CopyFile MSI, "temp.tmp"

Dim installer, database, database2, view
Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase ("temp.tmp", 1)
Set database2 = installer.OpenDatabase (MSI, 1)

If Not filesys.FileExists(MY_CONFIG) Then WScript.Quit 2 ' No config file, abort!

Dim objFile, size, result, seq, objCab

' MakeCab object has been depreciated so we fallback to makecab.exe for with Windows 7
On Error Resume Next ' Disable error handling, for a moment
Set objCab = CreateObject("MakeCab.MakeCab.1") 
On Error Goto 0  ' Turn error handling back on

If IsObject(objCab) Then ' Object creation successful - use XP method   
    objCab.CreateCab CAB_FILE, False, False, False
    objCab.AddFile MY_CONFIG, filesys.GetFileName(MY_CONFIG)
    objCab.CloseCab
    Set objCab = Nothing
Else ' object creation failed - try Windows 7 method
    Dim WshShell, oExec
    Set WshShell = CreateObject("WScript.Shell")
    Set oExec = WshShell.Exec("makecab " & filesys.GetFileName(MY_CONFIG) & " " & CAB_FILE)
End If

Set objFile = filesys.GetFile(MY_CONFIG)
size = objFile.Size

Set view = database.OpenView ("SELECT LastSequence FROM Media WHERE DiskId = 1")
view.Execute
Set result = view.Fetch
seq = result.StringData(1) + 1 ' Sequence for new configuration file

Set view = database.OpenView ("INSERT INTO Media (DiskId, LastSequence, Cabinet) VALUES ('2', '" & seq & "', '" & CAB_FILE & "')")
view.Execute

Set view = database.OpenView ("UPDATE File SET FileSize = " & size & ", Sequence = " & seq & ", FileName = 'MYC~2.CNF|MyConfigApp.xml' WHERE File = '" & MY_CONFIG & "'")
view.Execute

database.GenerateTransform database2, "CustomConfig.mst"
database.CreateTransformSummaryInfo database2, "CustomConfig.mst", 0, 0
filesys.DeleteFile("temp.tmp")

Set view = nothing
Set installer = nothing
Set database = nothing
Set database2 = nothing
Set filesys = Nothing
WScript.Quit 0

Обновление: Объект MakeCab.MakeCab.1 устарел, код обновлен для работы с Windows 7.

2 голосов
/ 29 июня 2009

ИМХО такой сценарий указывает на отсутствующую функцию в устанавливаемом приложении, и его легче исправить в приложении, чем взламывать MSI.


Изображение администратора

Позвольте мне сначала сказать, что простой способ «решить» это для ваших пользователей - это попросить их запустить Установку администратора вашего MSI. Это по существу извлечет все файлы из внутренних CAB-файлов и поместит все файлы в указанную папку:

msiexec.exe / a myinstaller.msi TARGETDIR = C: \ AdminImage

Затем ваши пользователи могут перейти непосредственно в извлеченную структуру папок и обновить нужный файл, а затем сопоставить каталог с другими ПК и установить MSI. Это может иметь побочные эффекты, связанные с тем, что файл имеет значение хеша в MSI (чтобы избежать подмены), но в большинстве случаев он работает нормально.


Запуск XML XPath Query

Новые версии инструментов развертывания, такие как Installshield и Wix, имеют встроенную поддержку для запуска запросов XPath во время установки и, следовательно, для динамической записи разделов.


Обновление приложения

Настройка приложения на ПК состоит из нескольких этапов. Во-первых, это развертывание контента на машине - это должно быть сделано с использованием MSI, без сомнений. Однако в большинстве расширенных приложений требуется несколько «задач конфигурации после установки», аналогичных этому «обновлению файла конфигурации».

Почти всегда лучше отложить эти задачи настройки до запуска приложения , чем реализовывать функции в MSI. Для этого есть много причин, но самая важная из них заключается в том, что только приложение EXE будет гарантированно работать в правильном пользовательском контексте. Файлы MSI можно запускать с правами системы, с другой учетной записью пользователя или с помощью другого механизма.

Как правило, мы рекомендуем использовать MSI для передачи всего необходимого контента на ПК . Затем пометьте реестр, чтобы указать приложению, что это первый запуск (для обновлений вы можете увеличить счетчик или записать новый номер версии в HKLM). Затем приложение может выполнить последние шаги настройки в своей процедуре запуска. Он может скопировать файл config.xml по умолчанию откуда-то в% ProgramFiles% и скопировать его в профиль пользователя. Затем он может прочитать требуемые значения из HKLM, записанные MSI, а затем обновить файл config.xml этими значениями.

В целом: избегайте шагов конфигурации, выполняемых MSI или любым другим механизмом настройки. Сконцентрируйтесь на записи необходимых файлов и элементов реестра на компьютер, а затем дайте приложению самостоятельно настроить надлежащую среду выполнения. Это позволит намного лучше контролировать развертывание. Лучше "Инкапсуляция", если хотите. MSI отправляет «сообщение» приложению через реестр, и приложение знает «как правильно настроить себя» на основе сообщений.

2 голосов
/ 26 ноября 2008

Я предполагаю, что вы сами создаете MSI-файл (?)

Когда вы используете Wix для создания MSI, клиент может просто восстановить все MSI после замены файла (WIX бесплатно). В противном случае можно использовать несжатый файл, который не встроен в MSI. В wix вы должны добавить медиа-элемент без атрибута cabinet. Недостатком является то, что вы должны распространять два файла, вместо одного MSI.

1 голос
/ 18 июня 2018

Проверьте следующий пост: Как заменить файл в установщике MSI?

Где упоминается:

Эта команда извлекает файлы MSI: msi2xml -c OutputDir TestMSI.MSI

Откройте OutputDir и измените файл.

Чтобы восстановить MSI, выполните: xml2msi.exe -m TestMSI.xml

Вам нужен ключ -m, чтобы игнорировать «проверку контрольной суммы MD5», которая не проходит при изменении файла (ов) MSI.

Загрузка: https://msi2xml.sourceforge.io/

1 голос
/ 26 ноября 2008

Вам необходимо добавить запись в таблицу Media , добавив еще один носитель без CAB-файла и LastSequence на единицу больше, чем последняя последовательность CAB-файла. Затем вам нужно заменить в таблице Файл последовательность файла новым файлом и обновить все остальные атрибуты файла, которые могли измениться.

...