Как заставить установщик не перезагружаться после ремонта?

У меня есть установщик, написанный на Wix, который иногда предлагает пользователю перезагрузиться после восстановления. Как это может произойти и как убрать такое поведение?


person Brainless    schedule 15.07.2015    source источник
comment
Задайте политику ведения журнала, и восстановление будет записываться в %temp%, в файл с именем MSI‹шестнадцатеричная строка›.log. support.microsoft.com/en-us/kb/223300   -  person PhilDW    schedule 15.07.2015


Ответы (3)


Две техники:

1) Определите причину перезагрузки и избегайте ее. (Примеры: остановить службу, убить процесс)

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

1, как правило, лучший способ пойти.

person Christopher Painter    schedule 15.07.2015
comment
Что может вызвать перезагрузку? - person Brainless; 15.07.2015
comment
Обычно это заблокированный файл, поэтому зачем останавливать процессы, которые могут иметь блокировки файлов. - person Christopher Painter; 16.07.2015
comment
Почему восстановление может быть неэффективным до перезагрузки? Мой установщик только развертывает некоторые файлы и записывает ключи реестра. В этом случае безопасно ли использовать свойство REBOOT? - person Brainless; 16.07.2015
comment
Если установщику нужно восстановить заблокированный файл, а старый файл был неправильным, а новый файл правильным, то новый файл будет доступен только после перезагрузки. Я предлагаю прочитать о функции Win32 MoveFile и шаблоне PendingFileRenameOperations. - person Christopher Painter; 16.07.2015
comment
Итак, если я правильно понимаю: если файл заблокирован (обычно из-за того, что он используется другим процессом), установщик будет использовать шаблон PendingFileRenameOperations, чтобы файл был восстановлен после перезагрузки. Поэтому установщик просит пользователя перезагрузиться, чтобы правильно заменить файл. Так при чем здесь Win32 MoveFile? Использует ли установщик его, чтобы попытаться переместить старый файл в другое место, а затем переместить новый в нужное место? - person Brainless; 16.07.2015
comment
Поймите, что MSI является декларативным. Они абстрагируют то, что должно быть сделано, от того, как это делается. Последнее очень редко документируется, так как вам не нужно знать. Предположительно стандартные действия InstallFiles и MoveFiles используют MoveFileEx с аргументом MOVEFILE_DELAY_UNTIL_REBOOT. Вы можете выполнить поиск этих двух слов в StackOverflow, чтобы узнать, как часто они встречаются. - person Christopher Painter; 16.07.2015

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

person Shadoninja    schedule 15.07.2015
comment
Вы хотите искать следующие типы сообщений: msdn .microsoft.com/en-us/library/aa369779(v=vs.85).aspx - person Christopher Painter; 16.07.2015
comment
Также довольно часто люди имеют ScheduleReboot в настройках для принудительной перезагрузки после первой установки, но они забывают обусловить это, и поэтому это происходит при каждом ремонте. - person PhilDW; 16.07.2015

Добавьте это свойство в соответствующее место в файле WXS и убедитесь, что ничто не переопределяет его значение для чего-то другого. Это приведет к тому, что приглашение на перезагрузку не появится и перезагрузка не произойдет, даже если она была определена как необходимая при работе в автоматическом режиме, так как приглашения на автоматическую перезагрузку автоматически запускают последовательность перезагрузки, если вы не установите этот параметр. значение свойства на "ReallySuppress".

<Property Id="REBOOT" Value="ReallySuppress" />

Вы можете прочитать об этом здесь, если хотите: https://msdn.microsoft.com/en-us/library/windows/desktop/aa371101

person kayleeFrye_onDeck    schedule 01.11.2017
comment
›› Добавьте это свойство в соответствующее место в файле WXS ‹‹ Я обнаружил, что мне нужно определить это свойство как дочерний элемент Продукта после того, как был определен элемент Пакет. - person david.barkhuizen; 06.04.2018