web-dev-qa-db-ja.com

検索GUID MSIファイルから

WindowsにインストールされているプログラムのGUID=を一覧表示するにはどうすればよいですか?または、MSIファイルがある場合、GUIDを見つけるのは簡単ですか?

OrcaでMSIファイルを調べていますが、GUIDを見つけるためにどこを調べればよいかわかりません。

ありがとう!

11
dshipper

Windowsインストーラーデータベースの3つの主要なGUIDは、 パッケージコードProductCode 、および pgradeCode です。 1つ目は要約情報ストリーム(Orcaの[表示]メニュー)に格納され、その他はプロパティテーブルに格納されます。 (マージモジュールやパッチなどの他の形式のデータベースは、マージモジュールのGUIDまたはパッチコードGUID-それぞれ保存されているなど、同様の場所に同様のGUIDを持っていますパッケージコードと同じです。)

マシンでそれらを見つけるには、ProductCodeがよく使用されるUninstallキーを調べます。さらに良いことに、現在マシンにインストールされているものを列挙したい場合は、 MsiEnumProducts を呼び出すことができます。

13
Michael Urman

mSIをインストールしてレジストリをチェックせずに、特定のMSIに含まれるProductNameおよびProductCode(ProductId)を知りたいだけの場合は、次のような関数を使用して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()
  }
}
4
grenade

私の解決策は、MSIファイルのProductCodeを返す小さなコンソールアプリを作成したことです(名前はプログラム引数として渡されます)。私はそれを.msiファイル自体からGUIDを読み取ることで行っています。基本的に私はそのmsiファイルを文字列として開き、 "ProductCode"で始まるテキストを探し、そのインデックスを取得し、そのインデックス位置の前に38文字を取得します。これがスクリーンショットです: screenshot

1
Farkhod

通常(普遍的ではありませんが)、ソフトウェアがMSIベースのインストールを使用する場合、GUIDはUninstallエントリにあります。通常、キー名であるか、UninstallStringに表示されます。 /またはUninstallPath値。場合によっては簡単で、ProductGuid値があります。

アンインストールエントリはここにあります:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

64ビットバージョンのWindowsには、64ビットソフトウェア用と32ビットソフトウェア用の2つのキーがあります。

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
1
Harry Johnston