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

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

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



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

Ответ 1

Хорошо, пересматривая этот вопрос своим собственным ответом, предоставляя приятный маленький VB script, который сделает все тяжелый подъем. Как уже упоминалось в первоначальном вопросе, целью было предоставление простого решения для пользователей 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

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

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

Ответ 3

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


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

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

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 отправляет "сообщение" в приложение через реестр, и приложение знает "как правильно настроить себя" на основе сообщений.

Ответ 4

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