Мне нужно найти 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
Краткая версия
Приведенная ниже информация значительно расширилась со временем и, возможно, стала слишком подробной. Как быстро получить коды товаров? (четыре подхода):
Использовать Powershell "one-liner"
.Прокрутите вниз для просмотра скриншотов и пошаговых действий. Отказ от ответственности также ниже - незначительные или умеренные риски в зависимости от того, кого вы спросите. У меня работает нормально. Любое самовосстановление, вызванное этой опцией, обычно можно отменить. Однако проверки целостности пакета, которые запускаются, добавляют некоторый "шум" в журнал событий. Примечание!
IdentifyingNumber
являетсяProductCode
(особенность WMI).
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
Использовать VBScript
Поиск реестра
Некоторые клянутся, что ищут нужные вещи в реестре. Я не рекомендую такой подход - мне нравится обращаться к соответствующим API (или другими словами: к вызовам функций ОС). Всегда есть странные исключения, объясняемые только внутренними особенностями API-реализации:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall
Оригинальный 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 - например, реальные брандмауэры, программные брандмауэры сторонних производителей, программы безопасности различных видов и т.д.). Будет ли это работать или нет, зависит от вашей точной настройки.
PowerShell требует установки .NET framework (в настоящее время, кажется, версия 3.5.1? Октябрь, 2017). Само приложение PowerShell может также отсутствовать на машине, даже если .NET установлен. Наконец, я считаю, что PowerShell может быть отключен или заблокирован различными системными политиками и привилегиями. Если это так, вы можете попробовать несколько других способов получения кодов продуктов. Я предпочитаю использовать VBScript - он быстрый и гибкий (но также может быть заблокирован на некоторых машинах, а написание сценариев всегда немного сложнее, чем использование инструментов).
wbemtest.exe
.wbemtest.exe
(удерживая клавишу Windows, нажмите R, отпустите клавишу Windows, введите "wbemtest.exe" и нажмите OK).SELECT IdentifyingNumber,Name,Version FROM Win32_Product
и нажмите "Use" (или эквивалент - инструмент будет локализован).WMIExplorer.exe
.SELECT IdentifyingNumber,Name,Version FROM Win32_Product
и нажмите Execute.msiinfo.csv
.' 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-файле (или в исходном файле. используемого для компиляции 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. Если вы знаете, пожалуйста, отредактируйте и добавьте подробности здесь.
Похожие темы (для справки и легкого доступа - я должен почистить этот список):
Если у вас слишком много установщиков, чтобы легко найти то, что вы ищете, вот 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