「プログラムのインストール状態」といっても、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の環境調査に利用できるからです。