Найти GUID из файла MSI
Как я могу перечислить GUID установленной программы в Windows? Или проще найти GUID, если у меня есть файл MSI?
Я просматриваю файл MSI с Orca, но не уверен, где искать GUID.
Спасибо!
5 ответов
Три основных идентификатора GUID базы данных установщика Windows - это код пакета, код продукта и код обновления. Первый хранится в потоке сводной информации (меню "Вид" в Orca), а остальные хранятся в таблице свойств. (Другие формы баз данных, такие как модули слияния и исправления, имеют сходные идентификаторы GUID в аналогичных местах, такие как GUID модуля слияния или GUID кода исправления - каждая из них хранится идентично коду пакета.)
Чтобы найти их на компьютере, вы можете посмотреть ключ Uninstall, где часто используется ProductCode. Или, что еще лучше, если вы хотите перечислить то, что в данный момент установлено на компьютере, вы можете вызвать MsiEnumProducts.
Есть несколько способов найти 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
- Проверьте локально кэшированный пакет MSI в % SystemRoot% \ Installer. Это кэшированная версия оригинального MSI, который изначально использовался для установки продукта на ваш компьютер.
- Вам понадобится инструмент, способный открывать файлы MSI. Вот список и сравнение возможностей: Какой установочный продукт использовать? InstallShield, WiX, Wise, Advanced Installer и т. Д.
- MSI - это замаскированная база данных MS SQL, вы также можете открыть ее любым совместимым средством просмотра данных MS SQL.
- Бесплатный инструмент MSI " Orca " из Windows SDK является предпочтительным для этой простой задачи поиска данных. Это быстро, мало и надежно.
- Затем следуйте совету Майкла Урмана из приведенного выше ответа и найдите код пакета в сводном потоке, а также обновление и код продукта в таблице свойств. Код пакета также отображается на странице свойств файла MSI в проводнике Windows.
- Используйте Powershell для отображения информации о пакете. Я считаю, что это самый простой и практичный вариант. Посмотрите этот ответ для скриншота и образца: Как я могу найти GUID продукта установленной установки MSI?
Если то, что вы пытаетесь сделать, - это удалить рассматриваемый продукт, посмотрите этот исчерпывающий ответ MSI об удалении: Удаление файла MSI из командной строки без использования msiexec.
Если вам удобнее использовать VBScript вместо Powershell, попробуйте ответ от Фила Уилсона (Phil Wilson): как узнать, какие продукты установлены - на более новые продукты уже установлены окна MSI
Если вы просто хотите узнать, какие ProductName и ProductCode (ProductId) содержит данный MSI, не устанавливая этот MSI и не проверяя реестр, вы можете запросить сам MSI с помощью PowerShell, используя такую функцию (вдохновлено http://www.scconfigmgr.com/2014/08/22/how-to-get-msi-file-information-with-powershell):
function Get-MSIProperties {
param (
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[System.IO.FileInfo] $path,
[string[]] $properties = @('ProductCode', 'ProductVersion', 'ProductName', 'Manufacturer', 'ProductLanguage')
)
begin {
$windowsInstaller = (New-Object -ComObject WindowsInstaller.Installer)
}
process {
$table = @{}
$msi = $windowsInstaller.GetType().InvokeMember('OpenDatabase', 'InvokeMethod', $null, $windowsInstaller, @($Path.FullName, 0))
foreach ($property in $properties) {
try {
$view = $msi.GetType().InvokeMember('OpenView', 'InvokeMethod', $null, $msi, ("SELECT Value FROM Property WHERE Property = '$($property)'"))
$view.GetType().InvokeMember('Execute', 'InvokeMethod', $null, $view, $null)
$record = $view.GetType().InvokeMember('Fetch', 'InvokeMethod', $null, $view, $null)
$table.add($property, $record.GetType().InvokeMember('StringData', 'GetProperty', $null, $record, 1))
}
catch {
$table.add($property, $null)
}
}
$msi.GetType().InvokeMember('Commit', 'InvokeMethod', $null, $msi, $null)
$view.GetType().InvokeMember('Close', 'InvokeMethod', $null, $view, $null)
$msi = $null
$view = $null
return $table
}
end {
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($windowsInstaller) | Out-Null
[System.GC]::Collect()
}
}
Мое решение состоит в том, что я написал небольшое консольное приложение, которое возвращает ProductCode любого MSI-файла (имя передается в качестве аргумента программы). Я делаю это, читая руководство из самого файла.msi. По сути, я открываю этот MSI-файл в виде строки и ищу текст, начинающийся с "ProductCode", получая его индекс и занимая 38 символов перед этой позицией индекса. Вот скриншот:
Обычно (хотя и не всегда), если часть программного обеспечения использует установку на основе MSI, GUID можно найти в записи Uninstall. Обычно это будет либо имя ключа, либо будет отображаться в значении UninstallString и / или UninstallPath. Иногда жизнь проста, и существует значение ProductGuid.
Записи об удалении можно найти здесь:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
В 64-разрядной версии Windows есть два таких ключа: один для 64-разрядного программного обеспечения и второй для 32-разрядного программного обеспечения:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall