如何在Windows中列出已安装程序的GUID?或者,如果我有MSI文件,是否更容易找到GUID?
我正在浏览Orca的MSI文件,但不确定在哪里查找GUID。
谢谢!
答案 0 :(得分:12)
Windows Installer数据库的三个主要GUID是Package Code,ProductCode和UpgradeCode。第一个存储在摘要信息流(Orca中的View菜单)中,其他存储在Property表中。 (其他形式的数据库,例如合并模块和补丁在类似的地方有类似的GUID,例如合并模块的GUID或补丁代码GUID - 每个都与包代码相同地存储。)
要在计算机上查找它们,您可以查看经常使用ProductCode的Uninstall键。或者更好的是,如果您想要枚举机器上当前安装的内容,可以致电MsiEnumProducts。
答案 1 :(得分:6)
找到已安装软件包的产品GUID 有多种方法。请首选3号选项。
最常见的是:
- 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
如果您要执行的操作是卸载相关产品,请参阅此comprehesive卸载MSI答案: Uninstalling an MSI file from the command line without using msiexec
如果您觉得使用 VBScript 而不是Powershell感觉更舒服,请尝试Phil Wilson的回答:how to find out which products are installed - newer product are already installed MSI windows
答案 2 :(得分:2)
如果您只想知道给定MSI包含什么ProductName和ProductCode(ProductId),而无需安装该MSI并检查注册表,则可以使用PowerShell这样的功能(由{{3 }):
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()
}
}
答案 3 :(得分:1)
通常(尽管不是普遍)如果一个软件使用基于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 :(得分:1)