如何在 Windows 中列出已安装程序的 GUID?或者,如果我有 MSI 文件,是否更容易找到 GUID?
我正在使用 Orca 浏览 MSI 文件,但不确定在哪里可以找到 GUID。
谢谢!
如何在 Windows 中列出已安装程序的 GUID?或者,如果我有 MSI 文件,是否更容易找到 GUID?
我正在使用 Orca 浏览 MSI 文件,但不确定在哪里可以找到 GUID。
谢谢!
Windows Installer 数据库的三个主要 GUID 是Package Code、ProductCode和UpgradeCode。第一个存储在摘要信息流中(Orca 中的查看菜单),其他存储在属性表中。(其他形式的数据库,例如合并模块和补丁,在类似的地方有类似的 GUID,例如合并模块的 GUID 或补丁代码 GUID——每个都与包代码存储相同。)
要在机器上找到它们,您可以查看经常使用 ProductCode 的 Uninstall 键。或者更好的是,如果您希望枚举机器上当前安装的内容,您可以调用MsiEnumProducts。
有几种方法可以找到已安装软件包的产品G UID。请选择第 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
如果您要卸载有问题的产品,请参阅此全面的卸载 MSI 答案:Uninstalling an MSI file from the command line without using msiexec
如果您觉得使用VBScript而不是 Powershell 更舒服,请尝试 Phil Wilson 的回答:如何找出已安装的产品 - 已安装较新的产品 MSI windows
如果您只想知道给定 MSI 包含的 ProductName 和 ProductCode (ProductId),而无需安装该 MSI 并检查注册表,您可以使用 PowerShell 使用类似这样的函数查询 MSI 本身(灵感来自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()
}
}
通常(尽管不普遍)如果一个软件使用基于 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