获取系统中安装的应用程序

如何使用C#代码获取安装在系统中的应用程序?

通过registry项“SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall”进行迭代似乎给出了已安装应用程序的完整列表。

除了下面的例子,你可以find一个类似于我在这里完成的版本。

这是一个粗略的例子,你可能会想做一些事情来去掉第二个链接中的空白行。

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”下安装的程序,尽pipe这可能是不正确的。 它也忽略了Windows组件和更新,这可能对你很方便。

你可以看看这篇文章 。 它使用registry来读取已安装应用程序的列表。

 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 Installer安装的产品[ http://msdn.microsoft.com/en-us/library/aa394378%28v=vs.85%29.aspx%5D.not不是每个应用程序使用Windows安装程序;

但是“SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall”代表32位的应用程序。 对于64位,您还需要遍历“HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall”,因为并非每个软件都有一个64位版本,所以安装的应用程序总数是两个位置上的键合并具有“UninstallString”与他们的价值。

但最好的select仍然是一样的。横向registry项是一个更好的方法,因为每个应用程序都有一个registry项[包括在Windows安装程序]。但是registry方法是不安全的,好像任何人删除相应的密钥,那么你将不知道应用程序条目。相反,更改HKEY_Classes_ROOT \ Installers更为棘手,因为它与许可问题(如Microsoft Office或其他产品)相关联。 为了更健壮的解决scheme,您可以随时将registry替代与WMI结合使用。

我同意通过registry键枚举是最好的方法。

但请注意 ,提供的键@"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”值。

我可以build议你看看WMI( Windows Management Instrumentation )。 如果将System.Management引用添加到C#项目中,则可以访问“ManagementObjectSearcher”类,您可能会发现它很有用。

有多种安装应用程序的 WMI类,但是如果安装了Windows Installer,那么Win32_Product类可能最适合你。

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

使用Windows Installer API!

它允许可靠地列举所有程序。 registry不可靠,但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; } 

你最好的select是使用WMI 。 具体是Win32_Product类。

我的要求是检查我的系统中是否安装了特定的软件。 该解决scheme按预期工作。 它可能会帮助你。 我在Visual Studio 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; }