Как я могу найти GUID продукта установленной установки MSI?
Мне нужно найти GUID продукта для установленного файла MSI, чтобы выполнить обслуживание, такое как исправление, удаление, а также для целей аудита.
5 ответов
Укороченная версия
Информация ниже значительно выросла со временем и, возможно, стала слишком сложной. Как быстро получить коды продуктов? (четыре подхода):
1. Используйте Powershell "один вкладыш"
Прокрутите вниз для скриншота и шаг за шагом. Отказ от ответственности также ниже - незначительные или умеренные риски в зависимости от того, кого вы спрашиваете. Работает хорошо для меня. Любой самовосстановление, вызванное этой опцией, как правило, можно отменить. Сработавшие проверки целостности пакета добавляют некоторый "шум" журнала событий. Примечание 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
4. Оригинальный файл MSI / источник WiX
Вы можете найти Product Code
в Property table
любого файла MSI (и любого другого свойства). Однако GUID может быть (редко) может быть переопределен преобразованием, применяемым во время установки, и, следовательно, не совпадать с GUID, под которым зарегистрирован продукт (подход 1 и 2, приведенный выше, сообщит о реальном коде продукта - который зарегистрирован в Windows - в таком случае редкие сценарии).
Вам нужен инструмент для просмотра файлов MSI. В нижней части следующего ответа приведен список бесплатных инструментов, которые вы можете загрузить (или см. Быстрый вариант ниже): Как я могу сравнить содержимое двух (или более) файлов MSI?
ОБНОВЛЕНИЕ: Для удобства и необходимости в скорости:-), загрузите SuperOrca без промедления и возитесь с этой горячей ссылкой для прямой загрузки - инструмент достаточно хорош, чтобы выполнить свою работу - установите, откройте MSI и перейдите прямо к таблице свойств и найдите ProductCode
строка (пожалуйста, всегда проверяйте вирус на прямую ссылку для прямой загрузки - очевидно - вы можете использовать http://www.virustotal.com/ для этого - онлайн-сканирование с использованием десятков антивирусных и вредоносных программ для сканирования того, что вы загружаете).
А ниже вы найдете оригинальный ответ, который "органически вырос" во многих деталях.
Возможно, смотрите раздел " Удаление пакетов 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
Вывод должен быть похож на это:
Заметка! По какой-то странной причине "Код продукта" упоминается как "Идентификационный номер" в 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
В этом случае вывод похож на это:
Получить коды продуктов с удаленного компьютера
Теоретически вы должны просто указать имя удаленного компьютера как часть самой команды. Вот та же команда, что и выше, настроенная для запуска на машине "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 - он быстрый и гибкий (но также может быть заблокирован на определенных машинах, и сценарии всегда немного более сложны, чем использование инструментов).
Давайте начнем со встроенного инструмента Windows WMI:
wbemtest.exe
,- запуск
wbemtest.exe
(Удерживая нажатой клавишу Windows, нажмите "R", отпустите клавишу Windows, введите "wbemtest.exe" и нажмите "ОК"). - Нажмите " Подключиться", затем " ОК" (по умолчанию для пространства имен - root\cimv2) и снова нажмите " Подключиться ".
- Нажмите " Запрос " и введите эту команду WQL (SQL вкус):
SELECT IdentifyingNumber,Name,Version FROM Win32_Product
и нажмите "Использовать" (или эквивалентный - инструмент будет локализован). - Пример выходного скриншота (усеченный). Не самое хорошее форматирование, но вы можете получить необходимые данные. IdentifyingNumber - это код продукта MSI:
- запуск
Затем вы можете попробовать пользовательский, более полнофункциональный инструмент WMI, такой как
WMIExplorer.exe
- Это не входит в Windows. Однако это очень хороший инструмент. Рекомендуемые.
- Проверьте это по адресу: https://github.com/vinaypamnani/wmie2/releases
- Запустите инструмент, нажмите "Подключить", дважды щелкните "ROOT\CIMV2".
- На вкладке " Запрос " введите следующий запрос
SELECT IdentifyingNumber,Name,Version FROM Win32_Product
и нажмите Выполнить. - Скриншот пропущен, приложение требует слишком много экранного пространства.
Наконец, вы можете попробовать 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), чтобы найти код обновления. Оставляя в старом разделе ниже:
Если вы хотите получить Upgrade Code или другие свойства MSI, вы можете открыть кэшированный установочный MSI для продукта из местоположения, указанного в " LocalPackage " на изображении, показанном выше (что-то вроде: C:\WINDOWS\Installer\50c080ae.msi
- это шестнадцатеричное имя файла, уникальное для каждой системы). Затем вы смотрите в " Таблице свойств " для UpgradeCode (возможно, что Upgrade Code может быть переопределен в преобразовании - чтобы быть уверенным, что вы получите правильное значение, необходимое для программного извлечения кода из системы - я предоставлю сценарий для это в ближайшее время. Тем не менее, Upgrade Code, найденный в кэшированном MSI, как правило, является правильным).
Чтобы открыть кэшированные файлы MSI, используйте Orca или другой инструмент для упаковки. Вот обсуждение различных инструментов (подойдет любой из них): Какой установочный продукт использовать? InstallShield, WiX, Wise, Advanced Installer и т. Д. Если у вас не установлен такой инструмент, вам лучше всего попробовать Super Orca (он прост в использовании, но я не тестировал его всесторонне).
ОБНОВЛЕНИЕ: вот новый ответ с информацией о различных бесплатных продуктах, которые вы можете использовать для просмотра файлов MSI: Как я могу сравнить содержимое двух (или более) файлов MSI?
Если у вас установлена Visual Studio, попробуйте поискать 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. Если вы это сделаете, пожалуйста, просто отредактируйте и добавьте детали здесь.
- Вот более полная статья по вопросу удаления MSI: Удаление файла MSI из командной строки без использования msiexec
- Вот аналогичная статья с несколькими дополнительными опциями для извлечения информации MSI с использованием реестра или кэшированной MSI: Найти GUID из файла MSI?
Подобные темы (для справки и легкого доступа - я должен очистить этот список):
- Как найти Upgrade Code и Product Code установленного приложения в Windows 7
- Как я могу найти код обновления для установленного приложения в C#?
- Wix: как удалить ранее установленное приложение, которое установлено с помощью другого установщика
- WiX - значительное обновление при установке нескольких экземпляров
- как узнать, какие продукты установлены - на более новый продукт уже установлены окна MSI (с использованием VBScript)
- Как удалить с помощью msiexec, используя идентификатор продукта, без MSI-файла
- Найти GUID пакета MSI
У меня недостаточно очков репутации, чтобы ответить Штейну Асмулу напрямую, может быть, кто-то может написать ему, но вот однострочный скрипт powershell, который я адаптировал из решения VBScript, который я нашел более надежным, чем существующий однострочник powershell, особенно при работе без прав администратора, и это намного быстрее
$Installer = New-Object -ComObject WindowsInstaller.Installer; $InstallerProducts = $Installer.ProductsEx("", "", 7); $InstalledProducts = ForEach($Product in $InstallerProducts){[PSCustomObject]@{ProductCode = $Product.ProductCode(); LocalPackage = $Product.InstallProperty("LocalPackage"); VersionString = $Product.InstallProperty("VersionString"); ProductPath = $Product.InstallProperty("ProductName")}} $InstalledProducts
Совет: измените 7 на 3, чтобы найти программы, которые устанавливаются для каждого пользователя, а не для всей машины.
Если у вас слишком много установщиков, чтобы легко найти то, что вы ищете, вот несколько 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
Существует также очень полезный инструмент с графическим интерфейсом под названием Product Browser, созданный Microsoft или, по крайней мере, сотрудником Microsoft.
Его можно найти на Github здесь Product Browser
Лично мне было очень легко найти нужный мне GUID.
Вы можете взглянуть на MSI Finder. Он позволяет искать продукты или компоненты по имени, идентификатору GUID или местоположению, просматривать их свойства, а также восстанавливать или удалять отдельные продукты.
Отказ от ответственности: я искал похожее решение, но не нашел ничего надежного или простого в использовании. Итак, я разработал этот инструмент.