「プログラムのインストール状態」といっても、PC内の入れて使っているものすべてではなく、Windowsインストーラなどでインストールしたプログラムだけが対象です。
ただ、取得する一覧は「インストールしたプログラム」と言いたいところですが、実は「アンインストールするプログラムの一覧」になります。
インストーラなどでインストールしたプログラムは、Windowsの「アプリと機能(Windows10の場合)」でアンインストールできるプログラムのリストとして表示されます。
プログラムのリストはどこで覚えてる?
「アプリと機能(Windows10の場合)」で取り扱うプログラムのリストは、レジストリに記録されています。
C#でレジストリを取り扱うのは Microsoft.Win32名前空間 にあるクラス群を使用します。
C#でのレジストリの取得方法
C#でレジストリの情報を取得するには、
- キーを開いてレジストリを取得する
- 子を探すときはさらにその中のサブキーを開いてレジストリを取得する
- 目的のレジストリが見つかったら、そのレジストリ内の値などを取得する
というのが基本の処理になります。
アンインストール情報のレジストリ情報を取得する
アンインストール情報のレジストリキーは、
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
の下にサブキーとして並んでいます。
サンプルコードは下記のようになります。
今回はレジストリから取得するのはプログラムの一覧で”文字列”なので、文字列の配列として取得するメソッドにしてみました。
static string[] GetUninstallList()
{
List<string> ret = new List<string>();
string uninstall_path = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
Microsoft.Win32.RegistryKey uninstall = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(uninstall_path, false);
if (uninstall != null)
{
foreach (string subKey in uninstall.GetSubKeyNames())
{
string appName = null;
Microsoft.Win32.RegistryKey appkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(uninstall_path + "\\" + subKey, false);
if (appkey.GetValue("DisplayName") != null)
appName = appkey.GetValue("DisplayName").ToString();
else
appName = subKey;
ret.Add(appName);
}
}
return ret.ToArray();
}
static void Main(string[] args)
{
string[] uninstall_list = Program.GetUninstallList();
foreach (string s in uninstall_list)
{
Console.WriteLine(s);
}
Console.WriteLine("Uninstall info listup is end...");
}
なぜインストールされているプログラムを知るのか
この「アプリと機能」の一覧の中には、C++ランタイムや.NET Framework、Windowsの更新プログラムなどのMicrosoftが提供しているプログラムがあり、PCの環境調査に利用できるからです。

