从MSI文件中查找GUID

dsh*_*per 11 windows windows-installer guid

如何在Windows中列出已安装程序的GUID?或者,如果我有MSI文件,是否更容易找到GUID?

我正在通过Orca查看MSI文件,但不确定在哪里查找GUID.

谢谢!

Mic*_*man 13

Windows Installer数据库的三个主要GUID是Package Code,ProductCodeUpgradeCode.第一个存储在摘要信息流(Orca中的View菜单)中,其他存储在Property表中.(其他形式的数据库,例如合并模块和补丁在类似的地方具有类似的GUID,例如合并模块的GUID或补丁代码GUID - 每个都与包代码相同地存储.)

要在计算机上查找它们,可以查看经常使用ProductCode的Uninstall键.或者更好的是,如果您想要枚举机器上当前安装的内容,可以调用MsiEnumProducts.


Ste*_*mul 6

有几种方法可以查找产品GUID进行安装的软件包.请选择3号选项.

最常见的是:

  1. 使用regedit.exe 检入以下基本路径下的注册表.搜索应用程序名称(或只浏览每个子文件夹,直到找到它).找到它后,您可以将其传递给msiexec.exe:
- 32-BIT SECTION:

 HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
 HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall (per user section)
Run Code Online (Sandbox Code Playgroud)
- 64-BIT SECTION:

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

 HKCR\Installer\Products
Run Code Online (Sandbox Code Playgroud)
  1. 检查本地缓存的MSI软件包的%SystemRoot%\ Installer程序.这是原始MSI的缓存版本,最初用于在计算机上安装产品.
    • 您将需要一个能够打开MSI文件的工具.以下是功能列表和比较:使用什么安装产品?InstallShield,WiX,Wise,Advanced Installer等.
    • MSI是伪装的MS SQL数据库,您还应该能够使用任何兼容的MS SQL数据查看器工具打开它.
    • 这个免费的MSI工具" 奥卡 "Windows SDK的是这个简单的数据检索任务的首选之一.它快速,小巧,可靠.
    • 然后按照上面的答案跟随Michael Uhrman的建议,找到摘要流中的包代码,以及Property表中的升级和产品代码.从Windows资源管理器中的MSI文件属性页面也可以看到包代码.
  2. 使用Powershell列出包信息.我发现这是最简单,最实用的选择.有关屏幕截图和示例,请参阅此答案:如何找到已安装的MSI设置的产品GUID?

如果你要做的是卸载有问题的产品,请参阅此comprehesive卸载MSI答案:从命令行卸载MSI文件而不使用msiexec

如果您觉得使用VBScript而不是Powershell 更舒服,请尝试Phil Wilson的答案:如何找出安装了哪些产品 - 已经安装了更新的产品MSI windows


gre*_*ade 6

如果您只想知道给定 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()
  }
}
Run Code Online (Sandbox Code Playgroud)