C#

C# インストールされているプログラムのリストを取得する(Microsoft.Win32.Registryクラス)

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

 

タイトルとURLをコピーしました