どうもミツシマです。

今回はPowershellコマンドを使用してインストールされているアプリケーションの一覧を取得出来ないかを検証してみました。
最終的な目標はコントロールパネルの「プログラムと機能」の一覧に表示されているアプリケーションを取得してくること!!

検証環境は以下の通り
PC:Windows10 Pro 1809


〜検証〜

まず一番最初に考えたのが、WMI機能を使用すること。WMIの「WIn32_Product」を使用してやってみる。が、これだと取得出来るアプリケーションが少ない!!
その為却下。
次にレジストリキーから取得する方法を検証。
色々調べると以下のレジストリキー配下に情報がありそう
HKLM¥SOFTWARE¥Microsoft¥Windows¥CurrentVersion¥Uninstall
HKLM¥SOFTWARE¥WOW6432Node¥Microsoft¥Windows¥CurrentVersion¥Uninstall
HKCU¥SOFTWARE¥Microsoft¥Windows¥CurrentVersion¥Uninstall

ただし上記レジストリキーからだとOfficeのHotfix等余計な情報も多々取得されてしまう!!

何とか「プログラムと一覧」と同じ情報を取得する為に他の方法も模索するもいい方法が見つからず、今回は断念。。。orz
とりあえず抜けは無さそうということでレジストリキーから取得するスクリプトを作成。


〜完成したスクリプト(Get-InstallSoftware.ps1)〜

Get-ChildItem -Path(
'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall',
'HKLM:SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall',
'HKCU:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall') | 
Foreach { Get-ItemProperty $_.PsPath } | 
Where-Object { $_.DisplayName -ne $NULL } | 
Select-Object DisplayName, DisplayVersion, Publisher |
Sort-Object DisplayName > AllPrograms.txt


〜解説〜

まずは上記3つのレジストリキー配下のキーすべてを取得して、そこから「DisplayName」が空でないものに絞り込む。
絞り込んだ内のキーからそれぞれ「DisplayName」・「DisplayVersion」・「Publisher」を抽出する。
※今回はプログラムの「名前」・「バージョン」・「メーカー」のみを抽出している
抽出したものを更に名前順にソートをかけて、最終的な結果をカレントディレクトリに「AllPrograms.txt」として出力している。


今回の検証作業はひとまず完了。
ただ、「プログラムと機能」に完全一致する情報は取得出来て来なかったので、ちょっと消化不良。。。
何かいい方法があるという方はコメントを是非お願いいたします!!
スポンサードリンク