Как избежать самовосстановления MSI с помощью пакета WiX / MSI?

Как избежать самовосстановления из пакета MSI, сгенерированного WiX?


Это вопрос в стиле Q/A с ответом, в котором просто перечислите несколько вещей, которые нельзя делать в файле MSI, чтобы избежать наиболее частых причин повторения самовосстановления.

1 ответ

Решение

Самовосстановление, простое и краткое объяснение: почему установщик MSI переконфигурирует, если я удаляю файл?


Краткое содержание

Я продолжаю пытаться писать о повторяющемся самовосстановлении MSI для разработчиков, но в итоге слишком много деталей. Вот моя последняя попытка: конкретные советы по проектированию того, чего не следует делать в вашем файле WiX / MSI. Другие специалисты по развертыванию, пожалуйста, расширьте "список ошибок" ниже.


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

Я думаю, что есть время для еще одного взгляда на самовосстановление. Теперь я наконец-то могу написать то, что я намеревался: взгляд разработчика на самовосстановление - некоторые из ловушек, которых следует избегать разработчикам, которые сами занимаются разработкой настроек - часто используя платформу WiX. Просто короткий, конкретный список вещей, которые нельзя делать в вашем пакете MSI.


Подводные камни дизайна MSI / WiX, вызывающие проблемы самовосстановления

Это грубый первый черновик. Эти точки будут выделены, когда позволит время.

  1. Вы испортили установку общих сред выполнения. Вы не используете модули слияния для развертывания глобально зарегистрированных и / или общих файлов времени выполнения. Скорее вы устанавливаете свои собственные копии файлов и регистрируете их для всей системы. Это особенно плохо для файлов COM, но относится и к файлам других типов. Конфликтующие приложения будут пытаться вернуть свое состояние, и результаты "самостоятельного восстановления" будут появляться при каждом запуске другого приложения.

  2. Вы запускаете в пустую папку особенность самовосстановления. Вы создаете пустой компонент с путем к ключу каталога без добавления записи CreateFolder. Это вызывает бесконечный цикл, в котором MSI удаляет папку, а затем запускает самовосстановление, чтобы вернуть ее обратно. На данный момент в WiX может быть защита от этого.

  3. Неправильный подсчет ссылок на компоненты. Вы сами создаете набор пакетов, которые устанавливают файл с одинаковым именем в одно и то же место на диске из разных установок MSI, используя разные GUID компонентов. Скорее всего, это приведет к самовосстановлению, так как пакеты "сражаются", чтобы поставить свою версию файла на место. Для этого есть несколько "исправлений", таких как проектирование модуля слияния, использование подключаемого файла WiX, установка файла без подсчета ссылок (пустой указатель компонента) - (подробности будут добавлены в ближайшее время).

  4. Ошибочная установка файла для каждого пользователя. Вы устанавливаете файлы в профиль пользователя и задаете путь к ключу файла вместо пути к ключу реестра в HKCU (требуется согласно рекомендациям по проектированию MSI). Это часто приводит к тому, что обычные пользователи испытывают повторное самовосстановление, которое никогда не удается из-за отсутствия прав на диске. Файлы ключей не "видны" обычному пользователю, поскольку нет разрешения на чтение в том месте, где находится файл ключа (профиль пользователя другого пользователя).

  5. Ошибочные права доступа к диску / реестру. Эта проблема другая, но похожая на предыдущую. Во время установки вы применяете пользовательские разрешения на доступ к файлам, папкам и реестру, что исключает доступ для чтения к местам установки для обычных пользователей. Обычные пользователи увидят повторяющееся самовосстановление, которое никогда не будет успешным. Это может произойти и с расположением файлов "на машину", а не только с путями в профиле пользователя (как в предыдущем выпуске). Я слышал слухи, что некоторые видели это, в частности, для защищенных от записи INI-файлов.

  6. Вы оставляете счетчик ссылок включенным для временных файлов. По какой-то безумной причине вы решили установить файл в папку tmp или другую папку, которая может быть очищена в любой момент. Возможно, вы намереваетесь запустить файл из пользовательского действия или чего-то еще. В любом случае вы устанавливаете его через компонент с указанием guid и пути к ключам, а когда файл "очищается" от диска, ваш MSI-файл попытается вернуть его обратно. Это повторяется каждый раз, когда файл "очищается". Поскольку место установки, вероятно, является местоположением для каждого пользователя, другие пользователи могут не "видеть" файл из своего логина, и они испытывают немедленное повторение самовосстановления, тогда как вы видите его только тогда, когда файл "очищен".

  7. Вредоносные программы - реальные и ложные срабатывания. Вы устанавливаете необычный бинарный файл, не проходя его через обычную проверку на наличие вирусов и вредоносных программ. Проверять наличие вредоносных программ так же важно, как и проверять наличие ложных срабатываний (одна из служб сканирования вредоносных программ - http://www.virustotal.com/ - почти 70 различных сканеров - обратите особое внимание на крупных поставщиков - очевидно), Таким образом, вы игнорируете проверку на вредоносное ПО, и после развертывания ваш продукт страдает от ложных срабатываний от нескольких поставщиков антивирусов, и самовосстановление будет тщетно пытаться вернуть файл обратно только для того, чтобы его снова "поместили в карантин". Ваши клиенты обвиняют вас. Результат, конечно, одинаково плох, если вместо этого вы установите настоящий вирус или вредоносное ПО. Результат точно такой же - самовосстановление продолжается напрасно. С другой стороны, если бинарный файл был инфицирован после установки, то самовосстановление должно служить своей цели и запускаться один раз, чтобы вернуть чистый файл на место. Основная проблема заключается в том, что исправить ложное срабатывание на самом деле сложнее, чем бороться с вредоносным ПО (вредоносное ПО, конечно, хуже для клиента, если оно приводит к потере данных, но следует понимать, что это не в ваших руках как поставщика программного обеспечения). При использовании вредоносного ПО вы просто указываете своему клиенту перестроить свои ПК и переустанавливать свое программное обеспечение, но при ложном срабатывании вам нужно сделать что-то, чтобы внести белый список в ваш двоичный файл - часто с несколькими поставщиками программного обеспечения для обеспечения безопасности. Как вы справляетесь с этим процессом? Похоже, что вредоносные программы становятся все хуже и хуже, а попытки безопасности ужесточаются любым возможным способом, ложные срабатывания могут стать серьезной проблемой развертывания - даже больше, чем сейчас. Много времени может быть потрачено впустую, пытаясь получить ваш бинарный белый список. И очевидное, но давайте просто скажем об этом вслух: не смело решайте эту задачу самостоятельно как лицо, занимающееся развертыванием - этот белый список - огромная задача, требующая участия руководства. Проблема затрагивает все, что касается поставщика программного обеспечения: продажи, разработки, маркетинг и поддержка. По мере того как программное обеспечение для обеспечения безопасности становится все более совершенным и "умным", оно может начать помещать в карантин весь кэшированный MSI-файл в системе %SystemRoot%\Installer (используется для обслуживания установки, ремонта и удаления). Когда это произойдет, самовосстановление будет невозможно, а также удаление (!) Невозможно, если у вас нет доступа к точному, оригинальному MSI, который использовался для установки. В этих случаях, я полагаю, вы могли бы попробовать некоторые из перечисленных здесь вариантов, чтобы удалить MSI с вредоносными программами или ложными срабатываниями: почему MSI требует исходный MSI-файл для удаления? или раздел 12 здесь: Удаление MSI-файла из командной строки без использования msiexec.

  8. Вы устанавливаете файлы рабочего стола, которые могут быть удалены пользователем. Это "крайний случай", требующий, чтобы вы также ошибочно установили путь ключа для устанавливаемого компонента на путь ключа диска (а не на правильный путь HKCU). Большую часть времени вы ставите ярлыки на рабочий стол, и это нормально. Однако, если вы устанавливаете какой-либо файл данных, который затем удаляет пользователь, вы можете увидеть, что он восстанавливается при самовосстановлении, когда ваше приложение запускается с помощью рекламируемого ярлыка, или даже если рекламируемый объект COM создается или создается файл определенного типа. запущен.

  9. Вы устанавливаете объявленные ярлыки в папку "Автозагрузка". Не устанавливайте объявленные ярлыки в папку "Автозагрузка". Он может инициировать самовосстановление при каждом запуске системы без какого-либо взаимодействия с пользователем. Удаление ярлыка также вызывает самовосстановление. Это то, что я никогда не видел, но это имеет смысл.

  10. Вы используете путь ключа HKCU (или HKLM в этом отношении), который изменяется в вашем приложении. Любые настройки, которые вы записываете из своего MSI в реестр, как правило, не должны быть изменены или, что еще хуже, удалены в результате работы вашего приложения. Самовосстановление скорее всего закончится. Пишите только те данные, которые только что прочитало приложение. Ваше приложение должно всегда заполнять все настройки по умолчанию HKCU, и ваши настройки никогда не должны мешать им. То же самое касается файлов userprofile. Они должны быть скопированы для каждого пользователя из местоположения шаблона для каждой машины. Общая мораль этой истории: развертывание только файлов и настроек для каждого компьютера (HKLM). Все остальное должно быть инициализировано приложением: почему при использовании MSI рекомендуется ограничить развертывание файлов профилем пользователя или HKCU?,

  11. Ваша установка записывает в разделы реестра, которые периодически перезаписываются групповой политикой. Мне кажется, я впервые увидел эту проблему в связи с тем, что некоторые ключи настроек прокси-сервера IE в HKCU устанавливаются с помощью MSI. Использование MSI для установки нескольких ключей реестра всегда является плохой идеей по многим причинам. Пожалуйста, посмотрите этот ответ serverfault.com для списка нескольких проблем: Пакет MSI для регулярного развертывания (рекомендуется быстрое чтение, хотя это наиболее актуально для системных администраторов, но важно знать для разработчиков). У меня возникают проблемы при воспроизведении этой проблемы, поскольку самовосстановление запускается, когда отсутствуют ключевые пути (как правило, не просто измененные или модифицированные). Возможно групповая политика фактически удалила значения HKCU, которые были добавлены MSI? Мы видели проблему, так что, вероятно, это и случилось. Общее сообщение: никогда не используйте MSI для установки нескольких ключей реестра, особенно если они находятся в HKCU. Используйте групповую политику, сценарии входа в систему, сценарии VB, PowerShell или другие, более надежные меры, такие как применение приложений при запуске (один раз на пользователя).

  12. Вы регистрируете конкретный файл / ассоциацию MIME или командный глагол в своем файле MSI. Большая часть самовосстановления, по-видимому, вызвана вмешательством реестра COM между продуктами, которое запускает самовосстановление при создании экземпляра COM-объекта, или вызовом объявленного ярлыка. Однако вы также можете запустить самовосстановление с помощью файловых / MIME-ассоциаций и командных глаголов. В частности, ассоциации файлов могут быть зарегистрированы другими приложениями / файлами MSI в системе, и это может вызвать очень постоянное самовосстановление, поскольку каждое приложение пытается "украсть" ассоциацию файлов. Используйте эти функции в MSI экономно - и убедитесь, что ассоциации файлов, которые вы регистрируете, действительно уникальны. Никогда не устанавливайте "общую" ассоциацию файлов в настройках MSI (например, jpg).

  13. Один и тот же MSI установлен дважды (или более) по ошибке. Это звучит странно, но на самом деле это возможно несколькими способами. Самовосстановление не может быть вашей самой большой проблемой, если это произойдет, вы увидите и другие проблемы:

    • Вы забыли сгенерировать новый GUID пакета для перестроенного MSI. Затем установщик Windows обрабатывает два разных файла MSI как один и тот же файл "по определению". Я думаю, что я видел самовосстановление в этих случаях, но вы столкнетесь с множеством других проблем, все одинаково странные. Всегда автоматически генерируйте GUID пакета. Нет никаких причин для двух файлов MSI иметь одинаковый GUID пакета (если вы не тестируете что-то невероятно неясное в Windows Installer Engine). Несмотря на то, что я полностью осознавал проблему дублирования идентификаторов GUID, мне все еще приходилось много лет назад использовать Installshield во время очень напряженной разработки. Я до сих пор удивляюсь, как это произошло на самом деле - но это произошло Возможно, это была неизвестная ошибка в инструменте?
    • Неудачное крупное обновление может оставить две версии вашей установки установленными одновременно. Вы видите две записи в программах добавления / удаления. В этих случаях возможны проблемы с самовосстановлением, но существует множество других проблем. По моему опыту, эта проблема серьезная, но не такая плохая, как использование одного и того же GUID пакета для двух файлов MSI (предыдущий пункт).
    • Я уверен, что есть несколько других способов установки одного и того же продукта несколько раз. Возможно, неудачные преобразования нескольких экземпляров также могут стать причиной проблемы? Мне не нравится эта конкретная концепция, поэтому я на самом деле не пробовал.

Некоторые общие проблемы, связанные с самостоятельным ремонтом, занявшие второе место:

  • Запустите проверку вашего MSI, и некоторые из вышеперечисленных проблем будут помечены и легко устранены.
  • Никогда не запускайте MsiZap.exe на вашем компьютере разработчика или на любой машине, которую вы не можете легко восстановить. На самом деле не используйте этот "инструмент" вообще. Вы часто будете сталкиваться с проблемами самовосстановления при развертывании поверх "грязного состояния", созданного обработкой MsiZap.exe базы данных MSI.
  • Если вам нужно установить расширения оболочки COM, обязательно тщательно протестируйте при использовании Windows Explorer и переключайтесь между различными режимами просмотра, чтобы проверить, включается ли самовосстановление. Подобный COM-объект по существу находится в постоянном использовании, и поэтому самовосстановление очень вероятно (точно), если какие-либо настройки вмешиваются.
  • Если вы добавили рекламируемый ярлык в функцию отдельно, она почти никогда не должна вызывать самовосстановление. Проверка пути к ключу выполняется для функции, в которой находится ярлык, и для всех его родительских функций (последний раз, когда я проверял;-) - это было много лет назад).

Общие советы по WiX / MSI

Ответы, связанные с самостоятельным ремонтом (ссылки для безопасного хранения):

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