Wix FindRelatedProducts нашел продукт, который не установлен - PullRequest
1 голос
/ 22 апреля 2019

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

Я выполнил msi с журналами, затем обнаружил, что FindRelatedProducts найден GUID и заполнено свойство WIX WIX_UPGRADE_DETECTED.

часть журнала:

FindRelatedProducts: Found application: {MY-GUID}
MSI (c) (24:8C) [07:21:36:885]: PROPERTY CHANGE: Adding WIX_UPGRADE_DETECTED property. Its value is '{MY-GUID}'.

Поскольку я использую WIX_UPGRADE_DETECTED для выбора с помощью диалогового окна (Установить или обновить), чтобы показать, оно показывает диалоговое окно обновления, но продукт не установлен.

Если я тестирую на другом компьютере, выполняя тот же сценарий, FindRelatedProducts не находит продукт, что является правильным случаем.

Я подозреваю, что какая-то запись в реестре Windows (regedit) не была очищена. Вы знаете, как Wix обнаруживает FindRelatedProducts? Или почему Wix заполняет WIX_UPGRADE_DETECTED без установленного продукта?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 22 апреля 2019

Установщик Windows имеет регистрацию распространения о реестре.Он предоставляет API для анализа этой регистрации.В этом случае вы хотите :: MsiEnumRelatedProducts () .Вы получите все продукты, связанные с этим UpgradeCode.

Затем вы можете удалить эти продукты, выполнив:

msiexec /x {PRODUCT-CODE-GUID}

Вы увидите, что {PRODUCT-CODE-GUID} совпадает с тем, что выотредактировано как {MY-GUID}.

Примечание. Это не имеет ничего общего с набором инструментов WiX.Поведение установщика Windows на 100% (иначе: MSI).

1 голос
/ 22 апреля 2019

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

Из командной строки ( Ключ Windows + Нажмите R + Тип: cmd.exe + Введите ) и выполните следующую команду:

msiexec.exe /x {GUID-FROM-LOG-FILE}

Идентификатор GUID (наиболее вероятный) из вашего файла журнала: WIX_UPGRADE_DETECTED.Затем попробуйте установить снова.

Failing Uninstall : Если удаление завершится неудачно, попробуйте запустить этот инструмент Microsoft FixIt .Иногда он может отсортировать настройки, которые не удаляются должным образом. Альтернатива, под капотом починка (не рекомендуется).


UpgradeTable : Первое, что я хотел бы сделать, эточтобы проверить, что находится в UpgradeTable в скомпилированном файле MSI, который показывает проблему.Код обновления там совпадает с кодом обновления для вашей установки?(UpgradeCode entry в Property Table).

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


Удаление : Теперь, как избавиться от проблемы установки?Вам нужно получить GUID ProductCode.Есть множество способов получить эту информацию. Это должен быть GUID продукта, который вы видите в журнале MSI для WIX_UPGRADE_DETECTED, поэтому попробуйте сначала:

msiexec.exe /x {GUID}

Вот ответ на удаление MSIнастройки в общем смысле (всевозможные варианты - читать?): Удаление MSI-файла из командной строки без использования msiexec .


ProductCode (GUID) : Роб уже упомянул правильный MSI API для перечисления установленных продуктов, я просто добавлю, что у меня есть этот ответ, который может помочь: Как мне найти GUID продуктаустановленной установки MSI? В ней перечислены несколько параметров, чтобы увидеть, что установлено на вашем устройстве.

VBScript / COM Automation : я просто добавлюПараметр VBScript из первой ссылки выше (в этом связанном ответе перечислены несколько параметров):

' Retrieve all ProductCodes (with ProductName and ProductVersion)
Set fso = CreateObject("Scripting.FileSystemObject")
Set output = fso.CreateTextFile("msiinfo.csv", True, True)
Set installer = CreateObject("WindowsInstaller.Installer")

On Error Resume Next ' we ignore all errors

For Each product In installer.ProductsEx("", "", 7)
   productcode = product.ProductCode
   name = product.InstallProperty("ProductName")
   version=product.InstallProperty("VersionString")
   output.writeline (productcode & ", " & name & ", " & version)
Next

output.Close

PowerShell : также добавляется параметр PowerShell.В некоторых случаях это может привести к неожиданному самовосстановлению.

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
0 голосов
/ 23 апреля 2019

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

Они находятся в следующем месте:

 - HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\UpgradeCodes\{OTHER-GUID}
 - HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\{OTHER-GUID}

Обратите внимание, что {OTHER-GUID} - это не код моего продукта, а сгенерированный, код моего продукта является одним из значений, присутствующих в этих записях реестра.

Простое их удаление заставляет мой установщик снова работать.

Tks @ stein-Åsmul эта команда: get-wmiobject Win32_Product очень полезна.

0 голосов
/ 22 апреля 2019

FindRelatedProducts выполняется установщиком Windows, а не WiX.Ваше утверждение о том, что поведение некорректно, скорее всего, неверно.У вас грязная машина, а у MSI есть артефакты, указывающие, что она установлена.Ваша другая машина чиста и не чиста.

...