Самое простое решение для замены крошечного файла внутри MSI?

StackOverflow https://stackoverflow.com/questions/319894

Вопрос

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

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



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

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

Решение

Хорошо, возвращаюсь к этому вопросу с моим собственным ответом, предоставляющим симпатичный маленький 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

Обновить: В Маккаб.Маккаб.1 объект был амортизирован, код обновлен, чтобы теперь работать с Windows 7.

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

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

Когда вы используете Викс чтобы сгенерировать ваш msi, клиент может просто сгенерировать весь msi целиком после замены файла (wix предоставляется бесплатно).В противном случае должна быть возможность использовать несжатый файл, который не встроен в msi.В wix вы должны добавить элемент мультимедиа без атрибута кабинета.Недостатком является то, что вам приходится распространять два файла вместо одного msi.

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


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

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

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

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


Запустите XML-запрос XPath

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


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

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

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

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

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

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

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

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

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

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

Чтобы перестроить MSI, запустите:xml2msi.exe -м TestMSI.xml

Вам нужно, чтобы -m игнорировал 'тест контрольной суммы MD5', который завершается с ошибкой при изменении файлов MSIs.

Скачать:https://msi2xml.sourceforge.io/

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