2009-05-26 13 views

risposta

88

Iterando attraverso la chiave di registro "SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" sembra dare una lista completa delle applicazioni installate.

A parte l'esempio riportato di seguito, è possibile trovare una versione simile a quello che ho fatto here.

Questo è un esempio di massima, avrete probaby vogliono fare qualcosa per togliere righe vuote come nel 2 ° link fornito.

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

In alternativa, è possibile utilizzare WMI come è stato detto:

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

Ma questo è piuttosto lento per l'esecuzione, e ho sentito che può solo i programmi della lista installato sotto "ALLUSERS", anche se potrebbe non essere corretto Ignora anche gli aggiornamenti di componenti di Windows &, che possono essere utili per te.

+20

Vale la pena notare che l'utilizzo della classe WMI Win32_Product è una cattiva idea se si prevede di eseguire questa query ripetutamente. Vedere questo articolo della Microsoft KB: http://support.microsoft.com/kb/974524/EN-US Il problema principale è il (a) Win32_Product è molto lento e (b) genera un "Windows Installer riconfigurato il prodotto ". messaggio del registro eventi per * ogni * prodotto installato sul sistema ... ogni volta che si esegue la query. Doh! Questo articolo consiglia di utilizzare la classe Win32reg_AddRemovePrograms ... che non è presente a meno che non sia stato installato SMS. Doh! Quindi probabilmente è meglio attenersi alla query del registro. –

+0

Il commento di Simon Gillbee dovrebbe essere la risposta accettata, o Kirtans! WMI WIN32_Product non è il modo per andare qui, fidati di me! – bdd

+8

Er, ecco perché l'esempio del registro è il primo nella mia risposta. WMI è stato presentato semplicemente come una soluzione alternativa, e anche in questo caso dichiaro che "questo è piuttosto lento da eseguire" e altri svantaggi. Leggi la risposta dall'inizio. ;) – Xiaofu

0

La soluzione migliore è utilizzare WMI. In particolare la classe Win32_Product.

+2

Forse piuttosto più lento? – Kiquenet

+0

non utilizzare questo: https://stackoverflow.com/a/46315976/1498669 – Bernhard

1

Iterare attraverso le chiavi "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" e controllare i loro valori "DisplayName".

10

È possibile dare un'occhiata a this article. Usa il registro per leggere l'elenco delle applicazioni installate.

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

Non voglio l'intero elenco, ho solo bisogno di alcuni programmi di installazione selezionati, quindi cosa posso fare per quello. Grazie –

1

Potrei suggerire di dare un'occhiata a WMI (Windows Management Instrumentation). Se aggiungi il riferimento System.Management al tuo progetto C#, avrai accesso alla classe `ManagementObjectSearcher ', che probabilmente troverai utile.

Esistono varie classi WMI per Installed Applications, ma se è stato installato con Windows Installer, la classe Win32_Product è probabilmente la più adatta a voi.

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

non utilizzare questo: https://stackoverflow.com/a/46315976/1498669 – Bernhard

1

Utilizzare l'API di Windows Installer!

permette di fare l'enumerazione affidabile di tutti i programmi. Il registro non è affidabile, ma WMI è pesante.

+0

è molto pesante - se eseguito ripetutamente, si vedrà un calo delle prestazioni come un peso elevato. se una funzione della mia app dipende da un'altra app, e sapere se è installata correttamente, ho solo bisogno della chiave di registro di disinstallazione per 32 o 64 solo se l'app è disponibile anche a 64 bit) d'altra parte se devo usare wmi, mi limiterò a usare una sola volta durante un'applicazione tramite un trucco di proprietà intelligente. – gg89

1

ho usato l'approccio Nicks - avevo bisogno di verificare se i Remote Tools per Visual Studio vengono installati o no, mi sembra un po 'lento, ma in un thread separato Questo va bene per me. - qui il mio codice esteso:

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

vale la pena notare che la classe Win32_Product WMI rappresenta i prodotti in cui sono installati da Windows Installer [http://msdn.microsoft.com/en-us/library/aa394378%28v=vs.85%29.aspx].not ogni applicazione utilizza Windows Installer

tuttavia "SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall "rappresenta le applicazioni per 32 bit. Per 64 bit è anche bisogno di attraversare "HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall" e dal momento che non tutti i software ha una versione a 64 bit il totale delle domande installate sono un'unione di chiavi su entrambe le posizioni che hanno "UninstallString" Valore con loro.

ma le migliori opzioni rimangono le stesse chiavi di registro .verso è un approccio migliore poiché ogni applicazione ha una voce nel Registro di sistema [inclusi quelli in Windows Installer]. Tuttavia il metodo di registro non è sicuro come se qualcuno rimuovesse la chiave corrispondente non si conoscerà la voce Applicazione. Al contrario, la modifica degli HKEY_Classes_ROOT \ Installers è più complicata in quanto è collegata a problemi di licenza come Microsoft Office o altri prodotti. per soluzioni più solide è sempre possibile combinare l'alternativa di registro con il WMI.

+0

Win32_Product è malvagio: https://gregramsey.net/2012/02/20/win32_product-is-evil/ – Mick

4

Sono d'accordo che l'enumerazione tramite la chiave di registro sia il modo migliore.

Nota, tuttavia, che la chiave dato, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", elencherà tutte le applicazioni in un'installazione di Windows a 32 bit, e le applicazioni a 64 bit in un'installazione di Windows a 64 bit.

Per visualizzare anche le applicazioni a 32 bit installate su un'installazione di Windows a 64 bit, è necessario anche eseguire il conteggio della chiave @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall".

+0

Sei sicuro di questo? Sul mio Windows 10 Enterprise 64bit i due elenchi si assomigliano e le applicazioni x86 si presentano in entrambi. –

0

Il mio requisito è controllare se nel mio sistema è installato software specifico. Questa soluzione funziona come previsto. Potrebbe aiutarti. Ho usato un'applicazione Windows in C# con Visual Studio 2015.

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; 

     } 
Problemi correlati