Другое

Создание MSP-патчей из MSI CAB-файлов: Полное руководство

Узнайте, как создавать MSP-патчи из MSI-файлов с встроенными CAB-файлами. Исправьте ошибку 0xC00E5116 с помощью нашего полного руководства, охватывающего административные установки, альтернативные методы и лучшие практики для успешного создания патчей.

Как создать MSP-патчи из MSI-файлов с файлами, встроенными в CAB, с помощью msimsp?

Я пытаюсь создать MSP-файл из двух MSI-файлов, созданных с помощью Advanced Installer. Я выбрал опцию “Архивировать установочные файлы в CAB-файлы”, но не выбрал “Сжимать CAB-файлы для уменьшения размера”.

Когда я запускаю:

msimsp -s MyProperties.pcp -p MyPatch.msp -l MyPatch.log

я получаю код ошибки 0xC00E5116. В логе показано:

ERROR: UpgradedImages.MsiPath 'C:\MyFolder\Setup.msi' помечен как содержащий сжатые файлы (свойство PID_WORDCOUNT потока Summary Information). PatchWiz не может патчить файлы, сжатые в cabinet.

Однако я не выбирал сжатие файлов. Является ли помещение в cabinet “сжатием” с точки зрения msimsp, или есть способ обойти эту проблему?

Это работает нормально, если я выбираю “Размещать файлы распакованными в папках рядом с базой данных MSI”, но я предпочитаю распространять установщик в виде одного MSI- (или EXE-) файла. Возможно ли это, сохранив возможность создания патча?

Ошибка 0xC00E5116 возникает из-за того, что msimsp (инструмент создания патчей Microsoft) рассматривает любой MSI-файл с файлами, встроенными в cabinet (CAB) файлы, как “сжатый”, независимо от того, сжаты ли сами CAB-файлы. Это происходит потому, что свойство PID_WORDCOUNT в потоке сводной информации MSI указывает, что файлы содержатся внутри cabinet-файлов, которые msimsp не может патчить напрямую. Эту проблему можно решить, создав административные установки или используя альтернативные методы создания патчей, которые работают с файлами, встроенными в CAB.

Содержание

Понимание ошибки 0xC00E5116

Код ошибки 0xC00E5116 соответствует ERROR_PCW_UPGRADED_IMAGE_COMPRESSED в Windows SDK. Эта ошибка возникает при попытке создания патча с помощью msimsp для MSI-файлов, в которых файлы встроены в cabinet (CAB) файлы.

Согласно результатам исследований, сообщение об ошибке гласит:

ERROR: UpgradedImages.MsiPath 'C:\MyFolder\Setup.msi' помечен как имеющий сжатые файлы (свойство PID_WORDCOUNT потока сводной информации). PatchWiz не может патчить файлы, сжатые в cabinet-файле.

Это происходит потому, что базовый компонент msimsp, PatchWiz, может работать только с несжатыми образами. Инструмент проверяет свойство PID_WORDCOUNT в потоке сводной информации MSI, которое указывает, встроены ли файлы в cabinet-файлы или хранятся отдельно.

Ключевое замечание: Даже если вы не выбрали “Сжать CAB-файлы для уменьшения размера” в Advanced Installer, простое помещение файлов в CAB-файлы (без сжатия) все равно заставляет msimsp рассматривать MSI как сжатый.

Почему файлы в CAB-файлах считаются “сжатыми”

Путаница возникает из-за терминологии, используемой в технологии Windows Installer:

  1. CAB-файлы против сжатия: Когда вы выбираете “Архивировать установочные файлы в CAB-файлы” в Advanced Installer, вы встраиваете файлы в контейнеры cabinet, но это не обязательно означает, что они сжаты.

  2. Свойство PID_WORDCOUNT: Это свойство в потоке сводной информации MSI указывает, встроены ли файлы в cabinet-файлы. Когда файлы находятся в cabinet-файлах, это свойство показывает, что пакет “сжат” с точки зрения msimsp, даже если сами CAB-файлы не сжаты.

  3. Ограничение PatchWiz: Движок создания патчей, PatchWiz, не может напрямую патчить файлы, хранящиеся в cabinet-файлах внутри MSI-файлов. Это фундаментальное ограничение процесса создания патчей.

Как указано в документации Microsoft, для указания исходного образа, который имеет как cabinet-файл, так и несжатые файлы, вам нужно пометить пакет как несжатый, сбросив бит 1 в свойстве сводной информации WordCount.

Решение 1: Использование административных установок

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

Пошаговый процесс:

  1. Создание административных установок:

    cmd
    msiexec /a "C:\Original\Setup.msi" /t "C:\Admin\Original"
    msiexec /a "C:\Updated\Setup.msi" /t "C:\Admin\Updated"
    
  2. Создание PCP-файла: Укажите в вашем PCP-файле на эти административные установки вместо исходных MSI-файлов.

  3. Запуск msimsp:

    cmd
    msimsp -s MyProperties.pcp -p MyPatch.msp -l MyPatch.log
    

Преимущества:

  • Файлы несжаты и доступны для патчинга
  • Поддерживает единое распространение MSI
  • Сохраняет всю исходную функциональность

Недостатки:

  • Требует дополнительного шага создания административной установки
  • Изначально большие файлы распространения

Как сообщил один пользователь на форумах MSDN, он наконец решил проблему, указав целевые и обновленные образы на административную установку вместо исходных MSI-файлов.

Решение 2: Создание несжатых MSI-файлов

Если вы предпочитаете избегать административных установок, вы можете создавать MSI-файлы с несжатыми файлами:

В Advanced Installer:

  1. Отключение архивации CAB:

    • Перейдите в раздел “Файлы и папки”
    • Снимите флажок “Архивировать установочные файлы в CAB-файлы”
    • Установите флажок “Размещать файлы распакованными в папках рядом с базой данных MSI”
  2. Сборка MSI: Создайте ваш MSI с этой конфигурацией

  3. Создание патча: Используйте msimsp с несжатыми MSI-файлами

Для существующих MSI-файлов:

Если у вас есть существующие MSI-файлы с CAB-файлами, вы можете попытаться удалить сжатие:

cmd
msiexec /a "Setup.msi" /t "Admin"
msidb -d "Admin\Setup.msi" -r

Однако, как отмечено в обсуждениях Stack Overflow, этот подход может привести к исчезновению файлов и может быть ненадежным.

Решение 3: Альтернативные методы создания патчей

Вариант А: Использование встроенных функций патчинга Advanced Installer

Вместо прямого использования msimsp используйте функции создания патчей в Advanced Installer:

  1. Откройте Advanced Installer
  2. Создайте новый проект: Выберите опцию “Создать новый патч”
  3. Выберите базовый и целевой MSI: Выберите ваши исходный и обновленный MSI-файлы
  4. Настройте параметры патча: Установите соответствующие свойства патча
  5. Соберите патч: Позвольте Advanced Installer обработать создание патча внутренне

Вариант Б: Использование WiX Toolset

Если вы используете WiX, вы можете создавать патчи с помощью инструмента heat и light:

cmd
heat dir "OriginalFiles" -out Original.wxs -ag -srd -sreg -sfrag
heat dir "UpdatedFiles" -out Updated.wxs -ag -srd -sreg -sfrag
candle Original.wxs Updated.wxs
light Original.wixobj Updated.wixobj -out Patch.wixmsp

Вариант В: Сторонние инструменты

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

Расширенная конфигурация Advanced Installer

Для правильной настройки Advanced Installer для создания патчей:

  1. Параметры проекта:

    • Перейдите в “Свойства проекта” → “Установка”
    • Убедитесь в согласованности кодов продуктов и версий между базовой и целевой версиями
  2. Создание патча:

    • Используйте меню “Сборка” → “Создать патч”
    • Выберите подходящий тип патча (основное обновление, минорное обновление и т.д.)
  3. Обработка файлов:

    • Для CAB-файлов учтите компромисс между размером распространения и возможностью патчинга
    • Тщательно тестируйте патчи в различных сценариях установки

Как отмечено на форумах Advanced Installer, некоторые проблемы можно решить, восстановив установку Windows SDK или проверив наличие отсутствующих зависимостей.

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

Распространенные проблемы:

  1. Сообщения об ошибках: Обращайте внимание на конкретные коды ошибок и сообщения в файле журнала

  2. Пути к файлам: Убедитесь, что в путях к файлам нет пробелов или специальных символов

  3. Разрешения: Запускайте msimsp с соответствующими административными привилегиями

Лучшие практики:

  1. Тщательное тестирование: Всегда тестируйте патчи на чистых установках
  2. Ведение журналов: Поддерживайте подробные журналы для устранения неполадок
  3. Контроль версий: Используйте управление версиями для файлов патчей
  4. Документация: Документируйте процессы создания патчей и принятые решения

Как предложено в документации Microsoft, при работе со сжатыми и несжатыми файлами помечайте пакет как несжатый в свойстве WordCount и устанавливайте соответствующие атрибуты в таблице File.

Заключение

Создание MSP-патчей из MSI-файлов с файлами, встроенными в CAB, требует понимания ограничений msimsp и реализации соответствующих обходных решений. Ключевые выводы:

  1. Ошибка 0xC00E5116 указывает, что msimsp не может патчить MSI-файлы с файлами, встроенными в cabinet-файлы, даже если эти cabinet-файлы не сжаты
  2. Административные установки предоставляют наиболее надежное решение для патчинга файлов, встроенных в CAB
  3. Альтернативные инструменты, такие как встроенные функции патчинга Advanced Installer или WiX Toolset, могут offer лучшую совместимость
  4. Существуют компромиссы в конфигурации между размером распространения и возможностью патчинга

Для вашего конкретного случая я рекомендую использовать административные установки как наиболее надежное решение, которое позволяет поддерживать единое распространение MSI при успешном создании патчей. Если вы предпочитаете избегать административных установок, рассмотрите использование встроенных функций создания патчей в Advanced Installer вместо прямого использования msimsp.

Источники

  1. Microsoft Community - msimsp ошибка и свойство PID_WORDCOUNT
  2. Google Groups - Не удалось создать патч, код ошибки 0xC00E5116
  3. Stack Overflow - PatchWiz не может патчить файлы, сжатые в cabinet-файле
  4. Microsoft Narkive - Ошибка создания патча, код 0xC00E5116
  5. Документация Microsoft - Свойство WordCount
  6. Stack Overflow - Создание патчей с файлами, встроенными в CAB
  7. Форумы Advanced Installer - Сборка патча и msimsp.exe
Авторы
Проверено модерацией
Модерация