Есть ли альтернатива GUID при использовании msiexec для удаления приложения?
В настоящее время мы используем GUID для идентификации приложения при запуске нашего сценария удаления, который содержит msiexec. Проблема, с которой я сталкиваюсь, заключается в том, что GUID меняется каждый раз, когда я устанавливаю последнюю версию приложения, поэтому мне было интересно, есть ли другой способ идентифицировать наше приложение, работающее с использованием msiexec?
3 ответа
Обычный способ обойти различные значения ProductCode в этой ситуации - начать с более постоянного кода UpgradeCode.
Используя UpgradeCode, вы можете использовать MsiEnumRelatedProducts (или сценарий или эквивалент взаимодействия MSI) для возврата ProductCode. Подобный код, как правило, никогда не нужно менять.
Я уверен, что PowerShell должен быть в состоянии сделать это.
Прежде всего: это нормально, что GUID продукта изменяется для новых версий приложения, хотя также возможно обновить некоторые приложения без изменения GUID продукта (называемого незначительными обновлениями - в отличие от крупных обновлений, которые изменяют GUID продукта). То, что обычно остается стабильным между различными выпусками одного и того же продукта, это UpgradeCode (он определяет семейство связанных продуктов). Код продукта уникально идентифицирует продукт (в определенной версии).
Ниже перечислены некоторые варианты удаления. Удаление файла MSI из командной строки без использования msiexec.
Я полагаю, вы могли бы использовать имя файла MSI, как показано в section 3
или если имя продукта остается стабильным, вы можете использовать его вместе с автоматизацией, чтобы найти правильный GUID продукта для удаления соответствующего продукта. Я проверю это через мгновение и обновлю ответ.
ОБНОВЛЕНИЕ: образец VBScript для удаления продукта по "имени продукта" (при условии, что он остается постоянным в разных выпусках, что обычно происходит, но нет никакой гарантии - это зависит от продукта).
Найдите название продукта в разделе "Установка и удаление программ" или используйте крошечный VBScript, указанный в нижней части этого ответа, чтобы экспортировать небольшой текстовый файл с информацией для всех установленных пакетов.
' On Error Resume Next ' Used to suppress errors
Const msiUILevelNone = 2
Const msiUILevelFull = 5
Const msiInstallStateAbsent = 2
Set installer = CreateObject("WindowsInstaller.Installer")
Set products = installer.ProductsEx("", "", 7)
installer.UILevel = msiUILevelFull ' Running with full GUI (if available in MSI)
' installer.UILevel = msiUILevelNone ' Will run uninstall silently, run script with admin rights
' Get the product name from the user
productname = InputBox("Please enter the product name for the MSI package you wish to uninstall:")
If productname = vbCancel Or Trim(productname) = "" Then
WScript.Quit(0)
End If
' Iterate over all MSI packages on the box
For Each product In products
currentproduct = product.InstallProperty("ProductName")
If LCase(currentproduct) = LCase(productname) Then
installer.ConfigureProduct product.productcode, 0, 2 ' msiInstallStateAbsent
MsgBox "Ran uninstall for: " & currentproduct
Exit For ' End product iteration, assuming only one product needed uninstall
End If
Next
Set installer = Nothing
MsgBox "Finished."
ОБНОВЛЕНИЕ: Вы можете создать себе быстрый список кодов продуктов и названий продуктов, используя VBScript, как описано в нижней части этого ответа: Как я могу найти GUID продукта установленной установки MSI?, Этот конкретный VBScript настолько прост, насколько это возможно, я думаю.
Что вы знаете, что не меняется, или что меняется, но вы можете легко отслеживать?
Скажем, код продукта меняется, а код обновления - нет. Вы можете следовать советам PhilDW, чтобы получить код продукта из этого кода обновления, используя MsiEnumRelatedProducts или Installer.Related или эквивалентный.
Скажите, что имя не остается прежним. Вы можете следовать рекомендациям Stein, чтобы найти код продукта по названию продукта, начиная с MsiEnumProductsEx или Installer.ProductsEx или эквивалентного.
Скажем, вы кешируете локальную копию установочного MSI-файла в неизменном месте или ту, которую легко найти по вашему сценарию. Вы можете следовать предложению 4c74356b41 использовать этот путь в командной строке для msiexec. (Обратите внимание, что msiexec /x принимает либо путь к пакету, либо код продукта.)
Скажем, вам не нравится ни один из этих вариантов. Возможно, вы можете добавить значение реестра в HKEY_LOCAL_MACHINE\Software\YourCompany\YourProduct, установив строковое значение ProductCode в
[ProductCode]
, Тогда вы можете использоватьreg query HKLM\Software\YourCompany\YourProduct /v ProductCode
или эквивалент (извините, я тупица с PowerShell), чтобы получить текущий код продукта. (По крайней мере, если вы учитываете 32-битные или 64-битные пути, конечно.)