ОБНОВЛЕНИЕ : Относительно _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
. Я никогда не пробовал это. Честно говоря, я бы попробовал проверить указанный выше ключ реестра.