Другая установка В процессе Висит моя установка Wix - PullRequest
0 голосов
/ 03 мая 2018

Я создаю загрузчик установщика WIX (с DisplayInternalUI="yes" в msipackage), но он зависает, когда одновременно происходят другие установки.

Если я запускаю файл MSI самостоятельно, используя msiexec, я получаю ошибку установщика Windows "Another installation is in progress" сообщение (т.е. сообщение об ошибке MSI 1500) - и я предполагаю, что это зависает в моей установке.

Поэтому я вижу, могу ли я заблокировать _MSIExecute mutex сразу после того, как пользователь нажмет кнопку «Установить» (т. Е. До ProgressDlg). Если я могу заблокировать Mutex, то другие установки не выполняются, поэтому можно безопасно приступить к установке (т. Е. На этапе выполнения). Если нет, установщик показывает кнопку отмены (и никаких других кнопок) - поэтому установка не будет продолжена.

Мне было интересно, есть ли способ предотвратить зависание установщика в сообщении об ошибке "Another installation is in progress" (и других сообщениях).

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

ОБНОВЛЕНИЕ : Относительно _MSIExecute Mutex . Внизу приведена техническая информация о проверке текущего состояния установщика Windows с использованием QueryServiceStatusEx . Хит Стюарт предлагает другой способ ( пример кода C ++ ).

Также, некоторые ранее существовавшие, связанные ответы:


Сначала несколько комментариев по данной проблеме (обновление виртуальных машин и ожидающие перезагрузки):

Выполняется обновление Windows : Если вы сталкиваетесь с ситуацией, когда обновления Windows выполняются в фоновом режиме и установки MSI не запускаются, возможно, WiX Запись может зависнуть при проверке того, ожидает ли перезагрузка системы . Я видел подобные проблемы раньше (см. «Технические проблемы» ниже).

Реальное исправление : В этом случае единственное реальное исправление - это позволить обновлениям Windows завершиться, а затем перезагрузиться и сохранить новое состояние виртуальной машины. и затем установите свой пакет. Это единственное вменяемое исправление - на мой взгляд. Не то, что вы хотите услышать: -).

Грязное "исправление" : Полагаю, вы могли бы также остановить службу Центра обновления Windows, чтобы запретить установку обновлений Windows, но я предполагаю, что ваша виртуальная среда в конечном итоге будет заражена вредоносным ПО если вы сделаете это, то у вас возникнет ужасная ситуация, когда вы можете случайно сохранить вредоносное ПО в своей виртуальной машине, которое затем регулярно воскрешается и не обнаруживается программным обеспечением безопасности (которое часто не сканирует виртуалы). Это может быть одним из худших векторов вредоносного ПО из-за сложности его искоренения и обнаружения (в той же категории, что и вредоносные программы на носителях только для чтения, и вредоносные программы, проверенные в системах контроля версий); Избавься от этого). Обоснованный совет (тот, который никогда не нужен - мы все живем в реальности): пожалуйста, не отключайте Windows Update на вашем виртуальном компьютере без должного учета последствий . В масштабах всей корпорации я бы никогда не допустил такого - только в качестве исключений для конкретных пользователей, чьи потребности в тестировании превышают обычные, - а виртуальные устройства регулярно подвергались бы принудительной проверке на вредоносное ПО. Что напоминает мне проверить, какое программное обеспечение безопасности может сканировать офлайн-виртуалы должным образом. Больше исследований, чтобы сделать. Забавно, что написание ответов stackoverflow всегда учит меня тому, что я сам не делаю правильно! Не хорошо: -).

Технические вопросы : Что касается технических аспектов. Ранее я сталкивался с проблемами, когда WiX Burn зависает, потому что он специально пытается избежать установки в обновляемой системе:

Может быть, проверить, скажет ли тот маленький VBScript в связанных ответах (или эквивалентный вызов COM на любом языке, который вы хотите), если система не готова к установке?

The Simple Hack? : Не проверено, но, возможно, вы можете проверить ключ / значение реестра (не уверен, является ли это значением или ключом): HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer : InProgress - он должен присутствовать для обозначения активного сеанса установщика Windows - насколько я знаю. Я думаю, что это лучше, чем пытаться работать с мьютексами и другими основами ОС.

Странно, я не знаю ни о каких вызовах MSI API , которые бы сообщали вам, есть ли активный сеанс установки (установлен мьютекс). Единственное, что я вижу, - это функция Win32 (т.е. не автоматизация COM): MsiBeginTransaction (очень недавнее дополнение к MSI API, только 4.5 up).

Существует также следующее: MSDN: _MSIExecute Mutex - предлагается использовать QueryServiceStatusEx и проверить, является ли значение dwControlsAccepted SERVICE_ACCEPT_SHUTDOWN. Я никогда не пробовал это. Честно говоря, я бы попробовал проверить указанный выше ключ реестра.

0 голосов
/ 06 мая 2018

Если Windows Update является вашей основной задачей, то вы будете использовать API агента Центра обновления Windows, чтобы определить, выполняется ли обновление. Я думаю, что вам нужно запустить его с вашего собственного загрузчика, прежде чем пытаться установить MSI. Общая идея C ++ заключается в следующем:

#include "stdafx.h" 
#include <wuapi.h> 
#include <iostream> 
#include <ATLComTime.h> 
#include <wuerror.h> 
using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
HRESULT hr; 
hr = CoInitialize(NULL); 
IUpdateSession* iUpdate; 
IUpdateSearcher* searcher; 
IUpdateInstaller* iInstaller; 
ISearchResult* results; 
BSTR criteria = SysAllocString(L"IsInstalled=1 or IsHidden=1 or 
IsPresent=1"); 
hr = CoCreateInstance(CLSID_UpdateInstaller, NULL, 
CLSCTX_INPROC_SERVER, IID_IUpdateInstaller, (LPVOID*)&iInstaller); 
VARIANT_BOOL Busy; 
hr = iInstaller->get_IsBusy(&Busy); 

и т. Д.

В основном свойство IsBusy сообщает вам, выполняется ли обновление.

https://msdn.microsoft.com/en-us/library/windows/desktop/aa386502(v=vs.85).aspx

Тема обсуждения здесь:

http://windows -installer-xml-wix-toolset.687559.n2.nabble.com / Windows-Updates-либо находящейся на рассмотрении или выполняющихся-причины-наш-устанавливает, чтобы обанкротиться-td7598536. HTML

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

0 голосов
/ 03 мая 2018

Нет параллелизма MSI : Почему другие установки происходят "одновременно" - или, другими словами, одновременно? Я не слишком подготовлен, когда дело доходит до загрузчиков WiX Burn, но мне интересно, содержит ли рассматриваемый MSI какие-либо пользовательские действия, которые запускают другие установки MSI? Это не разрешено для пакетов MSI. У вас не может быть двух одновременно работающих InstallExecuteSequences. Следовательно, вы не можете запустить MSI из InstallExecuteSequence. Некоторые люди пытаются начать установку с InstallUISequence, что также очень нежелательно по многим причинам - во-первых, он вообще не запускается, когда установка запускается в бесшумном режиме. Я также подозреваю потенциальные проблемы с повышением прав и непредвиденный сбой установки, если вы установите проверочный код завершения для настраиваемого действия и тому подобное. Это всегда переставляет. Основное правило: Пользовательские действия не должны запускать другие установки MSI . Загрузчик WiX Burn в основном специально существует для того, чтобы позволить вам запускать файлы MSI последовательно, а не одновременно, но это еще и еще: это комбинированный загрузчик, компоновщик, загрузчик и т. Д ...

Мьютекс : Сильные слова, но если вы знаете, что хорошо для вас, вы будете держаться подальше от мьютексов MSI. Спасти себя! :-). MSI - это технология, которая дает отпор, и вы будете сражаться с ветряными мельницами по-настоящему, если будете сражаться. Это все, что я могу сказать, чтобы предупредить вас. С этим действительно невозможно справиться, если вы не будете следовать основным правилам, которые в данном случае выполняются одним инсталлятором одновременно. Парни из WiX могли бы справиться с этим - оставить это им - и правильно использовать их инструмент (WiX Burn). Хотя технические детали мне неясны, в них наверняка будут реализованы функции, позволяющие выполнять именно то, что вы описываете (проверьте, готова ли система к установке).

Приостановленная установка : Возможно также, что в вашей системе есть приостановленная установка, которую необходимо отменить, прежде чем вы сможете вообще установить файлы MSI. Можете ли вы попробовать установить другой файл MSI и посмотреть, правильно ли он работает? Я не уверен на 100%, что это правильная ссылка, но вы также можете попробовать: Исправить проблемы, которые блокируют установку или удаление программ .

...