レジストリキー "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コンポーネントも無視されます。更新、これはあなたにとって便利かもしれません。
あなたは見てみることができますこの記事。それはインストールされたアプリケーションのリストを読むためにレジストリを利用します。
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)
{ }
}
}
}
}
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をいつでも組み合わせることができます。
私は、レジストリキーを介して列挙することが最善の方法であることに同意します。
注意しかし、その鍵は@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
は、32ビットWindowsインストールのすべてのアプリケーションと、Windows 64ビットインストールの64ビットアプリケーションを一覧表示します。
Windows 64ビットインストールに32ビットアプリケーションがインストールされていることも確認するには、キーを列挙する必要があります。@"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
。
"HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall"キーを繰り返し入力して、それらの "DisplayName"値を確認します。
WMIを見てみることをお勧めします(Windows管理インストルメンテーション) C#プロジェクトにSystem.Management参照を追加すると、おそらく `ManagementObjectSearcher 'クラスにアクセスできます。これはおそらく便利でしょう。
さまざまなWMIクラスがあります。インストール済みアプリケーションしかし、それがWindowsインストーラーと一緒にインストールされている場合は、Win32_Productクラスがおそらくあなたに最も適しています。
ManagementObjectSearcher s = new ManagementObjectSearcher("SELECT * FROM Win32_Product");
WindowsインストーラAPIを使用してください。
それはすべてのプログラムの信頼できる列挙をすることを可能にします。レジストリは信頼できませんが、WMIはヘビー級です。
私は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;
}
あなたの最善の策は使用することですWMI。具体的にWin32_Productクラス。
私の要件は、特定のソフトウェアが私のシステムにインストールされているかどうかを確認することです。この解決策は期待どおりに機能します。それはあなたを助けるかもしれません。私はビジュアルスタジオ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;
}