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

Как изменить msi пакет 1) открываешь этот самый "мси" - если его собирал не ты (или если ты еще не разу не "сейвил" его при помощи МСИ

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 InstallationsACDSee 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 последовательность файла с новым файлом и обновить все остальные атрибуты файла, которые могли измениться.

Рубрика:

Администрирование / 
Продукты и решения

Facebook

Twitter

Мой мир

Вконтакте

Одноклассники

Google+

ИВАН КОРОБКО

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

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

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

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

Windows Installer

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

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

Файл msiexec.exe

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

%SystemRoot%System32msiexec.exe /i *.msi

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

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

Параметр

Описание

/i

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

/f [p|o|e|d|c|a|u|m|s|v]

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

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

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

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

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

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

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

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

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

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

/a

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

/x

Деинсталляция продукта

/j[u|m[/g]]

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

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

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

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

/q[n|b|r|f]

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

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.

Оrca.msi

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

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

Оrca.exe

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

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

Рисунок 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. Создание новых полей в таблице

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

Структура msi-файлов

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

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

Базовые таблицы

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

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

Имя таблицы

Краткое описание

Feature

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

Condition

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

FeatureComponents

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

Component

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

Directory

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

PublishComponent

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

Assembly

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

AssemblyName

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

Complus

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

IsolatedComponent

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

Upgrade

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

Файловые таблицы

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

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

Имя таблицы

Краткое описание

File

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

RemoveFile

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

Font

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

SelfReg

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

Media

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

BindImage

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

MoveFile

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

DuplicateFile

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

Environment

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

Icon

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

MsiFileHash

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

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

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

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

Имя таблицы

Краткое описание

Property

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

Binary

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

Error

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

Shortcut

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

ReserveCost

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

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

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

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

Set obj = CreateObject («WindowsInstaller.Installer»)

Set base = obj.OpenDatabase (MSI,Mode)

base.OpenView(SQL-query).Execute

base.Commit

В приведенном шаблоне в первой строке осуществляется подключение к 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»)

View.Execute

Do

    Set Record = View.Fetch

           If Record Is Nothing Then Exit Do

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

    Loop

Set View = Nothing

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

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

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

Рисунок 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

b.Commit

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

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

  • установить курсор на таблицу, в которой необходимо удалить параметр;
  • установить курсор на удаляемый параметр в таблице;
  • нажать кнопку на клавиатуре или правую кнопку мыши, а в контекстном меню – 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

b.Commit

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

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

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

В листинге 5 осуществляется отключение компонента Device Detector.

Листинг 5. Изменение значений существующих полей таблицы

Set a = CreateObject(«WindowsInstaller.Installer»)

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

b.OpenView(«UPDATE Feature SET Level=»0″ WHERE Feature=»DevDetect»»).Execute

b.Commit

Заключение

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

Facebook

Twitter

Мой мир

Вконтакте

Одноклассники

Google+

  • Download HTML Article — 335 Kb

Introduction

This article is in the form of a compiled HTML help file. It describes some of the basic architecture of the MSI package created using the Visual Studio .NET Setup Project.

We’ll look at how elements defined in the NET IDE are translated into an actual MSI setup. And we’ll perform a simple exercise in customization of the MSI using the MSI editor tool Orca.

Developers occasionally ask how to create an Uninstall shortcut in their application setups. We’ll use this customization as our example.

Having said that, let me state something for the record:

I am already well aware that this is contrary to Microsoft Logo Certification which states that applications should only be removed from the Control Panel. But consider the following:

Most developers never get their setups Logo Certified. In fact, most installs for Microsoft products themselves do not come even close to Logo Certifiable. (For that matter, Microsoft changes their «Best Practices Guidelines» like women change their shoes).

And as far as creating uninstall menu entries being against recommended best practices, as preached by Microsoft, look at what Microsoft practices: I just downloaded (on 04/05/2005) the latest MS SDK Platform Update. It creates an uninstall entry on the program menu! I also downloaded the Microsoft AntiSpyware Package. It creates an uninstall entry on the program menu. The MSDE setup? It creates an uninstall entry on the program menu. That’s just for starters.

Uninstall menu entries are more user friendly than having to go to the Control Panel. They are nice to have particularly if you are creating a package, for example, that allows a 30 day trial.

If people want to add an uninstall entry, obviously Microsoft does not see anything wrong with it, and I see nothing wrong with it either.

And even if you are a die-hard adherent to MS Best Practices, you can use the same techniques to create other useful custom shortcuts. For example, an application that uses MSDE or SQL Server might want to include it’s own menu entry to launch the Service Manager. This is a lot more user friendly than having to explain to a user that, they have to navigate to a different menu entry in case they need to manually start the SQL Server for some reason.

More importantly, we’ll also take the first steps towards learning some basics about how Windows Installer packages are put together, and how to edit them etc. etc.

Since this is not a conventional programming tutorial, there is no source code. Just download the zip and open the help file. There are very detailed steps, descriptions, and images throughout. You’ll need to have any version of VS.NET installed. If you use Visual Studio 6 with the VSI add-in that creates MSI’s instead of using the Package and Deployment Wizard that will work just fine too, but you may have to add a few steps — look at the article on creating menu entries with VSI add-in on my website (the link is in the download).

You’ll find links to the Orca and other SDK tools, you’ll need in the help file.

  • Download HTML Article — 335 Kb

Introduction

This article is in the form of a compiled HTML help file. It describes some of the basic architecture of the MSI package created using the Visual Studio .NET Setup Project.

We’ll look at how elements defined in the NET IDE are translated into an actual MSI setup. And we’ll perform a simple exercise in customization of the MSI using the MSI editor tool Orca.

Developers occasionally ask how to create an Uninstall shortcut in their application setups. We’ll use this customization as our example.

Having said that, let me state something for the record:

I am already well aware that this is contrary to Microsoft Logo Certification which states that applications should only be removed from the Control Panel. But consider the following:

Most developers never get their setups Logo Certified. In fact, most installs for Microsoft products themselves do not come even close to Logo Certifiable. (For that matter, Microsoft changes their «Best Practices Guidelines» like women change their shoes).

And as far as creating uninstall menu entries being against recommended best practices, as preached by Microsoft, look at what Microsoft practices: I just downloaded (on 04/05/2005) the latest MS SDK Platform Update. It creates an uninstall entry on the program menu! I also downloaded the Microsoft AntiSpyware Package. It creates an uninstall entry on the program menu. The MSDE setup? It creates an uninstall entry on the program menu. That’s just for starters.

Uninstall menu entries are more user friendly than having to go to the Control Panel. They are nice to have particularly if you are creating a package, for example, that allows a 30 day trial.

If people want to add an uninstall entry, obviously Microsoft does not see anything wrong with it, and I see nothing wrong with it either.

And even if you are a die-hard adherent to MS Best Practices, you can use the same techniques to create other useful custom shortcuts. For example, an application that uses MSDE or SQL Server might want to include it’s own menu entry to launch the Service Manager. This is a lot more user friendly than having to explain to a user that, they have to navigate to a different menu entry in case they need to manually start the SQL Server for some reason.

More importantly, we’ll also take the first steps towards learning some basics about how Windows Installer packages are put together, and how to edit them etc. etc.

Since this is not a conventional programming tutorial, there is no source code. Just download the zip and open the help file. There are very detailed steps, descriptions, and images throughout. You’ll need to have any version of VS.NET installed. If you use Visual Studio 6 with the VSI add-in that creates MSI’s instead of using the Package and Deployment Wizard that will work just fine too, but you may have to add a few steps — look at the article on creating menu entries with VSI add-in on my website (the link is in the download).

You’ll find links to the Orca and other SDK tools, you’ll need in the help file.


#MSI

#MST

What’s the most efficient way to perform quick edits to an MSI package?

There are various tools that can help you edit an MSI package, but ORCA is the most popular free MSI editor available to achieve this, since it can help to validate and debug errors.

However, it is not a secret that ORCA is a bit challenging to use since you have to perform modifications to the MSI database.

But, we do have a solution for that! Advanced Installer allows you to edit MSI files within its GUI without making any changes in the background.

We will show you how you can use Advanced Installer to edit MSI files as an alternative or complement to the ORCA tool.

But first, let’s see how we can edit the three most common MSI package edit operations using ORCA.

  1. Modify registry keys,
  2. Add files,
  3. Change property values.

Without further ado, let’s download ORCA to get started.

How to download and install Orca — the free MSI Editor

In the past, Orca used to be available as standalone software but these days, you can only install it as a component of Microsoft Windows SDK. To download and install ORCA, follow these steps:

1. Download Microsoft Windows SDK here.

Download SDK

2. Open the installation, go through the basic wizard, and select the MSI TOOL feature when prompted.

Install SDK

3. Go to the SDK install location and run the Orca.msi. This will automatically install ORCA.

Install ORCA

4. A start-up shortcut should be created – and Orca will be located in C:Program Files (X86)Orca

Locating ORCA

How to Edit Your MSI Package using Orca?

Now that you have Orca installed, you can navigate to the location where your MSI package is stored, right-click on it and select Edit with Orca.

Edit with Orca

This will load your MSI database package into the Orca interface.

Before you start making changes, you should be aware that directly editing vendor MSI packages is NOT recommended.

As a best practice, we suggest using a transform file to save and apply any modifications you make to the MSI when the installation is triggered.

To do that with ORCA, click on Transform/New Transform.

New Transform

We’re all set – now, we can move on to performing the three most common modifications on an MSI.

1. Change a property value with ORCA

For this example, we want to change the value of the property DISPLAYLANGUAGE which controls the application interface display language.

From the left pane:

1. Navigate to the Property Table.

2. Locate the DISPLAYLANGUAGE property.

3. Double click on the value.

4. Replace it with the value NL.

Orca Edit Property

2. Add registry key with ORCA

For this example, we want to add a registry key that disables the auto-update function of our application.

Let’s assume that the registry key is CheckForUpdate and the value is False. It should be present in the HKLM hive under the following path Software[Manufacturer][ProductName]Settings

To achieve this, navigate to the Registry table, right-click inside the table and choose “Add Row”.

Orca Edit Registry

Fill in each row with the corresponding value (as seen below):

  • Registry: the identification name of our registry
  • Root: the hive (-1) corresponding to HKLM
  • Key: the registry key itself
  • Name: the name of the registry
  • Value: the name’s value that we want it to have
  • Component: to which component we want our registry to belong (components can be displayed under the Component table).
Add Component Value

3. Add a file with ORCA

For this example, we want to add a file containing additional application settings named settings.config.

To do this, you need to edit the following tables:

  • Component;
  • FeatureComponents;
  • File, Media;
  • And if the table is already present, MSIFileHas.

3.1. Component Table

Go to the Component table and add a new row. Complete the information accordingly.

Component: The identification name of the component. Must be unique

ComponentID: For this, use https://www.guidgenerator.com/ to generate a GUID

Directory_: The Directory name where the file will be located

Attributes: Enter 0. For more information, check MSI Documentation

Add New Row in Component Table

3.2. Feature Component Table

Go to the FeatureComponent table and add a new row. It’s time to link the created component to a feature.

Linking Created Component to Feature

3.3. File Table

Go to the File table and add a new row. It’s time to associate the file to the recently created component. Complete the information accordingly.

  • File: File name (Settings.config)
  • Component_: The component created on the previous step (ConfigFile)
  • FileName: Enter both short and long filename separate by the vertical bar char (|) Short filename can be found by opening a cmd, navigating to the folder containing the file, and typing the dir /x command
  • FileSize: The file size in bytes. You can right-click on the file and type property
  • Version: Only if needed
  • Language: Only if needed
  • Attributes: 8192 for uncompressed file. For more information, check MSI Documentation
  • Sequence: Should have the value of the current biggest sequence number in table +1.
Associate File to Created Component

How to Edit Your MSI Package using Advanced Installer?

Let’s see how we can perform quick-edits from Advanced Installer’s user interface – extremely easy and intuitive.

NoteIf you are familiar with the Advanced Installer tool I would suggest you check the predefined support for editing an MSI file using our dedicated dialog: MSI Quick-Edit Mode.

Similar to Orca, to edit your MSI package, right-click it and select “Open with Advanced Installer”.

Edit MSI with Advanced Installer

Once the MSI database has loaded in Advanced Installer, you will notice a left menu pane where you will find all the options you need to directly edit your MSI.

The changes you perform in the GUI will be automatically reflected in all the related tables from the MSI. This will save you time from manually editing each MSI table and decrease the chance of human error.

1. Change an MSI property value with Advanced Installer

1.1 From the left pane, navigate to the Property tab,

1.2. Find the property you want to modify and double click on it to edit its value.

Edit Property in Advanced Installer

2. Add registry key to your MSI

2.1 From the left pane, navigate to the Registry tab,

2.2 Right-click on the registry path,and choose New Value,

Add Registry Key in Advanced Installer

2.3. Fill in the Name and the Data field with the corresponding value.

Edit Registry Entry

3. Add a file to your MSI package

When you directly modify an MSI with Advanced Installer, Advanced Installer will update the MSI during the build operation following best practices and rules such as “Short-names in the File Table”, “Separating components for each EXE, DLL, and OCX file”, “Setting the key path for each component”.

Advanced Installer generates builds in accordance with ICE Validation Standard and industry best practices gathered in over 15 years of constant contact with our customers.If you are eager to test it for yourself, try our 30-day full feature trial.

When you add any files into the MSI by using a transform file and saving it, a cabinet file will be created alongside the MST. This is NOT an Advanced Installer custom implementation, but a default behavior of MSI databases.

Conclusion

Now you know two ways to edit your MSI packages.

Both Orca and Advanced Installer are perfectly capable of editing an MSI.

However, as you can see, editing your MSI directly through the Advanced Installer GUI saves time and prevents you from having to completely repackage your MSI — which is especially important when making quick edits to your MSI package.

We hope you try this method and let us know what you think.

If you want to see how the MSI Editor works, give it a try through the Advanced Installer 30-day full-featured free trial.

Subscribe to Our Newsletter

Sign up for free and be the first to receive the latest news, videos, exclusive How-Tos, and guides from Advanced Installer.

Popular Articles

This code has only been tested on 1 file, where the name is excactly the same as the file being replaced..

but it should implement Christopher Painters answer in C#, with DTF (from WIX)

/**
 * this is a bastard class, as it is not really a part of building an installer package, 
 * however, we need to be able to modify a prebuild package, and add user specific files, post build, to save memory on server, and have a fast execution time.
 * 
 * author Henrik Dalsager
 */

//I'm using everything...
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Text.RegularExpressions;
using Microsoft.Deployment.Compression.Cab;
using Microsoft.Deployment.WindowsInstaller;
using Microsoft.Deployment.WindowsInstaller.Package;

namespace MSIFileManipulator
{
/**
 * brief updates an existing MSI, I.E. add new files
 * 
 */
class updateMSI
{
    //everything revolves around this package..
    InstallPackage pkg = null;

    //the destruction should close connection with the database, just in case we forgot..
    ~updateMSI()
    {
        if (pkg != null)
        {
            try
            {
                pkg.Close();
            }
            catch (Exception ex)
            {
                //rollback?

                //do nothing.. we just don't want to break anything if database was already closed, but not dereffered.
            }
        }
    }

    /**
     * brief compresses a list of files, in a workdir, to a cabinet file, in the same workdir.
     * param workdir path to the workdir
     * param filesToArchive a list of filenames, of the files to include in the cabinet file.
     * return filename of the created cab file
     */
    public string createCabinetFileForMSI(string workdir, List<string> filesToArchive)
    {
        //create temporary cabinet file at this path:
        string GUID = Guid.NewGuid().ToString();
        string cabFile = GUID + ".cab";
        string cabFilePath = Path.Combine(workdir, cabFile);

        //create a instance of Microsoft.Deployment.Compression.Cab.CabInfo
        //which provides file-based operations on the cabinet file
        CabInfo cab = new CabInfo(cabFilePath);

        //create a list with files and add them to a cab file
        //now an argument, but previously this was used as test:
        //List<string> filesToArchive = new List<string>() { @"C:file1", @"C:file2" };
        cab.PackFiles(workdir, filesToArchive, filesToArchive);

        //we will ned the path for this file, when adding it to an msi..
        return cabFile;
    }

    /**
     * brief embeds a cabinet file into an MSI into the "stream" table, and adds it as a new media in the media table
     *  This does not install the files on a clients computer, if he runs the installer,
     *  as none of the files in the cabinet, is defined in the MSI File Table (that informs msiexec where to place mentioned files.)
     *  It simply allows cabinet files to piggypack within a package, so that they may be extracted again at clients computer.
     *  
     * param pathToCabFile full absolute path to the cabinet file
     * return media number of the new cabinet file wihtin the MSI
     */
    public int insertCabFileAsNewMediaInMSI(string cabFilePath, int numberOfFilesInCabinet = -1)
    {
        if (pkg == null)
        {
            throw new Exception("Cannot insert cabinet file into non-existing MSI package. Please Supply a path to the MSI package");
        }

        int numberOfFilesToAdd = numberOfFilesInCabinet;
        if (numberOfFilesInCabinet < 0)
        {
            CabInfo cab = new CabInfo(cabFilePath);
            numberOfFilesToAdd = cab.GetFiles().Count;
        }

        //create a cab file record as a stream (embeddable into an MSI)
        Record cabRec = new Record(1);
        cabRec.SetStream(1, cabFilePath);

        /*The Media table describes the set of disks that make up the source media for the installation.
          we want to add one, after all the others
          DiskId - Determines the sort order for the table. This number must be equal to or greater than 1,
          for out new cab file, it must be > than the existing ones...
        */
        //the baby SQL service in the MSI does not support "ORDER BY `` DESC" but does support order by..
        IList<int> mediaIDs = pkg.ExecuteIntegerQuery("SELECT `DiskId` FROM `Media` ORDER BY `DiskId`");
        int lastIndex = mediaIDs.Count - 1;
        int DiskId = mediaIDs.ElementAt(lastIndex) + 1;

        //wix name conventions of embedded cab files is "#cab" + DiskId + ".cab"
        string mediaCabinet = "cab" + DiskId.ToString() + ".cab";

        //The _Streams table lists embedded OLE data streams.
        //This is a temporary table, created only when referenced by a SQL statement.
        string query = "INSERT INTO `_Streams` (`Name`, `Data`) VALUES ('" + mediaCabinet + "', ?)";
        pkg.Execute(query, cabRec);
        Console.WriteLine(query);

        /*LastSequence - File sequence number for the last file for this new media.
          The numbers in the LastSequence column specify which of the files in the File table
          are found on a particular source disk.

          Each source disk contains all files with sequence numbers (as shown in the Sequence column of the File table)
          less than or equal to the value in the LastSequence column, and greater than the LastSequence value of the previous disk
          (or greater than 0, for the first entry in the Media table).
          This number must be non-negative; the maximum limit is 32767 files.
          /MSDN
         */
        IList<int> sequences = pkg.ExecuteIntegerQuery("SELECT `LastSequence` FROM `Media` ORDER BY `LastSequence`");
        lastIndex = sequences.Count - 1;
        int LastSequence = sequences.ElementAt(lastIndex) + numberOfFilesToAdd;

        query = "INSERT INTO `Media` (`DiskId`, `LastSequence`, `Cabinet`) VALUES (" + DiskId.ToString() + "," + LastSequence.ToString() + ",'#" + mediaCabinet + "')";
        Console.WriteLine(query);
        pkg.Execute(query);

        return DiskId;

    }

    /**
     * brief embeds a cabinet file into an MSI into the "stream" table, and adds it as a new media in the media table
     *  This does not install the files on a clients computer, if he runs the installer,
     *  as none of the files in the cabinet, is defined in the MSI File Table (that informs msiexec where to place mentioned files.)
     *  It simply allows cabinet files to piggypack within a package, so that they may be extracted again at clients computer.
     *  
     * param pathToCabFile full absolute path to the cabinet file
     * param pathToMSIFile full absolute path to the msi file
     * return media number of the new cabinet file wihtin the MSI
     */
    public int insertCabFileAsNewMediaInMSI(string cabFilePath, string pathToMSIFile, int numberOfFilesInCabinet = -1)
    {
        //open the MSI package for editing
        pkg = new InstallPackage(pathToMSIFile, DatabaseOpenMode.Direct); //have also tried direct, while database was corrupted when writing.
        return insertCabFileAsNewMediaInMSI(cabFilePath, numberOfFilesInCabinet);
    }

    /**
     * brief overloaded method, that embeds a cabinet file into an MSI into the "stream" table, and adds it as a new media in the media table
     *  This does not install the files on a clients computer, if he runs the installer,
     *  as none of the files in the cabinet, is defined in the MSI File Table (that informs msiexec where to place mentioned files.)
     *  It simply allows cabinet files to piggypack within a package, so that they may be extracted again at clients computer.
     *
     * param workdir absolute path to the cabinet files location
     * param cabFile is the filename of the cabinet file
     * param pathToMSIFile full absolute path to the msi file
     * return media number of the new cabinet file wihtin the MSI
     */
    public int insertCabFileAsNewMediaInMSI(string workdir, string cabFile, string pathToMSIFile, int numberOfFilesInCabinet = -1)
    {
        string absPathToCabFile = Path.Combine(workdir, cabFile);
        string absPathToMSIFile = Path.Combine(workdir, pathToMSIFile);
        return insertCabFileAsNewMediaInMSI(absPathToCabFile, absPathToMSIFile, numberOfFilesInCabinet);
    }

    /**
     * brief reconfigures the MSI, so that a file pointer is "replaced" by a file pointer to another cabinets version of said file...
     * The original file will not be removed from the MSI, but simply orphaned (no component refers to it). It will not be installed, but will remain in the package.
     * 
     * param OriginalFileName (this is the files target name at the clients computer after installation. It is our only way to locate the file in the file table. If two or more files have the same target name, we cannot reorient the pointer to that file!)
     * param FileNameInCabinet (In case you did not have the excact same filename for the new file, as the original file, you can specify the name of the file, as it is known in the cabinet, here.)
     * param DiskIdOfCabinetFile - Very important information. This is the Id of the new cabinet file, it is the only way to know where the new source data is within the MSI cabinet stream. This function extracts the data it needs from there, like sequence numbers
     */
    public void PointAPreviouslyConfiguredComponentsFileToBeFetchedFromAnotherCabinet(string OriginalFileName, string FileNameInCabinet, string newFileSizeInBytes, int DiskIdOfCabinetFile)
    {
        //retrieve the range of sequence numbers for this cabinet file. 
        string query = "SELECT `DiskId` FROM `Media` ORDER BY `LastSequence`";
        Console.WriteLine(query);
        IList<int> medias = pkg.ExecuteIntegerQuery("SELECT `DiskId` FROM `Media` ORDER BY `LastSequence`");

        query = "SELECT `LastSequence` FROM `Media` ORDER BY `LastSequence`";
        Console.WriteLine(query); 
        IList<int> mediaLastSequences = pkg.ExecuteIntegerQuery("SELECT `LastSequence` FROM `Media` ORDER BY `LastSequence`");

        if(medias.Count != mediaLastSequences.Count)
        {
            throw new Exception("there is something wrong with the Media Table, There is a different number of DiskId and LastSequence rows");
        }

        if(medias.Count <= 0)
        {
            throw new Exception("there is something wrong with the Media Table, There are no rows with medias available..");
        }

        int FirstSequence = -1;
        int LastSequence = -1;
        int lastIndex = medias.Count - 1;

        for (int index = lastIndex; index >= 0; index--)
        {
            int rowLastSequence = mediaLastSequences.ElementAt(index);
            int rowDiskId = medias.ElementAt(index);

            if (rowDiskId == DiskIdOfCabinetFile)
            {
                LastSequence = rowLastSequence;
                if (index < lastIndex)
                {
                    //the next cabinet files last sequence number + 1,  is this ones first..
                    FirstSequence = mediaLastSequences.ElementAt(index + 1) + 1;
                    break;
                }
                else
                {
                    //all files from the first, to this last sequence number, are found in this cabinet
                    FirstSequence = mediaLastSequences.ElementAt(lastIndex);
                    break;
                }
            }
        }

        //now we will look in the file table to get a vacant sequence number in the new cabinet (if available - first run will return empty, and thus default to FirstSequence)
        int Sequence = FirstSequence;
        query = "SELECT `Sequence` FROM `File` WHERE `Sequence` >= " + FirstSequence.ToString() + " AND `Sequence` <= " + LastSequence.ToString() + " ORDER BY `Sequence`";
        Console.WriteLine(query);

        IList<int> SequencesInRange = pkg.ExecuteIntegerQuery(query);
        for (int index = 0; index < SequencesInRange.Count; index++)
        {
            if (FirstSequence + index != SequencesInRange.ElementAt(index))
            {
                Sequence = FirstSequence + index;
                break;
            }
        }

        //now we set this in the file table, to re-point this file to the new media..
        //File.FileName = FileNameInCabinet;
        //File.FileSize = newFileSizeInBytes;
        //File.Sequence = sequence;
        query = "UPDATE `File` SET `File`.`FileName`='" + FileNameInCabinet + "' WHERE `File`='" + OriginalFileName + "'";
        Console.WriteLine(query);
        pkg.Execute(query);
        query = "UPDATE `File` SET `File`.`FileSize`=" + newFileSizeInBytes + " WHERE `File`='" + OriginalFileName + "'";
        Console.WriteLine(query);
        pkg.Execute(query);
        query = "UPDATE `File` SET `File`.`Sequence`=" + Sequence.ToString() + " WHERE `File`='" + OriginalFileName + "'";
        Console.WriteLine(query);
        pkg.Execute(query);
    }        
}
}

demonstration usage:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MSIFileManipulator
{
class Program
{
    static void Main(string[] args)
    {
        string workdir = @"C:UsersMeMyDevFoldertests";
        string msiFile = "replace_test_copy.msi";
        string fileName = "REPLACE_THIS_IMAGE.png";

        List<string> filesToInclude = new List<string>();
        System.IO.FileInfo fileInfo = new System.IO.FileInfo(System.IO.Path.Combine(workdir, fileName));
        if (fileInfo.Exists)
        {
            Console.WriteLine("now adding: " + fileName + " to cabinet");
            filesToInclude.Add(fileName);

            updateMSI myMSI = new updateMSI();
            string cabfileName = myMSI.createCabinetFileForMSI(workdir, filesToInclude);
            Console.WriteLine("cabinet file saved as: " + cabfileName);

            int diskID = myMSI.insertCabFileAsNewMediaInMSI(workdir, cabfileName, msiFile);
            Console.WriteLine("new media added with disk ID: " + diskID.ToString());
            myMSI.PointAPreviouslyConfiguredComponentsFileToBeFetchedFromAnotherCabinet(fileName, fileName, fileInfo.Length.ToString(), diskID);
            Console.WriteLine("Done");

        }
        else
        {
            Console.WriteLine("Could not locate the replacement file:" + fileName);
        }
        Console.WriteLine("press any key to exit");
        Console.ReadKey();
    }
}
}

I am aware that my test does not clean up after it self..

  • 13.02.2020
  • 24 510
  • 0
  • 04.10.2021
  • 13
  • 12
  • 1

MSIEXEC - описание команды и примеры использования

  • Содержание статьи
    • Описание
    • Установка и настройка продукта
      • Синтаксис
      • Параметры
      • Примечания
      • Примеры
    • Использование режима административной установки
      • Синтаксис
      • Параметры
      • Примечания
      • Примеры
    • Восстановление продукта
      • Синтаксис
      • Параметры
      • Примечания
      • Примеры
    • Удаление продукта
      • Синтаксис
      • Параметры
      • Примечания
      • Примеры
    • Объявление продукта
      • Синтаксис
      • Параметры
      • Примечания
      • Примеры
    • Установка уровня ведения журнала
      • Синтаксис
      • Параметры
      • Примечания
      • Примеры
    • Справочная информация
    • Добавить комментарий

Описание

MSIEXEC — Средство установки, изменения и выполнения операций установщика Windows из командной строки.

Эта команда поддерживается в CMD.EXE и в PowerShell.

Установка и настройка продукта

Синтаксис

msiexec /i {пакет|код_продукта}

Параметры

  • /i — Установка или настройка продукта.
  • пакет — Имя файла пакета установщика Windows.
  • код_продукта — Глобальный уникальный идентификатор (GUID) пакета установщика Windows.

Примечания

  • Регистр букв при вводе параметров командной строки установщика Windows не учитывается.

Примеры

Чтобы установить продукт из файла A:Example.msi, введите:

msiexec /i A:Example.msi

Использование режима административной установки

Синтаксис

msiexec /a пакет

Параметры

  • /a — Выбор режима административной установки.
  • пакет — Имя файла пакета установщика Windows.

Примечания

  • Регистр букв при вводе параметров командной строки установщика Windows не учитывается.

Примеры

Чтобы установить продукт из файла A:Example.msi в режиме административной установки, введите:

msiexec /a A:Example.msi

Восстановление продукта

Синтаксис

msiexec /f [p][o][e][d][c][a][u][m][s][v]{пакет|код_продукта}

Параметры

  • /f — Включение одного или нескольких параметров командной строки, перечисленных в следующей таблице.
  • пакет — Имя файла пакета установщика Windows.
  • код_продукта — Глобальный уникальный идентификатор (GUID) пакета установщика Windows.
Параметр Описание
p Переустановка только в случае отсутствия файла.
o Переустановка при отсутствии файла или если установлена его старая версия.
e Переустановка при отсутствии файла или если установлена его текущая либо старая версия.
d Переустановка в случае отсутствия файла или если установлена другая его версия.
c Переустановка в случае отсутствия файла или в случае, если контрольная сумма не совпадает с вычисленным значением.
a Принудительная переустановка всех файлов.
u Перезапись всех необходимых пользовательских записей реестра.
m Перезапись всех необходимых записей реестра компьютера.
s Перезапись всех имеющихся ярлыков.
v Запуск файлов из источника и повторное кэширование локального пакета.

Примечания

  • Параметром по умолчанию для этой командной строки является параметр /fpecms.
  • Регистр букв при вводе параметров командной строки установщика Windows не учитывается.

Примеры

Чтобы восстановить пакет установки, введите:

msiexec /fpecms Example.msi

Удаление продукта

Синтаксис

msiexec /x {пакет|код_продукта}

Параметры

  • /x — Удаление продукта.
  • пакет — Имя файла пакета установщика Windows.
  • код_продукта — Глобальный уникальный идентификатор (GUID) пакета установщика Windows.

Примечания

  • Регистр букв при вводе параметров командной строки установщика Windows не учитывается.

Примеры

Чтобы удалить или отменить установку пакета, введите:

msiexec /x Example.msi

Объявление продукта

Синтаксис

msiexec /j [{u|m}] пакет
msiexec {u|m} пакет /t список_преобразований
msiexec {u|m} пакет /g код_языка

Параметры

  • /j — Объявление продукта. u — Объявление для текущего пользователя. m — Объявление для всех пользователей компьютера.
  • пакет — Файл пакета установщика Windows.
  • /g код_языка — Служит для задания языка.
  • /t список_преобразований — Применение преобразований к объявляемому пакету.

Примечания

  • При необходимости установить приложение с повышенными привилегиями используйте параметр /jm.
  • Регистр букв при вводе параметров командной строки установщика Windows не учитывается.

Примеры

Чтобы объявить пакет для всех пользователей этого компьютера, введите:

msiexec /jm Example.msi

Установка уровня ведения журнала

Синтаксис

msiexec /L [i][w][e][a][r][u][c][m][p][v][+][!]файл_журнала.txt

Параметры

  • /L — Путь к файлу журнала.
  • i — Занесение в журнал сообщений о состоянии.
  • w — Занесение в журнал некритических предупреждений.
  • e — Занесение в журнал сообщений об ошибках.
  • a — Занесение в журнал выполнения действий.
  • r — Занесение в журнал записей со сведениями о действиях.
  • u — Занесение в журнал запросов пользователей.
  • c — Занесение в журнал исходных параметров пользовательского интерфейса.
  • m — Занесение в журнал нехватки памяти.
  • p — Занесение в журнал свойств терминала.
  • v — Занесение в журнал подробных сведений. Для использования параметра v следует задавать /L*v.
  • + — Добавление в существующий файл.
  • ! — Сброс в журнал каждой строки.
  • * — Занесение в журнал всех сведений, кроме параметра v. Это подстановочный знак.
  • файл_журнала.txt — Имя и путь к текстовому файлу журнала.

Примечания

  • Регистр букв при вводе параметров командной строки установщика Windows не учитывается.
  • Чтобы включить в файл журнала параметр v при использовании подстановочного знака, введите в командной строке /L*v.
  • Параметры файла журнала установщика Windows могут также использоваться для процессов удаления и восстановления.

Примеры

Чтобы установить пакет и создать файл журнала, включающий в себя сведения о состоянии, сообщения о нехватке памяти и все сообщения об ошибках, введите следующую команду:

msiexec /i Example.msi /L ime logfile.txt

Справочная информация

msiexec /Option <обязательный параметр> [необязательный параметр]

Параметры установки
</package | /i> Установка или настройка продукта
/a Административная установка — установка продукта в сеть
/j<u|m> [/t <список преобразований>] [/g <код языка>]
Объявление о продукте: «m» — всем пользователям; «u» — текущему пользователю
</uninstall | /x> Удаление продукта
Параметры отображения
/quiet
Тихий режим, без взаимодействия с пользователем
/passive
Автоматический режим — только указатель хода выполнения
/q[n|b|r|f]
Выбор уровня интерфейса пользователя
n — Без интерфейса
b — Основной интерфейс
r — Сокращенный интерфейс
f — Полный интерфейс (по умолчанию)
/help
Вывод справки по использованию
Параметры перезапуска
/norestart
Не перезапускать после завершения установки
/promptrestart
Запрашивать перезапуск при необходимости
/forcerestart
Всегда перезапускать компьютер после завершения установки
Параметры ведения журнала
/l[i|w|e|a|r|u|c|m|o|p|v|x|+|!|*] <файл_журнала>
i — сообщения о состоянии
w — сообщения об устранимых ошибках
e — все сообщения об ошибках
a — запуски действий
r — записи, специфические для действий
u — запросы пользователя
c — начальные параметры интерфейса пользователя
m — сведения о выходе из-за недостатка памяти или неустранимой ошибки
o — сообщения о недостатке места на диске
p — свойства терминала
v — подробный вывод
x — дополнительные отладочные сведения
+ — добавление в существующий файл журнала
! — сбрасывание каждой строки в журнал
* — заносить в журнал все сведения, кроме параметров «v» и «x»
/log <файл_журнала>
Равнозначен /l* <файл_журнала>
Параметры обновления
/update [;Update2.msp]
Применение обновлений
/uninstall <Код_Guid_обновления>[;Update2.msp] /package Удаление обновлений продукта
Параметры восстановления
/f[p|e|c|m|s|o|d|a|u|v] Восстановление продукта
p — только при отсутствии файла
o — если файл отсутствует или установлена старая версия (по умолчанию)
e — если файл отсутствует или установлена такая же либо старая версия
d — если файл отсутствует или установлена другая версия
c — если файл отсутствует или контрольная сумма не совпадает с подсчитанным значением
a — принудительная переустановка всех файлов
u — все необходимые элементы реестра, специфические для пользователя (по умолчанию)
m — все необходимые элементы реестра, специфические для компьютера (по умолчанию)
s — все существующие ярлыки (по умолчанию)
v — запуск из источника с повторным кэшированием локальных пакетов

Понравилась статья? Поделить с друзьями:
  • Как изменить msconfig через биос
  • Как изменить mpt на gpt
  • Как изменить mp4a на mp4r
  • Как изменить mp4 на гиф
  • Как изменить mp4 на mp3 на телефоне