WiX - Выполнение основного обновления при установке нескольких экземпляров

Итак, у меня есть служба Windows, которая может иметь несколько экземпляров, установленных на одном сервере. Установщик должен иметь возможность обновить один экземпляр. Установщик использует Instance Transforms, но я не уверен, как получить основные обновления, которые мне бы хотелось.

Для серьезного обновления для работы, я понимаю, что я должен изменить код продукта, поэтому экземпляры определены в этой форме:

<Instance ProductCode="*"
            UpgradeCode="{SOMEGUID}"
            ProductName="Instance 1"
            Id="Instance1"/>

msi можно запустить, чтобы установить новый экземпляр:

msiexec.exe /i "installer.msi" TRANSFORMS=:Instance1 MSINEWINSTANCE=1

Однако после многократного поиска единственным способом, который я нашел для запуска обновления на конкретном экземпляре, является этот формат:

msiexec.exe /i "installer.msi" /n {PRODUCTCODE} REINSTALL=ALL REINSTALLMODE=vamus

Проблема с этим заключается в том, что код продукта автогенерируется для основных обновлений, тогда я не знаю, что это такое, поэтому я не могу перейти к аргументам команды.

Есть ли способ запустить обновление с использованием экземпляра UpgradeCode или InstanceID или ProductCode? Так как оба они останутся статичными. В качестве альтернативы, могу ли я запустить msi без аргументов, выбрать существующий экземпляр (через проверку реестра) в диалоговом окне пользовательского интерфейса и установить соответствующие свойства, чтобы заставить msi перейти в режим обновления для этого экземпляра?

Ответ 1

Вот что я сделал до сих пор для обработки трех отдельных экземпляров:

<InstanceTransforms Property="Upgrade">
  <Instance Id="I01" ProductCode="*"  ProductName="Product Instance 1" UpgradeCode="55a25a09-5979-438d-91dd-67755012a288"/>
  <Instance Id="I02" ProductCode="*" ProductName="Product Instance 2" UpgradeCode="a27eb2e5-9aa8-4d09-b6c0-df717875c310"/>
  <Instance Id="I03" ProductCode="*" ProductName="Product Instance 3" UpgradeCode="d705720d-3703-4b17-817e-bd51edd9abea"/>
</InstanceTransforms>

Пока мое обновление свойств является фиксированным Guid. При этом я могу обрабатывать 3 экземпляра с их обновлениями отдельно, используя эту строку - для новых установок добавьте MSINEINSTANCE = 1-:

msiexec/i MyProduct.msi MSINEWINSTANCE = 1 Transforms = ": I01"

Ответ 2

Довольно уверен, что для этого нужен код продукта, так как код обновления идентифицирует семейство продуктов, а не один.

Запустите PowerShell и запустите эту команду, чтобы получить список установленных продуктов с кодом продукта:

Get-WmiObject -Class win32_product

Вот другой способ получить вывод в табличном формате (IdentifyingNumber - ProductCode):

Get-WmiObject Win32_Product | Format-Table IdentifyingNumber, Name, Version

Вы также можете найти код продукта в таблице свойств скомпилированного MSI, используя Orca (инструмент MSI SDK):

enter image description here