Многие из наших клиентов имеют доступ к InstallShield, WISE или AdminStudio. Это не проблема. Я надеюсь, что есть способ предоставить нашим меньшим клиентам без доступа к коммерческим инструментам переупаковки свободно доступный набор инструментов и шагов для самостоятельной замены файлов.
Необходимо заменить только один файл конфигурации внутри сжатого MSI, можно предположить, что целевой пользователь уже установил Orca, знает, как использовать это для настройки таблицы свойств (для встраивания сведений о лицензии для развертывания GPO) и создал файл MST .
Отказ от ответственности: это очень похоже на Другой вопрос, но и вопросы, и ответы в этой ветке неясны.





Вам нужно добавить запись в таблицу Средства массовой информации, добавив еще один носитель без CAB-файла и LastSequence, на один больше, чем последняя последовательность CAB-файла. Затем вам нужно заменить в таблице Файл последовательность файла новым файлом и обновить все остальные атрибуты файла, которые могли измениться.
Я предполагаю, что вы сами создаете файл msi (?)
Когда вы используете Wix для создания своего msi-файла, клиент может просто регенерировать весь msi-файл после замены файла (wix бесплатен). В противном случае должна быть возможность использовать несжатый файл, который не встроен в msi. В wix вам нужно добавить медиа-элемент без атрибута кабинета. Недостатком является то, что вам придется распространять два файла вместо одного msi.
Хорошо, возвращаюсь к этому вопросу с моим собственным ответом, предлагающим небольшой приятный скрипт VB, который сделает всю тяжелую работу. Как упоминалось в исходном вопросе, целью было предоставить пользователям системного администратора простое решение для самостоятельного внесения обновлений / изменений.
Ниже представлена упрощенная версия кода, который я сейчас предоставляю клиентам.
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.
Можете ли вы объяснить: MY_CONFIG - это файл, который вы хотите заменить, а CAB_FILE - это медиафайл внутри MSI ... правильно?
IMHO такой сценарий указывает на отсутствие функции в устанавливаемом приложении, и его легче исправить в приложении, чем взломать MSI.
Позвольте мне сначала сказать, что простой способ «решить» эту проблему для ваших пользователей - это сказать им, чтобы они запустили административную установку вашего MSI. Это по существу извлечет все файлы из внутренних CAB и поместит все файлы в указанную папку:
msiexec.exe / myinstaller.msi TARGETDIR = C: \ AdminImage
Затем ваши пользователи могут перейти непосредственно в извлеченную структуру папок и обновить соответствующий файл, а затем сопоставить каталог с другим ПК и установить MSI. У этого могут быть побочные эффекты, связанные с файлом, имеющим хеш-значение в MSI (чтобы избежать спуфинга), но в большинстве случаев он работает нормально.
Новые версии инструментов развертывания, такие как Installshield и Wix, имеют встроенную поддержку для выполнения запросов XPath во время установки и, следовательно, динамического создания разделов.
Настройка приложения на ПК состоит из нескольких шагов. Во-первых, это развертывание контента на машине - это должно быть сделано с помощью MSI, без сомнения. Однако в большинстве продвинутых приложений требуется несколько «задач настройки после установки», подобных этому «обновлению файла конфигурации».
Почти всегда лучше отложить эти задачи настройки до запуск приложения, чем реализовывать функции в MSI. Для этого есть много причин, но самая важная из них заключается в том, что только EXE-файл приложения будет гарантированно запускаться в правильном пользовательском контексте. Файлы MSI можно запускать с системными правами, с другой учетной записью или с помощью другого механизма.
Обычно мы рекомендуем использовать MSI для получить весь необходимый контент на ПК. Затем пометьте реестр, чтобы указать приложению, что это первый запуск (для обновлений вы можете увеличить счетчик или записать номер новой версии в HKLM). Затем приложение может выполнить последние шаги настройки в своей программе запуска. Он может скопировать файл config.xml по умолчанию откуда-нибудь из% ProgramFiles% и скопировать его в профиль пользователя. Затем он может считывать требуемые значения из HKLM, записанные MSI, а затем обновлять файл config.xml этими значениями.
В общем: избегайте шагов настройки, выполняемых MSI или любым другим механизмом настройки. Сосредоточьтесь на записи требуемых файлов и элементов реестра на машину, а затем позвольте приложению настроить надлежащую среду выполнения. Это позволит намного лучше контролировать развертывание. Если хотите, лучше "Инкапсуляция". MSI отправляет «сообщение» приложению через реестр, и приложение знает, «как правильно настроить себя» на основе сообщений.
В моем случае я обновляю глобальную «конфигурацию по умолчанию» в папке AllUsers / AppData. Копирование в расположение для каждого пользователя происходит при первом запуске. Файл конфигурации представляет собой двоичные данные в проприетарном формате, это вообще не конфигурация после установки - он устанавливает значения по умолчанию, когда имеет место конфигурация первого запуска после установки (когда существует конфигурация пользователя, конфигурация системы по умолчанию игнорируется). Первоначально вопрос был задан, поскольку это простая операция перетаскивания в InstallShield, но мы перешли на WiX и должны были предоставить нашим клиентам простой способ сделать это.
Проверьте следующий пост: Как заменить файл в установщике msi?
Где упоминается:
Эта команда извлекает файлы MSI: msi2xml -c каталог вывода TestMSI.MSI
Откройте OutputDir и измените файл.
Чтобы восстановить MSI, запустите: xml2msi.exe -m TestMSI.xml
Вам нужна опция -m, чтобы игнорировать «тест контрольной суммы MD5», который не выполняется при изменении файла (ов) MSI.
Скачать: https://msi2xml.sourceforge.io/
Это не совсем работает, при добавлении носителя без CAB-файла я получаю «Ошибка 2920. Исходный каталог не указан для файла <filename>». Однако делает работает, если я использую CAB-файл. Предложения?