Установщик Windows: избегайте использования FileinUse при установке пакета

Если когда-либо существует обновление для файлов, которые необходимо заменить существующими, и если один из файлов используется каким-либо из процессов, то появляется всплывающее диалоговое окно "Используемый файл". Я хочу избегать этого диалогового окна. и поставьте этот файл в очередь для установки, чтобы его можно было установить во время перезагрузки системы. Я прочитал, что очередь файлов для обновления во время перезагрузки является встроенной функциональностью установщика Windows. Может кто-нибудь предложить мне способ удалить это диалоговое окно FileInUse. Я попытался установить для свойства "MsiRMFilesInUse" значение "0", но это не сработало.

3 ответа

Решение

"Короткий ответ

По сути: вы могли бы 1) работать совершенно бесшумно (подавляет диалог использования файлов), 2) корректно завершать блокировку приложений (обновление приложения, позволяющее корректно завершать работу - с поддержкой или без поддержки менеджера перезапуска), 3) обеспечить надлежащий сервисный контроль (если речь идет об услугах), 4) принудительное уничтожение запущенных процессов ("подход кувалдой"), 5) прервать настройку, если обнаружены блокировки, 6) требовать выхода из системы перед развертыванием, 7) установить в новую папку для каждой версии (параллельная установка) и т.д...

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

С точки зрения вашей актуальной проблемы. Я бы не стал связываться с FileInUse dialog(s), Это действительно не решит вашу проблему. Может быть, рассмотрим эти указатели:

  • Службы: если вы устанавливаете службы и они вызывают проблемы с файлами, обратитесь к разделу, посвященному службам, чтобы определить, можете ли вы улучшить логику настройки.
  • Режим без вывода сообщений: запуск вашей установки в режиме без вывода сообщений был бы очевидным способом подавления таких диалоговых окон при использовании файлов, но тогда вам придется отключить автоматическую перезагрузку, иначе система самопроизвольно перезагрузится без предупреждения. Подробности ниже.
  • Политика: Пожалуйста, проверьте, включена ли политика DisableAutomaticApplicationShutdown на вашей коробке / стандартной конфигурации ПК. Подробности смотрите ниже.
    • Расположение реестра: HKLM\Software\Policies\Microsoft\Windows\Installer,
    • Я не уверен, что включение этой политики приведет к исчезновению диалоговых окон используемых файлов.
  • Соответствие Restart Manager: возможно, проверьте, следует ли обновлять ваше приложение, чтобы учитывать дизайн функции Restart Manager - чтобы позволить автоматическое обновление без проблем, когда приложения корректно закрываются (при условии, что вы имеете дело с двоичными файлами, которые вы можете изменить) самостоятельно - другими словами: у вас есть исходный код). Много деталей ниже.
  • "Setup Overkill": если вы считаете безопасным убивать ваше приложение без пощады во время обновлений, см. Раздел по этому вопросу ниже.
  • Настраиваемое действие постепенного завершения работы: если вы делаете приложение способным к постепенному завершению работы (в стиле перезапуска в стиле менеджера), то вы также можете инициировать такое завершение самостоятельно (проще всего для процессов в контексте пользователя) с помощью настраиваемого действия немедленного режима (в случае, если перезапуск диспетчера отключено политикой - обратите внимание на проблемы с таймингом и тайм-аутом - особенно для тихого запуска - "тупик").
  • Установка бок о бок: некоторые детали ниже. Некоторые компании решают устанавливать приложения по-настоящему бок о бок, поэтому в их новых развертываниях не возникает проблем с перезаписью файлов (удаление старых версий может по-прежнему вызывать необходимые перезагрузки).

Я полагаю, вы также можете прервать установку, если обнаружены заблокированные файлы, или вы можете потребовать, чтобы пользователи вышли из системы до запуска установки - если у вас есть система распространения.

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


Перезагрузить менеджер

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


Restart Manager: это новый API в стиле C, доступный начиная с Windows Vista и Windows Server 2008. Restart Manager состоит из одной DLL, которую приложения могут загружать для доступа к API Restart Manager. Идея заключается в том, что Restart Manager автоматически закроет и перезапустит ваши приложения во время установки / обновления, если приложение / служба будут следовать ряду рекомендаций:

По сути: The whole idea is basically to prefer restarting applications rather than restarting the OS, С этой целью: 1) Ваше приложение звонит RegisterApplicationRestart() с командной строкой, указанной для его возможного перезапуска - он "регистрируется" для управления перезапуском. 2) Ваше приложение следит за WM_QUERYENDSESSION сообщения и выключается, изящно сохраняя данные соответствующим образом, когда сказано сделать это. 3) Затем Restart Manager может перезапустить приложение после завершения установки (перезагрузка может быть отключена).

Более технические вещи:


Конфигурация диспетчера перезапуска: существует ряд свойств, которые влияют на работу диспетчера перезапуска с установщиком Windows:

  • MSIRESTARTMANAGERCONTROL - используйте диспетчер перезапуска или диалог FileInUse
  • MSIDISABLERMRESTART - перезапустить или не перезапускать закрытые приложения
  • MSIRMSHUTDOWN - выключение, принудительное выключение или не принудительное выключение

Когда используется Restart Manager, вместо диалога FileInUse используется диалоговое окно MsiRMFilesInUse для отображения списка приложений, которые заблокировали файлы.

NB! Вся функция Restart Manager также может быть отключена политикой:


FileInUse

Если у вас нет времени или ресурсов для реализации надлежащей совместимости с Restart Manager (что, откровенно говоря, является единственной разумной вещью, на которую вы тратите свои ресурсы на данном этапе разработки Windows), то есть несколько вещей, которые могут быть полезны для знать:

  • Тихая установка: первая очевидная вещь, на которую следует обратить внимание, это то, что не будет FileInUse диалоговое окно, если вы устанавливаете установку в автоматическом режиме. Однако это может вызвать перезагрузку системы, если вы не укажете REBOOT=ReallySuppress property,
  • Службы. Устанавливаете ли вы службы, которые не были правильно закрыты во время обновления? Есть built-in MSI constructs в shut down services во время обновлений - таблица Service Control.
    • При правильном использовании эта функция ServiceControl означает, что у вас больше не будет проблем с исполняемыми файлами службы, инициирующими перезагрузку для замены (за исключением проблем с завершением работы в самой службе).
    • Это встроенная конструкция MSI, которая хорошо работает при правильном использовании. Люди не должны прибегать к пользовательским действиям для установки сервисов.
  • Поддержка приложений. Помимо взаимодействия с Restart Manager, некоторые приложения, в которых используются файлы, могут корректно завершать работу, когда им это требуется.
    • Некоторые приложения правильно закрываются при отправке командной строки, например App.exe -shutdown несмотря на то, что он не был написан для взаимодействия с менеджером перезапуска. Может быть, приложения в системном трее, которые не сохраняют данные для пользователя?
    • Это, очевидно, должно быть реализовано специально для рассматриваемого приложения - и если вы это сделаете, вам следует вместо этого использовать Диспетчер перезапуска (или дополнительно вы могли бы вызывать одну и ту же фактическую реализацию завершения работы).
  • "Избыточная установка": некоторые настройки предназначены только для уничтожения процессов приложения, открытых во время установки.
  • REINSTALLMODE: Возможно, вы используете REINSTALLMODE="amus" принудительно перезаписать файлы во время установки?
    • Это может значительно увеличить количество используемых файлов и запросы на перезагрузку, поскольку все файлы пытаются заменить - и, как правило, излишне - особенно в repair а также modify сценарии.
    • Это особенно верно для установок, которые устанавливают службы, которые не используют таблицу ServiceControl должным образом, чтобы завершить работу службы перед попыткой перезаписать ее двоичный файл.
  • Параллельная установка ( SO): добавив это для справки, это выходит за рамки того, что "обычно актуально". Этот подход требует большого количества технических изменений и правильных процессов распространения, чтобы быть успешным - это в первую очередь для внутренних, основных корпоративных приложений (возможен полный контроль приложений) - на мой взгляд.
    • Новые версии, предназначенные для новых папок установки (добавить номер версии в папку установки?), Как правило, могут устанавливаться без каких-либо проблем с перезаписью файлов (если только не обновляются какие-либо системные файлы - в этом случае вы должны разделить их на отдельный предварительный MSI - со своей собственной логикой распространения - когда требуется - что должно быть редко).
    • Удаление более старой версии может по-прежнему вызывать требования перезагрузки, поскольку файлы могут использоваться и не готовы к удалению. Очевидно.
    • Вы можете использовать автоматические идентификаторы GUID для компонентов установки, чтобы MSI правильно отслеживала их отдельно. Как правило, вы должны исключить все необходимость установки статических компонентов (или они должны быть установлены в общих местах и ​​сохранены статичными - или обновляться через отдельный обязательный MSI при необходимости).
    • Все приложение должно быть "хорошо себя вести" для параллельного использования и установки. Другими словами, не нужно бороться с файловыми ассоциациями, правильно загружать все ресурсы и управлять соединениями с базой данных, которые могут быть разделены между экземплярами и т. Д.
    • Вы добавляете номер версии в ярлык меню "Пуск"? Каким-то образом вы должны быть в состоянии различать установки и запускать нужную версию - очевидно. Приложение должно знать о своих двойниках?
    • Я мог бы рассмотреть возможность установки нового кода обновления для каждого выпуска, чтобы отделить продукты друг от друга, а затем использовать систему распространения для удаления более старых, устаревших версий (как пакетное задание выходного дня или ежемесячного пакета?). Это не обязательно на 100%, все зависит от вашего сценария. Многие вещи могут работать, когда спланировано согласованно - очевидно.
    • Приложения, не подходящие для нормальной параллельной работы, иногда могут быть виртуализированы и помещены в "песочницу" с использованием App-V (виртуальных пакетов), чтобы позволить различным версиям сосуществовать в одном и том же блоке. Новые испытания.

Некоторые дополнительные ссылки:

Предполагая, что вы являетесь автором пакета, я бы предложил следовать нормам, которые должны использовать диалог MsiRMFilesInUse. Но если вы все равно хотите попытаться что-то отключить, начните с понимания руководства для авторов пакетов по использованию установщика Windows с Restart Manager:

  • Добавьте диалоговое окно MsiRMFilesInUse в ваш пакет. Если в пакете присутствует диалоговое окно MsiRMFilesInUse, пользователю Windows Vista, выполняющему установку на уровне пользовательского интерфейса с полным пользовательским интерфейсом, предоставляется возможность автоматически закрывать и перезапускать приложения. Установочный пакет может содержать информацию как для диалогового окна MsiRMFilesInUse, так и для диалогового окна FilesInUse. Диалоговое окно MsiRMFilesInUse отображается только в том случае, если пакет установлен как минимум с Windows Installer 4.0 в Windows Vista, и в противном случае игнорируется. Существующие пакеты, у которых нет диалогового окна MsiRMFilesInUse, продолжают функционировать с помощью диалогового окна FilesInUse. Преобразование настройки можно использовать для добавления диалогового окна MsiRMFilesInUse к существующим пакетам. Конечные пользователи обычно запускают установки на уровне пользовательского интерфейса Full UI. Установки базового пользовательского интерфейса или уровня с уменьшенным пользовательским интерфейсом дают пользователю возможность использовать диспетчер перезапуска для сокращения перезапусков системы, даже если диалоговое окно MsiRMFilesInUse отсутствует. При установке в режиме без вывода сообщений пользовательский интерфейс всегда закрывает приложения и службы, а в Windows Vista всегда используется Restart Manager.

    :::

  • Авторы пакетов могут основывать условие в таблице LaunchCondition на свойстве MsiSystemRebootPending, чтобы предотвратить установку своего пакета при ожидании перезапуска системы.

  • Авторы и администраторы пакетов могут контролировать взаимодействие установщика Windows и менеджера перезапуска с помощью свойств MSIRESTARTMANAGERCONTROL, MSIDISABLERMRESTART, MSIRMSHUTDOWN и политики DisableAutomaticApplicationShutdown.

настройка MSIRESTARTMANAGERCONTROL=Disable возможно удаление диалоговых окон FilesInUse и MsiRMFilesInUse из вашего пакета и, при необходимости, внесение изменений в дальнейшие настройки, обсуждаемые при перезагрузке системы(такие как установкаREBOOTили жеREBOOTPROMPT свойства) может иметь эффект, который вы хотите.

Если вы не являетесь автором пакета, вы, вероятно, спрашиваете не на том форуме. Политика DisableAutomaticApplicationShutdown звучит так, как будто она может выполнять большую часть того, что вы описываете, и будет применяться ко всем пакетам, установленным на вашем компьютере. Он предназначен для использования системными администраторами вместо авторов пакетов. Кроме того, вы можете создавать преобразования (или указывать свойства в командной строке установки) для эффективного изменения пакета, как это сделал бы автор пакета.

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

  1. Свойство MsiRMFilesInUse отсутствует, поэтому его установка не оказывает никакого влияния.

  2. Свойство MSIRESTARTMANAGERCONTROL указывает Windows, использовать ли старое поведение FilesInUse или новые методы обнаружения перезапуска FilesInUse диспетчера перезапуска. Он не отключает обнаружение поведения файлов при использовании, это просто переключение между старыми и новыми методами. Поскольку методы обнаружения различаются, вы можете увидеть различное поведение в зависимости от того, какие файлы фактически используются (старые методы обнаруживают только приложения с открытыми окнами).

  3. Вы должны сказать, какой инструмент вы используете для создания своего файла MSI, потому что они имеют разные возможности. Установки Visual Studio практически не поддерживают автоматическое выключение, за исключением того, что если вы устанавливаете службы с помощью классов установщика, то ваш метод удаления может быть расширен, чтобы остановить службу во время удаления. Если вы используете WiX, тогда есть возможности util::CloseApplication.

  4. Поддерживаемый метод завершения работы Windows заключается в интеграции ваших приложений с Restart Manager, и у Stein есть ссылки. Для сервисов об этом заботится "нормальная" установка службы с MSI ServiceInstall/ServiceControl, но не для проектов установки Visual Studio с классами установщика.

Наконец, создайте подробный журнал MSI и найдите записи об использовании, обычно с ошибкой 1603 (вариант использования файла, а не вариант сбоя установки). Вам может не понадобиться этот журнал, если в диалоговых окнах сообщается о приложениях, которые необходимо закрыть, поэтому просто сконцентрируйтесь на том, как остановить их при обновлении, потому что это лучшее решение, а не попытка подавить поведение Windows по умолчанию.

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