Как найти GUID продукта установленной MSI-установки?

Мне нужно найти product GUID для установленного MSI-файла, чтобы выполнить обслуживание, такое как патч, деинсталляция (how-to uninstall), а также для аудиторских целей.

Решение

Для получения кода обновления: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095

Краткая версия

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

  1. Использовать Powershell "one-liner".

    Прокрутите вниз для просмотра скриншотов и пошаговых действий. Отказ от ответственности также ниже - незначительные или умеренные риски в зависимости от того, кого вы спросите. У меня работает нормально. Любое самовосстановление, вызванное этой опцией, обычно можно отменить. Однако проверки целостности пакета, которые запускаются, добавляют некоторый "шум" в журнал событий. Примечание! IdentifyingNumber является ProductCode (особенность WMI).

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

Быстрый запуск Powershell: удерживайте клавишу Windows, нажмите R, введите "powershell" и нажмите Enter 2. Использовать VBScript

Описан ниже в разделе "Альтернативные инструменты" (раздел 3). Этот вариант может быть более безопасным, чем Powershell, по причинам, подробно описанным ниже. По сути, он (намного) быстрее и не способен вызвать самовосстановление MSI, поскольку не проходит через WMI (он обращается к MSI COM API напрямую - с молниеносной скоростью). *Однако он более трудоемок, чем вариант с Powershell (несколько строк кода). 3. Поиск реестра

Некоторые клянутся, что ищут нужные вещи в реестре. Я не рекомендую такой подход - мне нравится обращаться к соответствующим API (или другими словами: к вызовам функций ОС). Всегда есть странные исключения, объясняемые только внутренними особенностями API-реализации:

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
  • HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall
  1. Оригинальный MSI файл / WiX Source

    Вы можете найти Код продукта в Таблице свойств любого MSI файла (а также любое другое свойство). Однако GUID может быть переопределен (редко) преобразованием, применяемым во время установки, и, следовательно, не соответствовать GUID, под которым зарегистрирован продукт (подходы 1 и 2, описанные выше, сообщают реальный код продукта, зарегистрированный в Windows, в таких редких случаях). Вам нужен инструмент для просмотра файлов MSI. Список бесплатных инструментов, которые можно загрузить, см. в нижней части следующего ответа (или см. быстрый вариант ниже): https://stackoverflow.com/questions/48482545/how-can-i-compare-the-content-of-two-or-more-msi-files/48482546#48482546. ОБНОВЛЕНИЕ: Для удобства и потребности в скорости :-), скачайте SuperOrca без промедления и суеты с этой прямой ссылки - инструмент достаточно хорош для выполнения работы - установите, откройте MSI и перейдите прямо к таблице свойств и найдите строку ProductCode (всегда проверяйте на вирусы прямые ссылки - очевидно - вы можете использовать virustotal.com для этого - онлайн проверка с использованием десятков антивирусных и вредоносных программ для проверки того, что вы загружаете).

    Orca - это собственный инструмент Microsoft', он устанавливается с Visual Studio и Windows SDK. Попробуйте найти Orca-x86_en-us.msi - в разделе Program Files (x86) и установите MSI, если найдете.

    А ниже вы найдете оригинальный ответ, который "органично разросся" до множества деталей. Возможно, вы увидите раздел "Установка MSI-пакетов" ниже, если вам нужно выполнить именно эту задачу.

    Получение кодов продуктов

    UPDATE: Если вам также нужен код обновления, проверьте этот ответ: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095 (извлекает связанные коды продуктов, коды обновления и названия продуктов в таблицу, аналогичную приведенной ниже).

    • Не можете использовать PowerShell? См. раздел "Альтернативные инструменты" ниже.
    • Нужна деинсталляция? См. раздел "Деинсталляция MSI-пакетов" ниже. Запустите Powershell (удерживая клавишу Windows, нажмите R, отпустите клавишу Windows, введите "powershell" и нажмите OK) и выполните команду ниже, чтобы получить список установленных пакетов MSI коды продуктов вместе с путем к локальному кэш-пакету и названием продукта (увеличьте окно PowerShell, чтобы избежать усеченных имен). Перед запуском этой командной строки, пожалуйста, прочитайте приведенный ниже отказ от ответственности (ничего опасного, просто некоторые потенциальные неудобства). В разделе 3 в разделе "Альтернативные инструменты" показан альтернативный способ получения той же информации с помощью VBScript, не связанный с WMI. Если вы пытаетесь удалить пакет, ниже есть раздел с примерами командных строк msiexec.exe:
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

вывод должен быть примерно таким: *Примечание! По какой-то странной причине "Код продукта"* в WMI называется "Идентификационный номер". Другими словами, на рисунке выше IdentifyingNumber является ProductCode. Если вам нужно запустить этот запрос удаленно для множества удаленных компьютеров*, смотрите раздел "Retrieve Product Codes From A Remote Computer*" ниже.

ОТВЕТСТВЕННОЕ ЗАЯВЛЕНИЕ (важно, пожалуйста, прочитайте перед выполнением команды!): Из-за странного дизайна Microsoft, любой вызов WMI к ``Win32_Product'' (например, команда PowerShell, приведенная ниже) вызовет оценку владения пакета. Помимо того, что это достаточно медленно, в редких случаях это может > вызвать MSI. вызвать самовосстановление MSI. Это может быть небольшой пакет или что-то огромный - например, Visual Studio. В большинстве случаев этого не происходит, но существует риск. Не запускайте эту команду прямо перед важной встречей - это не опасно (она доступна только для чтения), но может привести к долгому восстановлению в очень редких случаях (я думаю, вы можете отменить самовосстановление также - если оно активно не предотвращается данным пакетом, но оно перезапустится, если вы вызовете Win32_Product снова, и это будет продолжаться, пока вы не позволите самовосстановлению завершиться - иногда оно может продолжаться, даже если вы позволите ему завершиться: https://stackoverflow.com/questions/5501028/how-can-i-determine-what-causes-repeated-windows-installer-self-repair/6066263#6066263).

И просто для записи: некоторые люди сообщают, что их журналы событий заполняются записями MsiInstaller EventID 1035 (см. ответ Code Chief'a) - по-видимому, это вызвано WMI-запросами к классу Win32_Product (лично я никогда такого не видел). Это *не напрямую связано с командой Powershell, предложенной выше, это в контексте общего использования WIM класса Win32_Product. Вы также можете получить результат в виде списка (вместо таблицы):

get-wmiobject -class Win32_Product

В этом случае вывод будет выглядеть следующим образом:

Получение кодов продуктов с удаленного компьютера

Теоретически вы должны иметь возможность указывать имя удаленного компьютера в самой команде. Вот та же команда, что и выше, запущенная на машине "RemoteMachine" (добавлена секция ``-ComputerName RemoteMachine''):

get-wmiobject Win32_Product -ComputerName RemoteMachine | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

Это может сработать, если вы работаете с правами администратора домена в соответствующем домене. В среде рабочей группы (малый офис / домашняя сеть) вам, вероятно, придется добавить учетные данные пользователя непосредственно в вызовы WMI, чтобы заставить его работать. Кроме того, на удаленные соединения в WMI влияют (как минимум) Windows Firewall, настройки DCOM и User Account Control (UAC) (плюс любые дополнительные факторы, не связанные с Microsoft - например, реальные брандмауэры, программные брандмауэры сторонних производителей, программы безопасности различных видов и т.д.). Будет ли это работать или нет, зависит от вашей точной настройки.

  • Настройка удаленного подключения к WMI
  • Удаленное подключение к WMI с помощью PowerShell UPDATE: Обширный раздел об удаленном запуске WMI можно найти в этом ответе: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095. Похоже, что правило брандмауэра и подавление запроса UAC с помощью твика реестра может заставить все работать в сетевой среде рабочей группы. Не рекомендуется вносить изменения с точки зрения безопасности, но для меня это сработало.

    Альтернативные инструменты

    PowerShell требует установки .NET framework (в настоящее время, кажется, версия 3.5.1? Октябрь, 2017). Само приложение PowerShell может также отсутствовать на машине, даже если .NET установлен. Наконец, я считаю, что PowerShell может быть отключен или заблокирован различными системными политиками и привилегиями. Если это так, вы можете попробовать несколько других способов получения кодов продуктов. Я предпочитаю использовать VBScript - он быстрый и гибкий (но также может быть заблокирован на некоторых машинах, а написание сценариев всегда немного сложнее, чем использование инструментов).

  1. Начнем с встроенного в Windows WMI инструмента: wbemtest.exe.
  • Запустите wbemtest.exe (удерживая клавишу Windows, нажмите R, отпустите клавишу Windows, введите "wbemtest.exe" и нажмите OK).
  • Нажмите подключиться, затем OK (пространство имен по умолчанию - root\cimv2), затем снова нажмите "подключиться".
  • Нажмите "Query" и введите эту WQL-команду (SQL flavor): SELECT IdentifyingNumber,Name,Version FROM Win32_Product и нажмите "Use" (или эквивалент - инструмент будет локализован).
  • Пример выходного скриншота (усеченный). Не самое приятное форматирование, но вы можете получить необходимые данные. IdentifyingNumber - код продукта MSI:
  1. Далее, вы можете попробовать использовать пользовательский, более полнофункциональный инструмент WMI, такой как WMIExplorer.exe.
  • Он не входит в состав Windows. Однако это очень хороший инструмент. Рекомендуется.
  • Проверьте его на сайте: https://github.com/vinaypamnani/wmie2/releases.
  • Запустите инструмент, нажмите Connect, дважды щелкните ROOT\CIMV2
  • На вкладке "Query" введите следующий запрос SELECT IdentifyingNumber,Name,Version FROM Win32_Product и нажмите Execute.
  • Скриншот пропущен, приложение требует слишком много площади экрана.
  1. Наконец, вы можете попробовать VBScript для доступа к информации через интерфейс автоматизации MSI (основная функция Windows - она не связана с WMI).
  • Скопируйте приведенный ниже сценарий и вставьте его в файл *.vbs на рабочем столе, а затем попробуйте запустить его двойным щелчком мыши. Ваш рабочий стол должен быть доступен для записи, или вы можете использовать любое другое доступное для записи место.
  • Это не лучший VBScript. Терпкость была предпочтительнее, чем обработка ошибок и полнота, но он должен выполнять работу с минимальной сложностью.
  • Выходной файл создается в папке, из которой вы запускаете сценарий (папка должна быть доступна для записи). Выходной файл называется msiinfo.csv.
  • Дважды щелкните файл, чтобы открыть его в программе для работы с электронными таблицами, выберите запятую в качестве разделителя при импорте - ИЛИ - просто откройте файл в Блокноте или любой программе для просмотра текста.
  • Открытие в электронной таблице позволит расширить возможности сортировки.
  • Этот сценарий можно легко адаптировать, чтобы показать значительное количество дополнительных деталей об установке MSI. Демонстрацию этого можно найти здесь: https://stackoverflow.com/questions/28963089/how-to-find-out-which-products-are-installed-newer-product-are-already-install/28971679#28971679.
' 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

На данный момент я не могу придумать других вариантов общего назначения для получения кодов товаров, пожалуйста, добавьте, если знаете. Просто отредактируйте в строке, а не добавляйте слишком много комментариев, пожалуйста.

Вы, конечно, можете получить доступ к этой информации из вашего приложения. вызывая интерфейс автоматизации MSI (на базе COM) ИЛИ C++ функции установщика MSI (Win32 API). Или даже использовать WMI-запросы из приложения, как это сделано в примерах выше с помощью PowerShell, wbemtest.exe или WMIExplorer.exe.

Деинсталляция MSI-пакетов

Если вы хотите удалить MSI-пакет, для которого вы нашли код продукта, вы можете сделать это следующим образом, используя увеличенную командную строку (найдите cmd.exe, щелкните правой кнопкой мыши и запустите от имени администратора): Вариант 1: Основная, интерактивная деинсталляция без ведения журнала (быстро и просто):

msiexec.exe /x {00000000-0000-0000-0000-00000000000C}

Быстрое объяснение параметров:

/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall

Вы также можете включить (подробное) протоколирование и работать в тихом режиме, если хотите, что приводит нас к варианту 2: Вариант 2: Тихая деинсталляция с подробным протоколированием (лучше для пакетных файлов):

msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" REBOOT=ReallySuppress

Быстрое объяснение параметров:

/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall
/QN = run completely silently
/L*V "C:\My.log"= verbose logging at specified path
REBOOT=ReallySuppress = avoid unexpected, sudden reboot

Здесь есть полный справочник по деинсталляции MSI (различные способы деинсталляции MSI-пакетов): https://stackoverflow.com/questions/450027/uninstalling-an-msi-file-from-the-command-line-without-using-msiexec/1055933#1055933. Существует множество различных способов деинсталляции. Если вы пишете пакетный файл, пожалуйста, посмотрите раздел 3 в вышеупомянутом ответе по ссылке для нескольких распространенных и стандартных вариантов командной строки деинсталляции. И краткая ссылка на msiexec.exe (параметры командной строки) (обзор командной строки для msiexec.exe из MSDN). А также версия Technet.

Получение других свойств / информации MSI (например, код обновления)

ОБНОВЛЕНИЕ: пожалуйста, найдите новый ответ о том, как найти код обновления для установленных пакетов вместо ручного поиска кода в файлах MSI. Для установленных пакетов это гораздо надежнее. Если пакет не установлен, вам все равно придется искать в MSI-файле (или в исходном файле. используемого для компиляции MSI), чтобы найти код обновления. Оставляем в более старом разделе ниже: Если вы хотите получить UpgradeCode или другие свойства MSI, вы можете открыть кэшированный установочный MSI для продукта из места, указанного "LocalPackage" на изображении выше (что-то вроде: C:\WINDOWS\Installer\50c080ae.msi - это шестнадцатеричное имя файла, уникальное для каждой системы). Затем вы смотрите в таблице "Property table" на UpgradeCode (возможно, UpgradeCode переопределен в трансформации - чтобы быть уверенным, что вы получите правильное значение, вам нужно получить код программно из системы - я предоставлю скрипт для этого в ближайшее время. Однако код обновления, найденный в кэшированном MSI, обычно является правильным). Чтобы открыть кэшированные файлы MSI, используйте Orca или другой инструмент упаковки. Вот обсуждение различных инструментов (подойдет любой из них): https://stackoverflow.com/questions/1544292/what-installation-product-to-use-installshield-wix-wise-advanced-installer/1546941#1546941. Если у вас не установлен такой инструмент, то лучше всего попробовать Super Orca (он прост в использовании, но не тестировался мной). UPDATE: вот новый ответ с информацией о различных бесплатных продуктах, которые можно использовать для просмотра файлов MSI: https://stackoverflow.com/questions/48482545/how-can-i-compare-the-content-of-two-or-more-msi-files/48482546#48482546 Если у вас установлена Visual Studio, попробуйте найти Orca-x86_en-us.msi в разделе Program Files (x86) и установить его (это собственная, официальная программа просмотра и редактирования MSI от Microsoft). Затем найдите Orca в меню "Пуск". Время пройдёт мгновенно :-). Технически Orca устанавливается как часть Windows SDK (не Visual Studio), но Windows SDK поставляется в комплекте с Visual Studio. Если у вас нет установленной Visual Studio, возможно, вы знаете кого-то, у кого она установлена? Просто попросите их найти этот MSI и отправить вам (это крошечный файл размером в полмиллибайта) - это займет у них несколько секунд. UPDATE: вам понадобится несколько CAB-файлов, а также MSI - их можно найти в той же папке, где находится MSI. Если нет, вы всегда можете скачать Windows SDK (он бесплатный, но большой - и все, что вы установите, будет замедлять работу вашего компьютера). Я не уверен, какая часть SDK устанавливает Orca MSI. Если вы знаете, пожалуйста, отредактируйте и добавьте подробности здесь.

Комментарии (6)

Если у вас слишком много установщиков, чтобы легко найти то, что вы ищете, вот powershell для создания фильтра и сужения списка по отображаемому имени.

$filter = "*core*sdk*"; (Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall).Name | % { $path = "Registry::$_"; Get-ItemProperty $path } | Where-Object { $_.DisplayName -like $filter } | Select-Object -Property DisplayName, PsChildName
Комментарии (0)