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

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


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

Ответ 1

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


Общие рекомендации по WiX/MSI. отрываться от оригинального ответа на общие проблемы MSI: Как избежать типичных ошибок проектирования в моем решении для развертывания WiX/MSI?


Краткое резюме

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


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

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


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

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

  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 и переключайтесь между различными режимами просмотра, чтобы проверить, включается ли самовосстановление. Подобный COM-объект по существу находится в постоянном использовании, и поэтому самовосстановление очень вероятно (точно), если какие-либо настройки мешают.
  • Если вы добавили рекламируемый ярлык в функцию отдельно, она почти никогда не должна вызывать самовосстановление. Проверка пути к ключу выполняется для функции, в которой находится ярлык, и для всех его родительских функций (последний раз, когда я проверял ;-) - это было много лет назад).

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