Obtenga aplicaciones instaladas en un sistema

¿Cómo instalar las aplicaciones en el sistema usando el código c #?

Iterando a través de la clave de registro “SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall” parece dar una lista completa de las aplicaciones instaladas.

Además del ejemplo a continuación, puedes encontrar una versión similar a lo que he hecho aquí .

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

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

Alternativamente, puede usar WMI como se ha mencionado:

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

Pero esto es más lento de ejecutar, y he oído que solo puede enumerar los progtwigs instalados en “ALLUSERS”, aunque eso puede ser incorrecto. También ignora los componentes y actualizaciones de Windows, que pueden ser útiles para usted.

Puedes echar un vistazo a este artículo . 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) { } } } } } 

vale la pena señalar que la clase Win32_Product WMI representa los productos tal como están instalados por Windows Installer [ http://msdn.microsoft.com/en-us/library/aa394378%28v=vs.85%29.aspx%5D.not cada aplicación usar el instalador de windows

sin embargo, “SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall” representa las aplicaciones de 32 bits. Para 64 bits, también debe recorrer “HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall” y dado que no todos los progtwigs 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 cruzadas 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, entonces 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.

Estoy de acuerdo en que enumerar a través de la clave de registro es la mejor manera.

Sin embargo, tenga en cuenta que la clave dada, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" , mostrará 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 las aplicaciones de 32 bits instaladas en una instalación de Windows de 64 bits, también debería enumerar la clave @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" .

Itera a través de las claves “HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall” y comprueba sus valores de “DisplayName”.

Puedo sugerirle que eche un vistazo a WMI ( Windows Management Instrumentation ). Si agrega la referencia de Administración del sistema a su proyecto de C #, obtendrá acceso a la clase `ManagementObjectSearcher ‘, que probablemente encuentre útil.

Hay varias clases WMI para aplicaciones instaladas , 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"); 

¡Usa la API de Windows Installer!

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

Usé el enfoque de Nicks, necesitaba verificar 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; } 

Tu mejor opción es usar WMI . Específicamente la clase Win32_Product .

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