このページの本文へ

前へ 1 2 次へ

Windows Info 第209回

WindowsでのWin32アプリケーションのインストール状態を調べる方法

2020年02月02日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

PowerShellでスクリプトを作った

 マイクロソフトのページがPowerShellだったので、PowerShellでスクリプト(といってもコマンドを並べたもの)を作った。ところがこれが少しハマってしまった。本質的な部分ではなく、CSVのエクスポートという部分だ。こういう情報は、CSVなどにしてExcelに放り込むに限る。重複の検出や削除、並べ替え、検索などが自由にできる。こういう大量の情報を吐くAPIの結果を分析するのにExcelは最適である。

 ところが、get-CimInstanceコマンドが出力するオブジェクトと、レジストリを読み出してできるレジストリは同一ではない。PowerShellのExport-CSVコマンドは最初に出力したオブジェクトを覚えていて、追加するときにオブジェクトが違うとエラーになる。

 「-Force」オプションで強制的に違うオブジェクトを出力させることもできるのだが、出力できるのは、最初のオブジェクトのプロパティと同じプロパティ名の情報だけだった。そういうわけで、なんだか出力がおかしいけど、Export-CSV使わずにコンソールで見ると何もおかしくないという状態で、問題はExport-CSVにあるということに気がつくまで半日かかった。

 とりあえず解決方法として自分でカンマ区切りの出力としてCSVファイルを作成した。

$f="C:\temp\win32appInstall-ListFile.csv"
$p= "`"{0}`",`"{1}`",`"{2}`",`"{3}`",`"{4}`",`"{5}`",`"{6}`""
$o1=(Get-ChildItem -Path 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall' | ForEach-Object { Get-ItemProperty $_.PsPath})
$o2=(Get-ChildItem -Path 'HKLM:SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall' | ForEach-Object { Get-ItemProperty $_.PsPath})
$o3=(Get-ChildItem -Path 'HKCU:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall' | ForEach-Object { Get-ItemProperty $_.PsPath})
$o4=(Get-WmiObject Win32_Product)
#
$o1 | ForEach-Object {($p+",`"HKLMMS`"") -f $_.PSChildName,$_.Publisher,$_.DisplayName,$_.DisplayVersion,$_.installDate,$_.installlocation,$_.installsource } | Out-File -Encoding default $f
$o2 | ForEach-Object {($p+",`"HKLMWOW`"") -f $_.PSChildName,$_.Publisher,$_.DisplayName,$_.DisplayVersion,$_.installDate,$_.installlocation,$_.installsource } | Out-File -append -Encoding default $f
$o3 | ForEach-Object {($p+",`"HKCUMS`"") -f $_.PSChildName,$_.Publisher,$_.DisplayName,$_.DisplayVersion,$_.installDate,$_.installlocation,$_.installsource } | Out-File -append -Encoding default $f
$o4 | ForEach-Object {($p+",`"WMI`"") -f $_.IdentifyingNumber,$_.vendor,$_.name,$_.version,$_.installdate,$_.installlocation,$_.installsource } | Out-File -append -Encoding default $f

 なお、これは常識かもしれないが、ExcelにCSVを読み込ませるとき、シフトJISコードにしないと、区切り位置がおかしくなることがある。仕様としてはBOM付きのUTF8をサポートしているはずなのだが、ときどき正しく読み込んでくれないことがある。タブや他の区切り文字を使うという手もあるのだが、こっちもExcelが読み込み時に勝手にセルに分割することもあれば、そうでないこともあって、面倒である。特に日本語が含まれる可能性がある場合、シフトJISのCSVにするのが一番確実な感じである。

 CIMとレジストリで共通にあり、インストールされているアプリケーションを知るのに必要なプロパティの対応は、以下の表のようになる。リストのプログラムは、これを出力するようにした。なお、CSVの最後の欄は、情報ソースを示す。

 出力をExcelで調べたところ、Cimから得た情報と「WOW」から得た情報は大半が重複しており、違いはわずかに3つ。そのうち1つは、何も情報が記録されておらず、エントリーだけだった。また、残り2つは、「Microsoft .NET Framework 3.5 Targeting Pack」の英語版と日本語版。これは、Visual Studioがインストールする開発時に利用するもので通常利用するプログラムではない。なので、実用的には、レジストリの値だけを調べれば十分そうだ。

 CIMコマンド(Get-CimInstance)は、実行にかなり時間がかかる。前記のMicrosoftのページにも、「Win32_Product クラスはクエリ用に最適化されていません」との記述がある。このコマンドを実行すると、インストールされているパッケージの整合性のチェックが発生し、場合によっては修復も行なわれるらしい。ということで、面倒な感じである。

 となると、前記の3つのレジストリだけを調べれば、Win32アプリケーションの情報が得られそうだ。たとえば、以下のリストのようにすれば、Publisherが「株式会社」で始まるアプリケーションだけを表示できる。

レジストリ情報からPublisherプロパティに「株式会社」を含む項目だけを出力した。フォントを除けば記事先頭の写真と同じプログラムが表示されている

(Get-ChildItem -Path ('HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall','HKLM:SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall','HKCU:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall') | ForEach-Object { Get-ItemProperty $_.PsPath}) | Where-Object { $_.Publisher -like "*株式会社*" } | Sort-Object Publisher | Format-Table -AutoSize displayversion,displayName -GroupBy Publisher

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン