Как изменить msi пакет
Перейти к содержимому

Как изменить msi пакет

Как изменить msi пакет

1) открываешь этот самый "мси" — если его собирал не ты (или если ты еще не разу не "сейвил" его при помощи МСИ Студио ) , то таблицы с путями к запакованным файлам (all tables/FilesSourcePath) в пакете еще нет

2) тогда жми "tools/exctract CABs- update source paths" -> все файлы заэкстрактятся по указанному тобой пути и в базе появится вышеуказанная таблица.

3) если все это прокатило — меняй файлы в том месте куда ты их распаковал и сохраняй мси. ( естесственно если будешь менять название и установочный путь к файлу — подправь в табличке)

4) если возникли проблемы — то глянь на Path Variables в IQ Views — если она указывает не туда — убей ее и повтори п2,3

5) если получаешь мессач что типа не все файлы были заэкстракчены — возможно они делаются "кастом экшеном" — и тут придется разбираться в каждом конкретном случае отдельно.

Вообще, по-простому, тебе наверно нужно просто удалить какие-то компоненты, вставить свои файлы и прописать к ним установочные пути тех которые ты грохнул.

Модификация дистрибутивов на основе Windows Installer

Возможность модификации дистрибутивов на основе Windows Installer всегда прельщала системных администраторов и специалистов системной поддержки. Рассмотрим один из компонентов Windows Installer Resource Kit – orca.exe. Эта утилита специально разработана для решения задач такого рода.

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

Уделим внимание программному управлению базой данных, хранящейся в msi-файлах.

Это сервис установки и конфигурирования программных продуктов, который входит в состав операционной системы. Также он может устанавливаться как пакет обновления или отдельный дистрибутив.

В настоящее время используется Windows Installer 4.5, который можно бесплатно загрузить с сайта Microsoft в виде заплатки (hotfix) KB842288 – http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/WindowsXP-KB942288-v3-x86.exe.

Windows Installer, как и любое другое быстрое исправление, поддерживает ряд ключей командной строки, обеспечивающих управление автоматической установкой пакета:

  • /norestart – не перезагружать компьютер после установки обновления;
  • /queit – выполнить установку в «тихом» режиме;
  • /help – вывод справки на экран, содержащей ключи и их краткое описание.

Двойным щелчком мыши по файлу с расширением *.msi осуществляется запуск утилиты:

%SystemRoot%System32msiexec.exe /i *.msi

В таблице 1 приведен список часто используемых параметров командной строки, обеспечивающих автоматическую установку приложения.

Таблица 1. Параметры командной строки msiexec.exe

Установка приложения в обычном режиме

Переустановка приложения. Если задан только ключ /f, то имеется в виду команда /fpecsm:

p – восстановление удаленных файлов;

о – обновление до более новой версии;

e – полная переустановка приложения той же версии;

d – восстановление удаленных файлов и перезапись файлов более старой версии;

c – восстановление удаленных файлов или перезапись файлов, если CRC
(контрольная сумма) установленных файлов не совпадает с CRC файлов в дистрибутиве;

а – переустановка всех файлов;

u – перезапись всех ключей реестра, касающихся данного приложения в ветвях HCKU, HCU;

m – перезапись всех ключей реестра, касающихся данного приложения в ветви HCLM;

s – перезапись всех ярлыков

Выполнение административной установки приложения

Управление публикацией программного продукта:

u – публикация для текущего пользователя;

m – публикация для всех пользователей;

g – идентификатор языка (управление установкой языкового интерфейса)

Определение уровня пользовательского интерфейса во время установки:

n – отсутствие интерфейса;

b – базовый интерфейс (по умолчанию);

r – сокращенный интерфейс;

f – полный пользовательский интерфейс

Обычно для установки приложения в автоматическом режиме используют команду:

%SystemRoot%System32msiexec.exe /fa /qn /jm *.msi

где *.msi – полный путь к файлу с расширением MSI, например:

c:Windowssystem32msiexec.exe /fa/qn/jm «acdsee10.msi»

Windows Installer SDK

Пакет утилит, который можно загрузить бесплатно с сайта компании Microsoft, по адресу – http://download.microsoft.com/download/7/c/4/7c426dfc-46e2-4ded-bab4-3b33600ad7d1/msi45sdk.msi, используется для различного рода манипуляций с MSI-файлами.

По умолчанию каталог установки пакета Windows Installer SDK –%ProgramFiles%Windows Installer 4.5 SDK.

В его комплекте несколько утилит, в том числе дистрибутив программы ORC, расположенный в папке Tools.

Программа orca.exe, дистрибутив которой находится в папке %ProgramFiles%Windows Installer 4.5 SDKTools, предназначена для модификации *.msi-файлов. С помощью этой утилиты можно не только управлять устанавливаемыми компонентами, но и указать серийный номер продукта, изменить выводимые сообщения и др.

Установка orca.exe осуществляется в папку %:ProgramFiles%Orca запуском файла orca.msi.

Запуск программы осуществляется через «Пуск > Программы > orca.exe» (см. рис. 1). После успешного запуска приложения необходимо открыть msi-файл, который необходимо модифицировать. В данном случае в качестве опытного образца использовать дистрибутив AcdSee10 – файл ACDSee 10 Photo Manager.msi, находящийся в каталоге c:ACDSee.

Рисунок 1. Внешний вид утилиты orca.exe

Замечание: дистрибутив ACDSee 10 представляет собой *.ехе-файл – архив, который при запуске распаковывает msi-файл в папке C:Documents and Settings\%username%Local SettingsApplication DataDownloaded Installations<0051E50E-CECD-4E04-A71A-B8C49733542A>ACDSee 10 Photo Manager.msi. Именно этот файл необходимо открыть утилитой orca.exe.

Orca.exe рассматривает msi-файл как SQL-базу данных, где msi-файл – это база данных, левая колонка таблицы (см. рис. 2), в которой хранятся различные настройки и списки. Правая часть – список полей выбранной таблицы с соответствующими значениями.

Рисунок 2. Создание новых полей в таблице

В базе данных пакета среди множества таблиц, которые можно объединить в группы, выделим самые важные из них:

  • базовые таблицы;
  • файловые таблицы;
  • таблицы информации о программе.

К базовым таблицам относят таблицы, описывающие параметры работы инсталлятора, устанавливаемые компоненты. Группа состоит из 11 связанных таблиц, краткое описание которых приведено в таблице 2.

Таблица 2. Базовые таблицы MSI Installer

Содержит список всех функций программного продукта

Содержит описание условий, определяющих порядок установки каждой функции, описанной в таблице

Связывает функции с компонентами

Содержит список всех компонентов приложения

Содержит список всех каталогов, необходимых для инсталляции

Содержит список функций и компонентов, публикуемых для использования в других приложениях

Задает установки для сборок .NET Framework CLR и Win32

Задает схему для именования сборок .NET Framework CLR и Win32

Содержит информацию, необходимую для установки приложений COM+

Связывает компонент, заданный в столбце Component_Application (обычно .exe), с компонентом, заданным в столбце Component_Shared (обычно .dll)

Содержит информацию для значительных обновлений программного продукта

Эта группа таблиц содержит информацию обо всех файлах, входящих в комплект поставки программного продукта. Большая часть этих файлов перечислена в таблице File. Хотя таблица Directory не входит в эту группу, она тесно связана с ней, так как отражает структуру каталогов приложения. В таблице 3 приведен список файловых таблиц и их краткое описание.

Таблица 3. Файловые таблицы MSI Installer

Представляет собой список файлов, которые будут распакованы в ходе инсталляции. Эта таблица связана с таблицей Directory, в которой зафиксирована структура каталогов устанавливаемого приложения и таблица Component, с помощью которой обеспечивается связь с компонентами

Содержит список файлов, которые необходимо удалить при выполнении операции RemoveFiles

Включает в себя список шрифтов, которые необходимо зарегистрировать в операционной системе

Содержит список саморегистрирующихся модулей. Installer не регистрирует EXE-файлы

В таблице описывается набор дисков инсталляции

Содержит информацию о привязках исполняемых файлов или DLL

Содержит список файлов, которые необходимо перенести во время инсталляции из исходного каталога в заданный каталог

Содержит список дублируемых файлов либо в другой каталог с тем же именем, что и исходный файл, либо в тот же каталог, но с другим именем

Используется для задания переменных окружения

Хранит файлы иконок. Каждая иконка этой таблицы во время инсталляции копируется в отдельный файл на диске

Эта таблица хранит 128-разрядное хэш-значение для исходных файлов в пакете инсталляции

Таблицы информации о программе

Таблицы этой группы содержат важную информацию о пакете инсталляции, используемую на протяжении всего процесса инсталляции. В таблице 4 приведена информация о назначении таблиц.

Таблица 4. Файловые таблицы программы

Хранятся все свойства пакета инсталляции

Содержатся двоичные данные для иконок, растров и т. п. Также здесь хранятся данные для пользовательских операций

Используется для поиска шаблонов форматирования при обработке ошибок. Installer имеет свой собственный механизм обработки ошибок

Здесь хранится вся информация, необходимая для создания файловых ярлыков

Эта таблица содержит информацию о необходимом дисковом пространстве для каждого компонента приложения

Доступ к msi-файлам программным способом

Для обеспечения программного управления базой данных, хранящейся в msi-файле, используется шаблон, приведенный в листинге 1. Необходимо отметить, что шаблон чтения данных отличается от шаблона коррекции данных. О нем будет рассказано отдельно.

Листинг 1. Шаблон доступа к базе в msi-файле

Set obj = CreateObject («WindowsInstaller.Installer»)

Set base = obj.OpenDatabase (MSI,Mode)

В приведенном шаблоне в первой строке осуществляется подключение к COM-объекту, с помощью которого осуществляется доступ к базе данных.

На следующей строке осуществляется подключение к базе данных с помощью метода OpenDatabase, который имеет два аргумента. Первый из них – имя базы, которым является полный путь к msi-файлу. Второй – режим доступа к базе данных:

  • 0 – только чтение;
  • 1 – чтение / запись.

На третьей – реализовано выполнение задаваемого запроса. SQL-запрос задается с помощью метода OpenView, а выполнение запроса – с помощью метода Execute.

Напомним, что в SQL-запросе регистр названия полей и имен таблиц имеет значение.

В последней строке осуществляется запись сделанных изменений в базе с помощью команды Commit.

Работа с таблицами в orca.exe

Рассмотрим подробнее структуру таблиц, содержащихся в msi-файле. Orca – мини-редактор SQL-таблиц, хранящихся как составная часть дистрибутива.

С полями таблиц баз можно совершать следующие действия:

  • чтение существующих полей;
  • создавать новые поля;
  • удалять поля;
  • изменять поля.

Чтение существующих полей

Для реализации шаблона поиска используется шаблон (см. листинг 2), отличный от приведенного в листинге 1. Это объясняется тем, что запись, удаление, замена осуществляются у единичного поля, а вывод на экран осуществляется для всех полей.

Трансформация листинга осуществляется в третьей строке листинга 1. Она разбивается на две подстроки – это строки 3 и 4 в листинге 2. Здесь разносятся методы OpenView и Execute.

Далее осуществляется чтение массива строк. Обратите внимание на то, что в запросе SELECT поля могут быть перечислены только по именам. Значение «*» в данном случае не работает. А во время чтения данных необходимо указывать нумерацию полей (Record.StringData(1)), начиная с единицы (1).

В листинге 2 приведен пример чтения всех полей (Property, Value) таблицы Property файла ACDSee 10 Photo Manager.msi:

Листинг 2. Чтение полей в указанной таблице

Set obj = CreateObject(«WindowsInstaller.Installer»)

Set ob = obj.OpenDatabase («C:ACDSeeACDSee 10 Photo Manager.msi»,0)

set View=ob.OpenView(«SELECT Property, Value FROM Property»)

Set Record = View.Fetch

If Record Is Nothing Then Exit Do

Wscript.Echo Record.StringData(1) + vbTab+vbTab+Record.StringData(2)

Set View = Nothing

Создание новых полей

Создание новых полей используется достаточно часто, например, для того чтобы записать в дистрибутив программы ее серийный номер. Для этого необходимо добавить в таблицу Property поле PIDKEY с соответствующим значением, содержащим серийным номер продукта. Чтобы добавить новое поле, необходимо установить курсор на нужную таблицу (см. рис. 3) и, нажав в произвольной ее части правую кнопку мыши, выбрать пункт Add Row или нажать комбинацию клавиш . В появившемся диалоговом окне будет приведен список доступных полей. Необходимые значения можно присвоить в этом же окне.

Рисунок 3. Изменение параметра

Аналогичную операцию можно выполнить программным способом (см. листинг 3). Для этого необходимо вызвать объект WindowsInstaller.Installer. На основе шаблона, приведенного в листинге 1, сформируем листинг 3. В качестве второго параметра метода OpenDatabase необходимо указать 1, поскольку выполняется операция записи данных.

Самым сложным в данном листинге правильно сформировать запрос. Особенность запроса INSERT INFO заключается в том, что в первых по счету скобках, в которых указывается название полей, имя поля должно быть задано с родителем. Все имена параметров в запросе указываются без кавычек; все присваиваемые значения – в кавычках и, наконец, названия полей и таблиц чувствительны к регистру.

Листинг 3. Создание нового атрибута в таблице

Set a = CreateObject(«WindowsInstaller.Installer»)

Set b = a.OpenDatabase («C:acdseeACDSee 10 Photo Manager.msi»,1)

b.OpenView(«INSERT INTO Property ?

(Property.Property, Property.Value) VALUES («PIDKEY», «1234567890»)»).Execute

Удаление существующих полей из таблицы

Удаление какого-либо поля осуществляется в соответствии со следующим алгоритмом:

  • установить курсор на таблицу, в которой необходимо удалить параметр;
  • установить курсор на удаляемый параметр в таблице;
  • нажать кнопку на клавиатуре или правую кнопку мыши, а в контекстном меню – DELETE;
  • подтвердить намерение удалить параметр.

Эту же задачу можно решить программным способом (см. листинг 4), используя шаблон 1. Для обеспечения возможности записи в таблице необходимо установить второй параметр метода OpenDatabase равным единице (1).

Листинг 4. Удаление существующего атрибута в таблице

Set a = CreateObject(«WindowsInstaller.Installer»)

Set b = a.OpenDatabase («C:acdseeACDSee 10 Photo Manager.msi»,1)

b.OpenView(«DELETE FROM Property WHERE «PIDKEY»=»1234567890″)»).Execute

Изменение значений существующих полей

Изменение значения осуществляется путем установки курсора в необходимую ячейку двойным щелчком левой кнопки мыши (см. рис. 3).

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

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

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

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

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

5 ответов

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

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

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

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

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

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

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

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *