Найти GUID из файла MSI - программирование

Найти GUID из файла MSI

Как я могу указать GUID установленной программы в Windows? Кроме того, проще ли найти GUID, если у меня есть файл MSI?

Я просматриваю файл MSI с помощью Orca, но не знаю, где искать GUID.

Спасибо!

4b9b3361

Ответ 1

Три основных GUID базы данных установщика Windows: Код пакета, ProductCode и UpgradeCode. Первый хранится в сводном потоке информации (меню "Вид" в Orca), а остальные хранятся в таблице "Свойства". (Другие формы баз данных, такие как модули слияния и патчи, имеют похожие GUID в аналогичных местах, такие как GUID модуля слияния или GUID кода патча, каждый из которых хранится одинаково с кодом пакета.)

Чтобы найти их на машине, вы можете посмотреть в разделе "Удалить", где часто используется ProductCode. Или еще лучше, если вы хотите перечислить, что в настоящее время установлено на машине, вы можете вызвать MsiEnumProducts.

Ответ 2

Существует несколько способов найти GUID продукта для установленных пакетов. Пожалуйста, выберите вариант номер 3.

Наиболее распространенными являются:

  • Проверьте реестр под следующими базовыми путями, используя regedit.exe. Найдите имя приложения (или просто просмотрите каждую подпапку до тех пор, пока не найдете ее). Когда вы его найдете, вы можете передать его в msiexec.exe:
- 32-BIT SECTION:

 HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
 HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall (per user section)
- 64-BIT SECTION:

 HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
- MERGED SECTION (supposedly all of the above merged together, I have not verified):

 HKCR\Installer\Products
  1. Проверьте локальный кешированный MSI-пакет в % SystemRoot%\Installer. Это кешированная версия оригинальной MSI, которая изначально использовалась для установки продукта на вашем компьютере.
    • Вам понадобится инструмент, способный открывать файлы MSI. Вот список и сравнение возможностей: Какой установочный продукт использовать? InstallShield, WiX, Wise, Advanced Installer и т.д..
    • MSI - это скрытая база данных MS SQL, вы также можете открыть ее с помощью любого совместимого средства просмотра данных MS SQL.
    • Бесплатный инструмент MSI " Orca" из Windows SDK является предпочтительным для этой простой задачи поиска данных. Это быстро, мало и надежно.
    • Затем следуйте рекомендациям Майкла Урмана из его ответа выше, и найдите код пакета в сводном потоке, а также обновление и код продукта в таблице свойств. Код пакета также отображается на странице свойств файла MSI в проводнике Windows.
  2. Используйте Powershell, чтобы просмотреть информацию о пакете. Я считаю этот самый простой и практичный вариант. См. Этот ответ для скриншота и примера: Как я могу найти GUID продукта установленной установки MSI?

Если то, что вы пытаетесь сделать, это удалить соответствующий продукт, см. этот комплексный деинсталлированный ответ MSI: Удаление MSI файла из командной строки без использования msiexec

Если вам удобнее использовать VBScript вместо Powershell, попробуйте этот ответ от Фила Уилсона: как узнать, какие продукты установлены - новый продукт уже установлены окна MSI

Ответ 3

Обычно (хотя и не универсально), если часть программного обеспечения использует установку на основе MSI, идентификатор GUID можно найти в записи "Удалить". Обычно это будет либо имя ключа, либо будет отображаться в UninstallString и/или UninstallPath. Иногда жизнь проста, и есть значение ProductGuid.

Удалить записи можно здесь:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

В 64-битной версии Windows есть два таких ключа: один для 64-битного программного обеспечения и второй для 32-разрядного программного обеспечения:

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall

Ответ 4

Мое решение состоит в том, что я написал небольшое консольное приложение, которое возвращает ProductCode любого файла MSI (имя передается как программный аргумент). Я делаю это, читая guid из самого файла .msi. В основном я открываю этот файл msi как строку и ищу текст, начинающийся с "ProductCode", получая его индекс и беря 38-значные символы до этой позиции индекса. Вот скриншот: screenshot