2009-05-26 18 views

Respuesta

88

Iterar a través de la tecla "SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" registro parece dar una lista completa de las aplicaciones instaladas.

Aparte del ejemplo a continuación, puede encontrar una versión similar a lo que hice here.

Este es un ejemplo aproximado, probablemente querrás hacer algo para quitar filas en blanco como en el segundo enlace proporcionado.

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

Como alternativa, puede utilizar WMI como se ha mencionado:

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

, pero es muy lento para ejecutar, y he oído que sólo puede lista de programas instalados en "ALLUSERS", aunque eso puede ser incorrecto También ignora las actualizaciones de los componentes de Windows &, que pueden ser útiles para usted.

+20

Vale la pena señalar que el uso de la clase WMI Win32_Product es una mala idea si planea ejecutar esta consulta varias veces. Consulte este artículo de Microsoft KB: http://support.microsoft.com/kb/974524/EN-US El problema central es que (a) Win32_Product es realmente lento y (b) genera un "Windows Installer reconfiguró el producto " mensaje de registro de eventos para * cada * producto instalado en su sistema ... cada vez que ejecuta la consulta. Doh! Este artículo recomienda utilizar la clase Win32reg_AddRemovePrograms ... que no está presente a menos que haya instalado SMS. Doh! Probablemente sea mejor seguir con la consulta de registro. –

+0

¡El comentario de Simon Gillbee debería ser la respuesta aceptada, o Kirtans! WMI WIN32_Product no es el camino a seguir aquí, créanme! – bdd

+8

Er, es por eso que el ejemplo de registro es el primero en mi respuesta. WMI se presentó simplemente como una solución alternativa, e incluso allí dije "esto es bastante más lento de ejecutar" y otros inconvenientes. Lee la respuesta desde el principio. ;) – Xiaofu

1

Revise las claves "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" y compruebe sus valores de "DisplayName".

10

Puede echar un vistazo a this article. Utiliza el registro para leer la lista de aplicaciones instaladas.

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

No quiero una lista completa, solo necesito algunos programas de instalación seleccionados, entonces qué puedo hacer para eso. Gracias –

1

podría sugerir que echar un vistazo a WMI (Windows Management Instrumentation). Si agrega la referencia de System.Management a su proyecto C#, obtendrá acceso a la clase `ManagementObjectSearcher ', que probablemente encuentre útil.

Existen varias clases WMI para Installed Applications, pero si se instaló con Windows Installer, entonces la clase Win32_Product es probablemente la más adecuada para usted.

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

no use esto: https://stackoverflow.com/a/46315976/1498669 – Bernhard

1

¡Usa la API de Windows Installer!

Permite realizar una enumeración confiable de todos los programas. El registro no es confiable, pero WMI es pesado.

+0

seguro es de gran peso: si se ejecuta de forma repetida, se verá un descenso en el rendimiento como un gran peso. si una característica de mi aplicación depende de otra aplicación, y saber si está instalado correctamente, sólo necesito la clave de registro de desinstalación de 32 o 64 sólo si la aplicación es en vano en 64 bits también) por el contrario si es preciso uso wmi, me limitaré a usarlo solo una vez durante una aplicación a través de un truco de propiedad inteligente. – gg89

1

Usé el enfoque de Nicks - Necesitaba comprobar si las herramientas remotas para Visual Studio están instaladas o no, parece un poco lento, pero en un hilo separado esto está bien para mí. - aquí mi código extendido:

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 señalar que la clase Win32 WMI representa productos a medida que se instalan de Windows Installer [http://msdn.microsoft.com/en-us/library/aa394378%28v=vs.85%29.aspx].not todas las aplicaciones de uso ventanas instalador

sin embargo "SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall "representa aplicaciones para 32 bits. Para 64 bits, también debe recorrer "HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall" y dado que no todos los programas tienen una versión de 64 bits, el total de aplicaciones instaladas es una unión de claves en ambas ubicaciones que tienen "UninstallString" Valora con ellos.

pero las mejores opciones siguen siendo las mismas. Claves de registro inverso es un mejor enfoque ya que cada aplicación tiene una entrada en el registro [incluso las de Windows Installer]. Sin embargo, el método de registro es inseguro como si alguien quitara la clave correspondiente. no sabrá la entrada de la aplicación. Por el contrario, alterar HKEY_Classes_ROOT \ Installers es más complicado ya que está relacionado con problemas de licencia, como la oficina de Microsoft u otros productos. para una solución más robusta, siempre puede combinar la alternativa de registro con WMI.

+0

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

4

Acepto que enumerar a través de la clave de registro es la mejor manera.

Nota, sin embargo, que la clave dada, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", aparecerá una lista de todas las aplicaciones en una instalación de Windows de 32 bits, y aplicaciones de 64 bits en una instalación de Windows de 64 bits.

Para ver también aplicaciones de 32 bits instaladas en una instalación de Windows de 64 bits, también deberá enumerar la clave @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall".

+0

¿Estás seguro de esto? En mi Windows 10 Enterprise 64bit, las dos listas se parecen y las aplicaciones x86 aparecen en ambas. –

0

Mi requisito es comprobar si un software específico está instalado en mi sistema. Esta solución funciona como se esperaba. Puede ser que te ayude. Utilicé una aplicación para Windows en 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; 

     } 
Cuestiones relacionadas