Как предотвратить неоднозначный сбой vc_redist.x##. Exe (VS2017) из-за ожидающей перезагрузки?

TL;DR Каков здравый способ автоматизировать запуск VS 2017 vc_redist когда вызывается в цепочке из нескольких инсталляторов?


Распространяемый установщик Visual C++, который MS предоставляет для VS 15.x (VS 2017), а именно для обоих (14.15.26706 - VS 15.8.4)):

  • vc_redist.x86.exe
  • vc_redist.x64.exe

Как часть нашей полной установки продукта, я должен запустить несколько установщиков vcredist (также старых версий) в режиме без вывода сообщений.

Проблема в том, что эти установщики откажутся от установки, если перезагрузка ожидает (например, "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager" - PendingFileRenameOperations).

При вызове этих установщиков с vc_redist /q, они даже вызовут немедленную перезагрузку системы. Это можно исправить, вызвав их /q /norestart, тем не мение:

При звонке vc_redist /q /norestart и если перезагрузка ожидает этого установщика, он вернет код выхода MSI 3010 что указывает на необходимость перезагрузки.

Тем не менее, AFAIK, этот код выхода также указывает, что эта самая установка требует перезагрузки для завершения.

Актуальный вопрос

Итак, я не могу определить, был ли этот установщик успешным и просто требует перезагрузки в самом конце моей последовательности установки (я устанавливаю другие компоненты до и после) - или же установщик фактически отказался что-либо делать, и мне нужно будет перезапустить системы и запустите этот установщик снова!

Как я могу назвать этот vc_redist в цепочке различных сторонних установщиков и

  • в идеале требуется только одна перезагрузка в самом конце
  • по крайней мере, определить, успешно ли он установлен.

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

Не уверен, что эти helkp с вопросом, но ради полноты.

  • Графический интерфейс установщика четко указывает, что происходит: (извините, немецкий Windows)

Всплывающее окно

Резюме / Закрыть / Перезагрузить

  • Это встроенный установщик InnoSetup для нашего "набора продуктов", который будет использоваться клиентами, порядок установки выглядит следующим образом:

    1. Запустите MSVC 2005 (VC8) 32-битный vcredist
    2. Запустите MSVC 2010 (VC10) 32-битный vcredist
    3. Запустите MSVC 2017 (VC141) 64-битный vcredist
    4. Запустите MSVC 2017 (VC141) 32-битный vcredist
    5. Запустите несколько сторонних установщиков зависимостей / библиотек
    6. Установите актуальные файлы приложения (через InnoSetup)
    7. Перезагрузитесь (спросите), если какой-либо установщик указал на необходимость перезагрузки.

Как вы можете видеть из этой последовательности, перезагрузка после каждого vcredist будет безумной, и, к счастью, кажется, что только redist 2017 демонстрирует это неудачное поведение до сих пор.

Примечательно: все мои пробные запуски на моей машине разработчика начались с перезагрузки, уже ожидающей "шага 0", и оба установщика VC2005 и VC2010 работают очень хорошо (что подтверждается их прогрессом в графическом интерфейсе), даже если перезагрузка еще не была выполнена. Это установщики VC2017, которые отказываются делать что-либо, если ожидается перезагрузка.

2 ответа

Пакеты MSU: после декомпиляции vc_redist.x64.exe - который является комплектом WiX - используя эту команду:

dark.exe -x Extract vc_redist.x64.exe

Я обнаружил, что пакет устанавливает: Обновление для Universal C Runtime в Windows - KB2999226. Этот компонент состоит из файлов Центра обновления Windows (*.msu - используется Центром обновления Windows), а не только файлы MSI. Я подозреваю, что они могут быть спроектированы так, чтобы требовать перезагрузки, прежде чем разрешить установку, но у меня нет доказательств.

Предложение: Запустите проверку, чтобы убедиться, что KB2999226 установлен. Как это сделать? Я не знаю вызов Win32, но ребята из WiX, вероятно, будут знать. Вот еще несколько предложений.


Фактические файлы Центра обновления Windows (со временем эти имена файлов могут измениться, поскольку новые версии этого установщика с именем файла без версии - vc_redist.x64.exe - освобождены):

  • Windows6.0-KB2999226-x64.msu
  • Windows6.1-KB2999226-x64.msu
  • Windows8.1-KB2999226-x64.msu
  • Windows8-RT-KB2999226-x64.msu

Другими словами для Vista, Windows 7, Windows 8 и др. Различные серверные ОС. В Windows 10 этот компонент встроен.

Корпоративное развертывание: в корпоративной среде я бы развернул эти *.msu файлы через механизм распространения доступны - что бы это ни было - например, SCCM - перед установкой vc_redist.x64.exe пакет.

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

Честно говоря, это основные компоненты SOE, на мой взгляд. Я не знаю, почему Microsoft хранит эти среды выполнения вне основной установки ОС. Они имеют решающее значение для большинства программного обеспечения.


Описание подхода декомпиляции с использованием инструментария WiX dark.exe Двоичный файл можно найти здесь: Как я могу сравнить содержимое двух (или более) файлов MSI?

Строго говоря, ошибка 3010 - результат успеха. Это означает, что установка завершена, но требует перезагрузки. Я ничего не знаю о том, что это означает, что установка не началась вообще. Типичное "не будет установлено, если перезагрузка ожидает" - результат использования условия запуска, основанного на свойстве MsiSystemRebootPending. Сбои из-за этого условия запуска не возвращают результат 3010 - они обычно возвращают ошибку 1602 как своего рода ошибку "отмены пользователем".

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