Как я могу сравнить содержимое двух (или более) файлов MSI?
Как я могу выполнить "сравнение содержимого" двух (или более) файлов MSI и посмотреть, что на самом деле отличается внутри файлов, вместо того, чтобы выполнять бесполезное двоичное сравнение? (что, очевидно, говорит мне, имею ли я дело с копиями одного и того же файла или нет).
Некоторые актуальные и типичные сценарии проблемы:
- Наша система сборки выплевывает файлы MSI как сумасшедшие, и иногда нам нужно выяснить, какие различия существуют между различными файлами MSI (читай: что-то изменилось, и теперь мы терпим неудачу при развертывании).
- У нас есть файлы MSI, скомпилированные из одних и тех же источников в разных местах, и некоторые из них не запускают отчет System.BadImageFormatException - как мы можем отладить разницу в файлах MSI? (Ответ, касающийся этой ошибки конкретно здесь: зависят ли приложения от среды, в которой она была скомпилирована?).
- MSI-файлы могут быть скомпилированы с использованием всевозможных инструментов, но для пользователей stackru такие файлы, вероятно, чаще всего создаются с помощью WiX или Visual Studio Installer Projects (бесплатные наборы инструментов).
Это вопрос в стиле Q/A на тему сравнения ваших скомпилированных файлов MSI, чтобы определить, какие существуют реальные "различия в содержании".
1 ответ
О файлах MSI
Грубо говоря, MSI- файлы - это COM-структурированные файлы хранения - по сути, файловая система в файле - с потоками различного содержимого, одним из которых является урезанная база данных SQL Server (в наиболее общих терминах, которые я считаю). При условии, что файлы MSI доступны для чтения, содержимое (различных форматов и типов) можно сравнивать.
Техническое примечание: вполне возможно, что MSI, который вызывает System.BadImageFormatException
просто не работает (msiexec.exe
не может запустить его), но он все еще может быть читаемым - и, следовательно, сопоставимым (пожалуйста, добавьте комментарий, чтобы проверить это, если вы испытываете это).
Потоки: некоторые потоки в MSI являются таблицами со строковыми значениями. Также могут быть потоки для встроенных cab-архивов, используемых для хранения файлов для развертывания, и таблицы только с двоичным содержимым, такие как Binary table
где скомпилированные и не скомпилированные пользовательские действия хранятся вместе с другим двоичным содержимым, необходимым для установки. И есть специальный " сводный поток " и таблица с иконками, хранящимися в их собственном, двоичном формате, и список можно продолжить... Для большинства таблиц мы можем сравнивать строки в каждой таблице почти так же, как мы сравниваем текст в документ Word (который также был OLE / COM-файлами - хотя в более новых версиях теперь используется Open Office XML) и получить подробный отчет о различиях. Для того, чтобы сделать это, вам, очевидно, нужен специальный инструмент для работы - способный найти свой путь через все соответствующие потоки. Некоторые коммерческие и бесплатные инструменты для этого перечислены ниже.
Двоичный контент. Прежде чем приступить к разработке, я должен отметить, что при сравнении контента в Binary Table
, Cabs Table
, Icon Table
- или любая другая двоичная таблица, как правило, позволяет вам только двоичное сравнение (особенно для скомпилированных файлов пользовательских действий и исполняемых файлов). Пользовательские действия сценария - в двоичной таблице - можно сравнивать как текстовые, но скомпилированные пользовательские действия можно сравнивать только в двоичном формате. Таким образом, если ваша проблема возникает из скомпилированного пользовательского действия, вы не сможете увидеть его в прямом сравнении (вы видите только двоичное различие). Вам нужно нажать на систему управления исходным кодом, чтобы увидеть, какой код использовался для скомпилированных пользовательских действий любого рода - надеюсь, у вас есть хорошая практика меток, чтобы вы могли найти фактический исходный код, используемый в каждой установке. Я не использую эту практику, но для внутренних, корпоративных выпусков, возможно, вы даже можете включить вашу dll debug-build для вашего скомпилированного настраиваемого действия и попытаться присоединить отладчик к работающему коду, чтобы действительно выяснить, что происходит? Я бы не стал использовать dll в режиме отладки для публичного выпуска - если бы я не разъяснил риски. Код отладки может быть пронизан (неожиданными) окнами сообщений отладки (используемыми в качестве точек входа для подключения отладчика) и другими проблемами, которые никогда не должны попадать в производственный пакет.
Если подумать, ваши cab-файлы и файлы значков определенно можно сравнить с их соответствующими версиями в более старых (или более новых) MSI-файлах, используя технику декомпиляции MSI-файлов с помощью dark.exe
- который описан ниже. Затем, используя хороший инструмент сравнения (Beyond Compare упоминается ниже), вы можете выполнить полный анализ содержимого файла cab между различными версиями MSI (и некоторые из этих файлов могут быть текстовыми файлами, которые могут сравниваться по тексту). Я полагаю, что cab и значки являются своего рода "прозрачными двоичными файлами" в открытом формате, а не скомпилированными двоичными файлами (с настраиваемыми действиями и т. Д.), Которые по своей природе не декомпилируемы или не проверяемы (если только вы не знаете, как декомпилировать управляемые двоичные файлы).
В заключение: файлы MSI полностью прозрачны, за исключением скомпилированных пользовательских действий. Эта прозрачность является одним из основных преимуществ MSI. Большинство преимуществ установщика Windows по сравнению с предыдущими технологиями развертывания, как правило, сосредоточены на преимуществах корпоративного развертывания. К сожалению, разработчики могут видеть только плохие аспекты MSI: (потенциальные) анти-паттерны MSI (ближе к низу - пока что очень грязно и нерегулярно). По общему признанию, некоторые из этих проблем являются очень серьезными и нарушают "принцип наименьшего удивления". Разработчики - зачем делать другие и не менее важные дела - откровенно говоря, могут не почесать головы в недоумении.
Не оставляйте в этом ошибку: MSI обладает огромными преимуществами для корпоративного развертывания ( см. Ссылку выше, внизу). Сжатие: надежный тихий запуск, удаленное управление, откат, ведение журнала, функция неявного удаления, повышенные права, стандартизированная командная строка, прозрачность, преобразования для стандартизированной настройки и установка администратора для надежного извлечения файлов. Просто чтобы быстро назвать большие.
Пока много отступлений - давайте перейдем к делу. Какие инструменты можно использовать для сравнения файлов MSI?
Коммерческие инструменты
Несколько коммерческих инструментов развертывания, таких как Installshield, http://www.advancedinstaller.com/ и многие другие инструменты MSI, поддерживают просмотр и сравнение файлов MSI. Возможно, я добавляю слишком много ссылок, но позвольте мне использовать мою обычную политику "если вы ссылаетесь на одну, вы ссылаетесь на всех" - это должно сэкономить некоторое время и некоторые поиски в Google.
В качестве особого примечания - ностальгического - лучшая функция MSI-diff, которую я когда-либо видел, была в Wise Package Studio. Честно говоря, это было на голову выше остальных - всегда работало, аккуратно кодировалось и просто понималось. Этот инструмент больше не продается, как описано здесь: Какой установочный продукт использовать? InstallShield, WiX, Wise, Advanced Installer и т. Д. (Если в вашей корпорации есть команда по упаковке, может, у них есть запасная лицензия?).
Бесплатные инструменты
Коммерческие инструменты хороши, но есть также несколько бесплатных альтернатив, которые можно использовать для сравнения файлов MSI - и ниже приведен список некоторых из них вместе с некоторыми советами о том, как использовать каждый инструмент (довольно минималистично).
Есть еще несколько деталей, добавленных для dark.exe
- который вообще не является средством сравнения для файлов хранения со структурой COM, но является способом декомпиляции файлов MSI в исходные файлы WiX XML и извлечения всех файлов поддержки (значки, двоичные файлы, кабины, установочные файлы) - позволяя сравнивать их с обычные текстовые / двоичные инструменты сравнения впоследствии.
1. Orca (MSI SDK)
Собственный инструмент / средство просмотра MSI SDK Microsoft под названием Orca может просматривать файлы MSI и редактировать их, но прямой поддержки сравнения двух файлов MSI (о которых я знаю) не существует. Я полагаю, вы могли бы экспортировать таблицы и затем сравнить их, но другие инструменты имеют больше встроенных функций. Эта опция упоминается, так как вы, возможно, уже установили Orca, и тогда это, вероятно, быстрый способ сделать простой diff. "Вариант бедняка ".
Возможно, у вас уже есть установщик. Если у вас установлена Visual Studio, попробуйте поискать Orca-x86_en-us.msi
и установите его. Затем найдите Orca в меню "Пуск". Технически Orca устанавливается как часть Windows SDK (большая, но бесплатная загрузка). Если у вас не установлена Visual Studio, возможно, вы знаете кого-то, кто делает? Просто попросите их найти этот MSI и отправить вам (это крошечный файл размером в половину мегабайта) - это займет у них несколько секунд. Если нет, вы всегда можете скачать Windows SDK
2. Super Orca (бесплатный сторонний инструмент)
Super Orca позволит элементарное сравнение двух файлов MSI. Мой тест на дым показывает, что дополнительные поля, такие как "Сводный поток", могут игнорироваться. Другими словами, прямую таблицу сравнивают только. Могут быть и другие ограничения. Может быть, это достаточно хорошо? Это простой в использовании.
3. widiffdb.vbs (MSI SDK)
MSI SDK
имеет VBScript, который вы можете использовать для просмотра различий между двумя файлами MSI. Это называется widiffdb.vbs
( MSDN). С помощью этого инструмента я вижу различия в сводном потоке, игнорируемые Super Orca. Все, что MSI SDK является авторитетным.
- Вбрасывание ссылки на полный список таких MSI SDK VBScripts - для различных целей. Не путайся, только
widiffdb.vbs
необходим для сравнения файлов MSI, но есть много полезных скриптов для других целей. - Если у вас установлена Visual Studio, просто найдите
widiffdb.vbs
, Запустить сcscript.exe
и передайте полный путь к двум файлам MSI, чтобы сравнить их. Вывод в консоль.
4. dark.exe (инструментарий WiX - с открытым исходным кодом)
Двоичный файл dark.exe из набора инструментов WiX (набор инструментов, который, вероятно, использовался для компиляции некоторых файлов MSI). это dark.exe
"дизассемблер" или "декомпилятор" для файлов MSI Это будет конвертировать файлы MSI в wxs
Формат XML (собственный формат WiX, используемый в первую очередь для компиляции файлов MSI), а также ряд извлеченных двоичных файлов (если вы используете правильные параметры и флаги декомпиляции).
wxs
исходные файлы можно сравнивать как обычные текстовые исходные файлы (мой любимый инструмент для этого - Beyond Compare, но это коммерческий инструмент - существует множество инструментов для сравнения текста - в том числе в Visual Studio). Двоичные файлы, очевидно, могут быть двоичными по сравнению. Любой извлеченный CAB-файл можно сравнить с другим, аналогичным CAB-файлом из другой версии установки MSI, например.
Вот пример командной строки:
dark.exe -x outputfolder MySetup.msi
Во многих случаях это даст очень хорошее сравнение файлов MSI, и вы сможете определить, что действительно отличается.
Извлеченные двоичные файлы могут быть файлами сценариев (VBScripts и т. Д.) Или любым другим количеством двоичных файлов (например, скомпилированные пользовательские действия DLL). В последнем случае вы не сможете декомпилировать его дальше - если только это не двоичный файл.NET и у вас нет опыта в декомпиляции таких двоичных файлов.
Однако следует отметить, что сгенерированные с помощью WiX MSI-файлы, скомпилированные с использованием одинаковых исходных файлов WiX, могут отличаться по нескольким причинам:
Один и тот же исходный файл WiX также может быть скомпилирован с различными настройками компилятора и компоновщика, и это может повлиять на сгенерированный файл MSI несколькими различными способами. Чтобы увидеть все переключатели, скачайте и установите WiX и просто напишите
candle.exe
или жеlight.exe
в командной строке и нажмите Enter.Некоторые поля, такие как GUID пакетов и GUID продуктов, могут быть настроены на автоматическое создание в файле wxs. Результирующее соответствующее поле в сгенерированном файле MSI, очевидно, будет разным для каждой сборки в этом случае.
У меня нет полного списка того, какие поля можно настроить для автоматической генерации на данный момент (если вы знаете, возможно, нажмите "Изменить" и измените это на месте).
Упомянутые автоматически сгенерированные поля также могут быть жестко запрограммированы (что не очень хорошо для GUID пакета, но это еще одна длинная история - просто знайте, что если вы обнаружите два двоичных файла MSI с одинаковым GUID пакета, то у вас серьезные проблемы - если они находятся в свободном доступе - установщик Windows будет рассматривать их как один и тот же файл по определению). Коды пакетов всегда должны генерироваться автоматически. Отступление.
Сами файлы MSI, очевидно, имеют разную информацию о дате файла, которая была скомпилирована отдельно - просто для подтверждения очевидного.
И специальное примечание, несколько не связанное с данной темой, но, тем не менее, важное: вы можете использовать dark.exe
декомпилировать исполняемые файлы, скомпилированные с функцией записи WiX. Это функция начальной загрузки WiX, используемая для последовательной установки одного или нескольких файлов MSI и / или EXE - один за другим. Эти загрузчики являются файлами EXE, и вы можете распаковать их в составные файлы MSI и / или EXE:
dark.exe -x outputfolder setup.exe
Просто откройте командную строку и вставьте компакт-диск в папку, где находится файл setup.exe. Затем укажите вышеуказанную команду. Бетонный образец: dark.exe -x outputfolder MySetup.exe
, Выходная папка будет содержать несколько подпапок, содержащих извлеченные файлы MSI и EXE, а также манифесты и файл ресурсов для графического интерфейса записи. Любые файлы MSI затем могут быть разобраны, как описано выше, для создания исходного файла WiX (wxs).
5. InstEd (бесплатный сторонний инструмент - доступна версия плюс)
По какой-то причине я никогда не использовал этот инструмент активно, но тестировал его несколько раз. Повторное тестирование позволяет сравнить два файла MSI, хотя и из странного пункта меню (что заставило меня думать, что эта функция раньше не работала).
- Откройте MSI, затем перейдите к
Transform => Compare Against...
и найдите MSI, с которым вы хотите сравнить первый. - Сравнение кажется нормальным, и я вижу, что в Сводном потоке есть изменения - например, - но разница не показывает, что отличается (если я просто не вижу этого).
- Чтобы увидеть изменения суммарного потока, откройте оба файла в отдельных экземплярах InstEd и перейдите
Tables => Summary Info...
в обоих случаях. Теперь сравните информацию в листах свойств. В качестве альтернативы используйтеwidiffdb.vbs
Сценарий, указанный выше.
6. Другие инструменты... (средства просмотра файлов с COM-структурой)
Нет сомнений, что есть много других инструментов, способных просматривать файлы хранения с COM-структурой, но я думаю, что вышеупомянутые опции должны подойти большинству пользователей. Я снова добавлю ссылку на список инструментов MSI на installsite.org.
7. Расширенный установщик (коммерческий инструмент с некоторыми бесплатными функциями)
Этот коммерческий инструмент сможет работать в качестве средства просмотра и позволять выполнять некоторые основные операции с файлами MSI даже без использования полной лицензии. Приятно, что вам даже не нужно использовать необработанные таблицы, но вы можете использовать гораздо более приятный пользовательский интерфейс для "исправления" различных вещей в MSI. Например, различные параметры обновления (продолжить или дать сбой при сбое основного обновления и т. Д.).
Изменения, сделанные в представлении " Редактор таблиц" (представление в виде таблицы), не будут видны в других "представлениях мастера". Причина этого объясняется здесь.