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

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

Мне нужно найти GUID продукта для установленного файла MSI, чтобы выполнить обслуживание, такое как patching, uninstall ( как удалить) и также для auditing purposes.

4b9b3361

Ответ 1

Для получения кода обновления: как найти код обновления для установленного файла MSI?


Укороченная версия

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

1. Use the Powershell "one-liner"

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

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

Быстрый запуск Powershell: удерживайте Windows key, нажмите R, введите "powershell" и нажмите Enter

2. Use VBScript

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

3. Registry Lookup

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

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
  • HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall

4. Original MSI File/WiX Source

Product Code можно найти в Property table любого файла MSI (а также любого другого свойства). Однако GUID может быть (редко) может быть переопределен преобразованием, применяемым во время установки, и, следовательно, не совпадать с GUID, под которым зарегистрирован продукт (подход 1 и 2, приведенный выше, сообщит о реальном коде продукта - который зарегистрирован в Windows - в таком случае редкие сценарии).

Вам нужен инструмент для просмотра файлов MSI. В нижней части следующего ответа приведен список бесплатных инструментов, которые вы можете загрузить (или см. Быстрый вариант ниже): Как я могу сравнить содержимое двух (или более) файлов MSI?

ОБНОВЛЕНИЕ: Для удобства и необходимости в скорости :-), загрузите SuperOrca без промедления и возитесь с этой горячей ссылкой для прямой загрузки - инструмент достаточно хорош, чтобы выполнить работу - установите, откройте MSI и перейдите прямо к таблице свойств и найдите ProductCode (пожалуйста, всегда проверяйте вирус на прямую ссылку для прямой загрузки - очевидно, вы можете использовать virustotal.com для этого - онлайн-сканирование с использованием десятков антивирусных и вредоносных программ для сканирования того, что вы загружаете).

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


А ниже вы найдете оригинальный ответ, который "органически вырос" во многих деталях.

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


Получить коды продуктов

ОБНОВЛЕНИЕ: Если вам также нужен код обновления, проверьте ответ: Как найти код обновления для установленного файла MSI? (извлекает связанные коды продуктов, коды обновлений и названия продуктов из таблицы - аналогично приведенному ниже).

  • Не можете использовать PowerShell? Смотрите раздел "Альтернативные инструменты" ниже.
  • Хотите удалить? См. Раздел "Удаление пакетов MSI" ниже.

Запустите Powershell (удерживая нажатой клавишу Windows, нажмите "R", отпустите клавишу Windows, введите "powershell" и нажмите "ОК") и выполните приведенную ниже команду, чтобы получить список установленных кодов продуктов пакета MSI, а также путь к пакету локального кэша и название продукта (разверните окно PowerShell, чтобы избежать усеченных имен).

Перед запуском этой командной строки, пожалуйста, прочитайте выражение об отказе от ответственности ниже (ничего опасного, только некоторые потенциальные неудобства). Раздел 3 в разделе "Альтернативные инструменты" показывает альтернативный способ не-WMI, чтобы получить ту же информацию, используя VBScript. Если вы пытаетесь удалить пакет, есть раздел ниже с некоторыми примерами командных строк msiexec.exe:

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

Вывод должен быть похож на это:

enter image description here

Заметка! По какой-то странной причине "Код продукта" упоминается как "Идентификационный номер" в WMI. Другими словами, на рисунке выше IdentifyingNumber - код продукта.

Если вам нужно выполнить этот запрос удаленно для большого количества удаленных компьютеров, см. Раздел "Получение кодов продуктов с удаленного компьютера" ниже.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ (важно, пожалуйста, прочитайте перед запуском команды!): Из-за странного дизайна Microsoft любой WMI-вызов Win32_Product (например, команда PowerShell ниже) вызовет проверку состояния пакета. Помимо того, что это довольно медленно, это может в редких случаях вызвать самовосстановление MSI. Это может быть небольшой пакет или что-то огромное - например, Visual Studio. В большинстве случаев этого не происходит, но есть риск. Не запускайте эту команду прямо перед важной встречей - она не опасна (она доступна только для чтения), но в очень редких случаях может привести к длительному ремонту (я думаю, что вы также можете отменить самовосстановление - если это не будет активно предотвращено рассматриваемым пакетом, но он будет перезапущен, если вы снова вызовете Win32_Product, и это будет продолжаться до тех пор, пока вы не дадите завершить самовосстановление - иногда это может продолжаться, даже если вы дадите этому завершиться: как определить причины повторения Самостоятельный ремонт установщика Windows?).

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

Вы также можете получить вывод в виде списка (вместо таблицы):

get-wmiobject -class Win32_Product

В этом случае вывод похож на это:

enter image description here


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

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

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

Это может работать, если вы работаете с правами администратора домена в соответствующем домене. В среде рабочей группы (небольшой офис/домашняя сеть) вам, вероятно, придется добавить учетные данные пользователя непосредственно в вызовы WMI, чтобы это работало.

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

ОБНОВЛЕНИЕ: В этом ответе можно найти подробный раздел об удаленном запуске WMI: Как найти код обновления для установленного файла MSI? , Похоже, правило брандмауэра и подавление запроса UAC с помощью настройки реестра могут заставить работать вещи в сетевой среде рабочей группы. Не рекомендуется вносить изменения в отношении безопасности, но это сработало для меня.


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

PowerShell требует установки .NET Framework (в настоящее время в версии 3.5.1, кажется, октябрь 2017 г.). Само приложение PowerShell также может отсутствовать на компьютере, даже если установлен .NET. Наконец, я считаю, что PowerShell может быть отключен или заблокирован различными системными политиками и привилегиями.

Если это так, вы можете попробовать несколько других способов получить коды продуктов. Моя предпочтительная альтернатива - VBScript - он быстрый и гибкий (но также может быть заблокирован на определенных машинах, и сценарии всегда немного более сложны, чем использование инструментов).

  1. Начнем со встроенного средства Windows WMI: wbemtest.exe.

    • Запустите wbemtest.exe (удерживая клавишу Windows, нажмите "R", отпустите клавишу Windows, введите "wbemtest.exe" и нажмите "ОК").
    • Нажмите " Подключиться", затем нажмите " ОК" (по умолчанию для пространства имен - root\cimv2) и снова нажмите " Подключиться ".
    • Нажмите " Запрос " и введите следующую команду WQL (SQL вкус): SELECT IdentifyingNumber,Name,Version FROM Win32_Product и нажмите "Использовать" (или эквивалентный - инструмент будет локализован).
    • Пример выходного скриншота (усеченный). Не самое хорошее форматирование, но вы можете получить нужные данные. IdentifyingNumber - это код продукта MSI:

wbemtest.exe

  1. Затем вы можете попробовать пользовательский, более полнофункциональный инструмент WMI, такой как WMIExplorer.exe

    • Это не входит в Windows. Однако это очень хороший инструмент. Рекомендуемые.
    • Проверьте это по адресу: https://github.com/vinaypamnani/wmie2/releases
    • Запустите инструмент, нажмите "Подключить", дважды щелкните "ROOT\CIMV2".
    • На вкладке " Запрос " введите следующий запрос SELECT IdentifyingNumber,Name,Version FROM Win32_Product и нажмите "Выполнить".
    • Скриншот пропущен, приложение требует слишком много экранного пространства.
  2. Наконец, вы можете попробовать VBScript для доступа к информации через интерфейс автоматизации MSI (основная функция Windows - она не связана с WMI).

    • Скопируйте приведенный ниже скрипт и вставьте его в файл *.vbs на рабочем столе и попробуйте запустить его, дважды щелкнув. Ваш рабочий стол должен быть записан для вас, или вы можете использовать любое другое место для записи.
    • Это не очень хороший VBScript. Краткость предпочтительнее обработки ошибок и полноты, но она должна выполнять работу с минимальной сложностью.
    • Выходной файл создается в папке, из которой вы запускаете скрипт (папка должна быть доступна для записи). Выходной файл называется msiinfo.csv.
    • Дважды щелкните файл, чтобы открыть его в приложении для работы с электронными таблицами, выберите запятую в качестве разделителя при импорте - ИЛИ - просто откройте файл в Блокноте или любом средстве просмотра текста.
    • Открытие в электронной таблице позволит расширенные функции сортировки.
    • Этот скрипт может быть легко адаптирован для отображения значительного количества дополнительной информации об установке MSI. Демонстрацию этого можно найти здесь: как узнать, какие продукты установлены - на более новых продуктах уже установлены окна MSI.
' 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) ИЛИ функции установщика MSI C++ (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): Удаление файла MSI из командной строки без использования msiexec. Существует множество различных способов удаления.

Если вы пишете командный файл, пожалуйста, посмотрите раздел 3 в приведенном выше ответе для нескольких распространенных и стандартных вариантов удаления из командной строки.

И быстрая ссылка на msiexec.exe (параметры командной строки) (обзор командной строки для msiexec.exe из MSDN). И версия Technet также.


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

ОБНОВЛЕНИЕ: пожалуйста, найдите новый ответ о том, как найти код обновления для установленных пакетов вместо того, чтобы вручную искать код в файлах MSI. Для установленных пакетов это гораздо надежнее. Если пакет не установлен, вам все равно нужно найти файл MSI (или исходный файл, использованный для компиляции MSI), чтобы найти код обновления. Оставляя в старом разделе ниже:

Если вы хотите получить UpgradeCode или другие свойства MSI, вы можете открыть кэшированный установочный MSI для продукта из местоположения, указанного в " LocalPackage " на изображении, показанном выше (что-то вроде: C:\WINDOWS\Installer\50c080ae.msi - это шестнадцатеричное имя файла, уникальное для каждой системы). Затем вы просматриваете " Таблицу свойств " для UpgradeCode (возможно, что UpgradeCode может быть переопределен в преобразовании - чтобы быть уверенным, что вы получите правильное значение, необходимое для программного извлечения кода из системы - я предоставлю сценарий для это в ближайшее время. Тем не менее, UpgradeCode, найденный в кэшированном MSI, как правило, является правильным).

Чтобы открыть кэшированные файлы MSI, используйте Orca или другой инструмент для упаковки. Вот обсуждение различных инструментов (любой из них подойдет): Какой установочный продукт использовать? InstallShield, WiX, Wise, Advanced Installer и т. Д. Если у вас не установлен такой инструмент, вам лучше всего попробовать Super Orca (он прост в использовании, но не был тщательно протестирован мной).

ОБНОВЛЕНИЕ: вот новый ответ с информацией о различных бесплатных продуктах, которые вы можете использовать для просмотра файлов MSI: Как я могу сравнить содержимое двух (или более) файлов MSI?

Если у вас установлена Visual Studio, попробуйте Orca-x86_en-us.msi поиск Orca-x86_en-us.msi - в разделе Program Files (x86) - и установите его (это Microsoft, официальный просмотрщик и редактор MSI). Затем найдите Orca в меню "Пуск". Иди раз в кратчайшие сроки :-). Технически Orca устанавливается как часть Windows SDK (не Visual Studio), но Windows SDK входит в комплект установки Visual Studio. Если у вас не установлена Visual Studio, возможно, вы знаете кого-то, кто делает? Просто попросите их найти этот MSI и отправить вам (это крошечный файл размером в половину мегабайта) - это займет у них несколько секунд. ОБНОВЛЕНИЕ: вам нужно несколько файлов CAB, а также MSI - они находятся в той же папке, где находится MSI. Если нет, вы всегда можете загрузить Windows SDK (он бесплатный, но он большой - и все, что вы установите, замедлит работу вашего ПК). Я не уверен, какая часть SDK устанавливает MSI Orca. Если вы делаете, пожалуйста, просто отредактируйте и добавьте детали здесь.



Подобные темы (для справки и легкого доступа - я должен очистить этот список):

Ответ 2

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

$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