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

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

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



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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
0
17 805
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Это не совсем работает, при добавлении носителя без CAB-файла я получаю «Ошибка 2920. Исходный каталог не указан для файла <filename>». Однако делает работает, если я использую CAB-файл. Предложения?

saschabeaumont 27.11.2008 09:31

Я предполагаю, что вы сами создаете файл 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 ... правильно?

PawanS 01.05.2013 14:41

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


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

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

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

В моем случае я обновляю глобальную «конфигурацию по умолчанию» в папке AllUsers / AppData. Копирование в расположение для каждого пользователя происходит при первом запуске. Файл конфигурации представляет собой двоичные данные в проприетарном формате, это вообще не конфигурация после установки - он устанавливает значения по умолчанию, когда имеет место конфигурация первого запуска после установки (когда существует конфигурация пользователя, конфигурация системы по умолчанию игнорируется). Первоначально вопрос был задан, поскольку это простая операция перетаскивания в InstallShield, но мы перешли на WiX и должны были предоставить нашим клиентам простой способ сделать это.

saschabeaumont 29.06.2009 03:33

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

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

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

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

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

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

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

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