2009-05-26 5 views

Antwort

88

Iterieren durch den Registrierungsschlüssel "SOFTWARE \ Microsoft \ Windows \ Currentversion \ Uninstall" scheint eine umfassende Liste der installierten Anwendungen zu geben.

Abgesehen von dem Beispiel unten finden Sie eine ähnliche Version zu dem, was ich getan habe here.

Dies ist ein grobes Beispiel, Sie werden wahrscheinlich etwas tun wollen, um leere Zeilen wie in der 2. Link zur Verfügung gestellt zu entfernen.

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")); 
     } 
    } 
} 

Alternativ können Sie WMI verwenden, wie erwähnt:

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

Aber das ist eher langsamer auszuführen, und ich habe gehört, es kann nur Liste Programme unter „ALLUSERS“ installiert, obwohl Das könnte falsch sein. Es ignoriert auch die Windows-Komponenten & Updates, die für Sie nützlich sein können.

+20

Es ist erwähnenswert, dass die Verwendung der WMI Win32_Product-Klasse eine schlechte Idee ist, wenn Sie diese Abfrage wiederholt ausführen möchten. Siehe diesen Microsoft Knowledge Base-Artikel: http://support.microsoft.com/kb/974524/EN-US Das Kernproblem ist die (a) Win32_Product ist wirklich langsam und (b) es generiert einen "Windows Installer das Produkt neu konfiguriert . " Ereignisprotokollnachricht für * jedes * installierte Produkt auf Ihrem System ... jedes Mal, wenn Sie die Abfrage ausführen. Do! Dieser Artikel empfiehlt die Verwendung der Klasse Win32reg_AddRemovePrograms ..., die nicht vorhanden ist, wenn Sie SMS installiert haben. Do! Also wahrscheinlich besser mit der Registry-Abfrage zu bleiben. –

+0

Simon Gillbees Kommentar sollte die akzeptierte Antwort sein, oder Kirtans! WMI WIN32_Produkt ist nicht der Weg, hier zu gehen, vertrau mir! – bdd

+8

Äh, deshalb ist das Registrierungsbeispiel zuerst in meiner Antwort. WMI wurde einfach als eine alternative Lösung präsentiert, und selbst dort stelle ich fest, dass "dies eher langsam auszuführen ist" und andere Nachteile. Lesen Sie die Antwort von Anfang an. ;) – Xiaofu

1

Iterieren Sie über die Schlüssel "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" und überprüfen Sie ihre "DisplayName" -Werte.

10

Sie können einen Blick auf this article werfen. Es verwendet die Registrierung, um die Liste der installierten Anwendungen zu lesen.

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) 
       { } 
      } 
     } 
    } 
} 
+0

Ich möchte nicht ganze Liste, ich brauche nur einige ausgewählte Installationsprogramme, was kann ich dafür tun. Danke –

1

Könnte ich vorschlagen, dass Sie einen Blick auf WMI (Windows Management Instrumentation) werfen. Wenn Sie die System.Management-Referenz zu Ihrem C# -Projekt hinzufügen, erhalten Sie Zugriff auf die Klasse 'ManagementObjectSearcher', die Sie wahrscheinlich nützlich finden werden.

Es gibt verschiedene WMI-Klassen für Installed Applications, aber wenn es mit Windows Installer installiert wurde, ist die Win32_Product-Klasse wahrscheinlich am besten für Sie geeignet.

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

Verwenden Sie das nicht: https://stackoverflow.com/a/46315976/1498669 – Bernhard

1

Verwenden Sie Windows Installer API!

Es ermöglicht eine zuverlässige Aufzählung aller Programme zu machen. Registry ist nicht zuverlässig, aber WMI ist Schwergewicht.

+0

sicher ist schweres Gewicht - wenn sie wiederholt laufen, wird die Leistung wie ein schweres Gewicht fallen. Wenn eine Funktion meiner App von einer anderen App abhängt, und wissen, ob sie ordnungsgemäß installiert ist, brauche ich nur den Registrierungsschlüssel für die Deinstallation von 32 oder 64 nur dann, wenn die App in 64 Bit auch verfügbar ist) auf der anderen Seite, wenn ich muss benutze wmi, ich werde mich darauf beschränken, nur einmal während einer Anwendung über einen Smart-Property-Trick zu verwenden. – gg89

1

Ich verwendete Nicks Ansatz - Ich musste überprüfen, ob die Remote Tools für Visual Studio installiert sind oder nicht, es scheint ein bisschen langsam, aber in einem separaten Thread ist das in Ordnung für mich. - hier meine erweiterten Code:

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; 
    } 
5

es ist erwähnenswert, dass die Win32_Product WMI-Klasse Produkte darstellt, wie sie von Windows Installer [http://msdn.microsoft.com/en-us/library/aa394378%28v=vs.85%29.aspx].not jede Anwendung verwenden Windows Installer installiert werden

jedoch „SOFTWARE \ Microsoft \ Windows \ Currentversion \ Uninstall "repräsentiert Anwendungen für 32 Bit. Für 64-Bit müssen Sie auch "HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall" durchqueren und da nicht jede Software eine 64-Bit-Version hat, sind die installierten Anwendungen eine Union von Schlüsseln an beiden Standorten, die "UninstallString" haben Wert mit ihnen.

aber die besten Optionen bleiben die gleichen .traverse Registrierungsschlüssel ist ein besserer Ansatz, da jede Anwendung einen Eintrag in der Registrierung [einschließlich der in Windows Installer] .wie auch immer die Registrierungsmethode unsicher ist, als ob jemand den entsprechenden Schlüssel entfernt Sie werden den Anwendungseintrag nicht kennen. Im Gegensatz dazu ist das Ändern des HKEY_Classes_ROOT \ Installers schwieriger, da es mit Lizenzproblemen wie Microsoft Office oder anderen Produkten verknüpft ist. für eine robustere Lösung können Sie Registry-Alternative immer mit dem WMI kombinieren.

+0

Win32_Product ist böse: https://gregramsey.net/2012/02/20/win32_product-is-evil/ – Mick

4

Ich stimme zu, dass die Aufzählung über den Registrierungsschlüssel der beste Weg ist.

Hinweis jedoch, dass der Schlüssel gegeben, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", wird alle Anwendungen in einer 32-Bit-Windows-Installation Liste und 64-Bit-Anwendungen in einer Windows-64-Bit-Installation.

Um auch 32-Bit-Anwendungen zu sehen, die auf einer Windows 64-Bit-Installation installiert sind, müssten Sie auch den Schlüssel @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" auflisten.

+0

Sind Sie sich sicher? Auf meinem Windows 10 Enterprise 64bit sehen die beiden Listen gleich aus und die x86-Anwendungen erscheinen in beiden. –

0

Meine Anforderung ist zu überprüfen, ob in meinem System eine bestimmte Software installiert ist. Diese Lösung funktioniert wie erwartet. Es könnte dir helfen. Ich habe eine Windows-Anwendung in C# mit Visual Studio 2015 verwendet.

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; 

     } 
Verwandte Themen