66

C#のコードを使用してシステムにインストールされているアプリケーションを取得する方法?

10 답변


92

レジストリキー "SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall"を繰り返すと、インストールされているアプリケーションの一覧が表示されるようです。

以下の例を除けば、私がやったことと似たバージョンを見つけることができます。ここに

これは大まかな例です。おそらく、提供されている2番目のリンクのように、空白行を削除するために何かをしたいと思うでしょう。

string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
using(Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
{
    foreach(string subkey_name in key.GetSubKeyNames())
    {
        using(RegistryKey subkey = key.OpenSubKey(subkey_name))
        {
            Console.WriteLine(subkey.GetValue("DisplayName"));
        }
    }
}

あるいは、前述のようにWMIを使用することもできます。

ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Product");
foreach(ManagementObject mo in mos.Get())
{
    Console.WriteLine(mo["Name"]);
}

しかし、これは実行がかなり遅く、「ALLUSERS」の下にインストールされているプログラムのみがリストされる可能性があると聞きましたが、それは正しくないかもしれません。 Windowsコンポーネントも無視されます。更新、これはあなたにとって便利かもしれません。


  • このクエリを繰り返し実行する予定がある場合は、WMI Win32_Productクラスを使用することはお勧めできません。 Microsoft KBの記事を参照してください。support.microsoft.com/kb/974524/EN-US中心的な問題は、(a)Win32_Productが本当に遅く、(b)「Windowsインストーラが製品を再構成しました」というメッセージを生成することです。のイベントログメッセージすべてのシステムにインストールされた製品...クエリを実行するたびに。やあ!この記事では、Win32reg_AddRemoveProgramsクラスを使用することをお勧めします。SMSをインストールしていない限り、このクラスは存在しません。やあ!そのため、おそらくレジストリクエリに固執するほうが良いでしょう。 - Simon Gillbee
  • Simon Gillbeeのコメントが承認された回答、またはKirtansです。 WMI WIN32製品はここに行く方法ではありません、私を信頼してください! - bdd
  • あの、レジストリの例が私の答えの最初にあるのはそのためです。 WMIは単に別の解決策として提示されたものであり、私も「これは実行するのがやや遅い」と述べています。そして他の欠点。最初から答えを読んでください。 ;) - Xiaofu
  • ちょっと変ですが、プログラムをアンインストールしてから再度インストールした場合は、レジストリキーを使用してプログラムを見つけてみてください。ただし、コンピュータを再起動しない限り実行できません。 - Yar
  • 私自身の質問に答えるには:stackoverflow.com/questions/27838798/…迷惑ですが、64ビットと32ビットの両方を照会する必要があるかもしれません。 - Robert Koernke

10

あなたは見てみることができますこの記事。それはインストールされたアプリケーションのリストを読むためにレジストリを利用します。

public void GetInstalledApps()
{
    string uninstallKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
    using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(uninstallKey))
    {
        foreach (string skName in rk.GetSubKeyNames())
        {
            using (RegistryKey sk = rk.OpenSubKey(skName))
            {
                try
                {
                    lstInstalled.Items.Add(sk.GetValue("DisplayName"));
                }
                catch (Exception ex)
                { }
            }
        }
    }
}


  • 全リストが欲しくないのですが、選択したインストールプログラムがいくつか必要なだけなので、そのために何ができますか。ありがとうございました - Dhru 'soni

5

Win32_Product WMIクラスは、Windowsインストーラによってインストールされる製品を表していることに注目する価値があります。http://msdn.microsoft.com/en-us/library/aa394378%28v=vs.85%29.aspx].notすべてのアプリケーションはWindowsインストーラを使用します

ただし、「ソフトウェア\ Microsoft \ Windows \ CurrentVersion \ Uninstall」は32ビット用のアプリケーションを表します。 64ビットの場合は、 "HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall"をトラバースする必要があります。すべてのソフトウェアに64ビットバージョンがあるわけではないため、インストールされるアプリケーションは両方とも "UninstallString"のキーになります。彼らと一緒に価値を。

すべてのアプリケーションはレジストリにエントリを持っているので(Windowsインストーラのものも含む)、最良の選択肢は同じままです。トラバースレジストリキーは誰かが対応するキーを削除するかのようにレジストリ方法は安全ではありません。それとは反対に、HKEY_Classes_ROOT \ Installersの変更は、Microsoft Officeや他の製品などのライセンス問題に関連しているため、よりトリッキーです。 より堅牢なソリューションの場合は、レジストリの代替手段とWMIをいつでも組み合わせることができます。



5

私は、レジストリキーを介して列挙することが最善の方法であることに同意します。

注意しかし、その鍵は@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"は、32ビットWindowsインストールのすべてのアプリケーションと、Windows 64ビットインストールの64ビットアプリケーションを一覧表示します。

Windows 64ビットインストールに32ビットアプリケーションがインストールされていることも確認するには、キーを列挙する必要があります。@"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"


  • これ本気なの?私のWindows 10 Enterprise 64bitでは、2つのリストは似ていますが、x86アプリケーションは両方に表示されます。 - Florian Straub

1

"HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall"キーを繰り返し入力して、それらの "DisplayName"値を確認します。


1

WMIを見てみることをお勧めします(Windows管理インストルメンテーション) C#プロジェクトにSystem.Management参照を追加すると、おそらく `ManagementObjectSearcher 'クラスにアクセスできます。これはおそらく便利でしょう。

さまざまなWMIクラスがあります。インストール済みアプリケーションしかし、それがWindowsインストーラーと一緒にインストールされている場合は、Win32_Productクラスがおそらくあなたに最も適しています。

ManagementObjectSearcher s = new ManagementObjectSearcher("SELECT * FROM Win32_Product");



1

WindowsインストーラAPIを使用してください。

それはすべてのプログラムの信頼できる列挙をすることを可能にします。レジストリは信頼できませんが、WMIはヘビー級です。


  • 確かにヘビー級です - 繰り返し実行すると、パフォーマンスがヘビー級のように低下します。私のアプリの機能が他のアプリに依存していて、正しくインストールされているかどうかを知っていれば、32または64用のアンインストールレジストリキーが必要です。スマートプロパティトリックを介してアプリケーション中に一度だけ使用するように制限されます。 - gg89

1

私はNicksアプローチを使用しました - Visual Studio用のリモートツールがインストールされているかどうかをチェックする必要がありました、それは少し遅いようですが、これは私にとっては問題ありません。 - ここで私の拡張コード:

    private bool isRdInstalled() {
        ManagementObjectSearcher p = new ManagementObjectSearcher("SELECT * FROM Win32_Product");
        foreach (ManagementObject program in p.Get()) {
            if (program != null && program.GetPropertyValue("Name") != null && program.GetPropertyValue("Name").ToString().Contains("Microsoft Visual Studio 2012 Remote Debugger")) {
                return true;
            }
            if (program != null && program.GetPropertyValue("Name") != null) {
                Trace.WriteLine(program.GetPropertyValue("Name"));
            }
        }
        return false;
    }


0

あなたの最善の策は使用することですWMI。具体的にWin32_Productクラス。



-1

私の要件は、特定のソフトウェアが私のシステムにインストールされているかどうかを確認することです。この解決策は期待どおりに機能します。それはあなたを助けるかもしれません。私はビジュアルスタジオ2015とC#でWindowsアプリケーションを使用しました。

 private void Form1_Load(object sender, EventArgs e)
        {

            object line;
            string softwareinstallpath = string.Empty;
            string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
            using (var baseKey = Microsoft.Win32.RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
            {
                using (var key = baseKey.OpenSubKey(registry_key))
                {
                    foreach (string subkey_name in key.GetSubKeyNames())
                    {
                        using (var subKey = key.OpenSubKey(subkey_name))
                        {
                            line = subKey.GetValue("DisplayName");
                            if (line != null && (line.ToString().ToUpper().Contains("SPARK")))
                            {

                                softwareinstallpath = subKey.GetValue("InstallLocation").ToString();
                                listBox1.Items.Add(subKey.GetValue("InstallLocation"));
                                break;
                            }
                        }
                    }
                }
            }

            if(softwareinstallpath.Equals(string.Empty))
            {
                MessageBox.Show("The Mirth connect software not installed in this system.")
            }



            string targetPath = softwareinstallpath + @"\custom-lib\";
            string[] files = System.IO.Directory.GetFiles(@"D:\BaseFiles");

            // Copy the files and overwrite destination files if they already exist. 
            foreach (var item in files)
            {
                string srcfilepath = item;
                string fileName = System.IO.Path.GetFileName(item);
                System.IO.File.Copy(srcfilepath, targetPath + fileName, true);
            }
            return;

        }


  • foreach(key.GetSubKeyNames()の文字列subkey_name)< - nullの場合、ここではチェックしません。 - Burgo855

リンクされた質問


関連する質問

最近の質問