Obtener aplicaciones instaladas en un sistema.

Resuelto Sauron asked hace 15 años • 15 respuestas

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

Sauron avatar May 26 '09 10:05 Sauron
Aceptado

La iteración de la clave de registro "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" parece proporcionar una lista completa de las aplicaciones instaladas.

Aparte del ejemplo siguiente, puedes encontrar una versión similar a la que he hecho aquí .

Este es un ejemplo aproximado, probablemente querrás hacer algo para eliminar las 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"));
        }
    }
}

Alternativamente, puede usar WMI como se mencionó:

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

Pero esto es bastante más lento de ejecutar y he oído que solo puede enumerar los programas instalados en "TODOS LOS USUARIOS", aunque eso puede ser incorrecto. También ignora los componentes y actualizaciones de Windows, lo que puede resultarle útil.

Xiaofu avatar May 26 '2009 04:05 Xiaofu

Quería poder extraer una lista de aplicaciones tal como aparecen en el menú de inicio. Al usar el registro, obtenía entradas que no aparecen en el menú de inicio.

También quería encontrar la ruta del archivo ejecutable y extraer un ícono para eventualmente crear un iniciador atractivo. Desafortunadamente, con el método de registro esto es una especie de impredecible ya que mis observaciones son que esta información no está disponible de manera confiable.

Mi alternativa se basa en el shell:AppsFolder al que puedes acceder ejecutando explorer.exe shell:appsFoldery que enumera todas las aplicaciones, incluidas las de la tienda, actualmente instaladas y disponibles a través del menú de inicio. El problema es que se trata de una carpeta virtual a la que no se puede acceder con System.IO.Directory. En su lugar, tendría que utilizar comandos nativos de shell32. Afortunadamente, Microsoft publicó Microsoft.WindowsAPICodePack-Shell en Nuget, que es un contenedor para los comandos antes mencionados. Dicho lo suficiente, aquí está el código:

// GUID taken from https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid
var FOLDERID_AppsFolder = new Guid("{1e87508d-89c2-42f0-8a7e-645a0f50ca58}");
ShellObject appsFolder = (ShellObject)KnownFolderHelper.FromKnownFolderId(FOLDERID_AppsFolder);

foreach (var app in (IKnownFolder)appsFolder)
{
    // The friendly app name
    string name = app.Name;
    // The ParsingName property is the AppUserModelID
    string appUserModelID = app.ParsingName; // or app.Properties.System.AppUserModel.ID
    // You can even get the Jumbo icon in one shot
    ImageSource icon =  app.Thumbnail.ExtraLargeBitmapSource;
}

Y eso es todo. También puedes iniciar las aplicaciones usando

System.Diagnostics.Process.Start("explorer.exe", @" shell:appsFolder\" + appModelUserID);

Esto funciona para aplicaciones Win32 normales y aplicaciones de la tienda UWP. ¿Qué tal esas manzanas?

Dado que está interesado en enumerar todas las aplicaciones instaladas, es razonable esperar que también desee monitorear las aplicaciones nuevas o desinstaladas, lo cual puede hacer usando ShellObjectWatcher:

ShellObjectWatcher sow = new ShellObjectWatcher(appsFolder, false);
sow.AllEvents += (s, e) => DoWhatever();
sow.Start();

Editar: También podría interesarle saber que el AppUserMoedlID mencionado anteriormente es el ID único que utiliza Windows para agrupar ventanas en la barra de tareas .

2022: Probado en Windows 11 y todavía funciona muy bien. Windows 11 también parece almacenar en caché las aplicaciones que no están instaladas per se, aplicaciones portátiles que no necesitan instalación, por ejemplo. Aparecen en los resultados de búsqueda del menú de inicio y también se pueden recuperar desde allí shell:appsFolder.

user1969903 avatar Jul 25 '2019 05:07 user1969903

Estoy de acuerdo en que enumerar la clave de registro es la mejor manera.

Sin embargo, tenga en cuenta@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" que la clave proporcionada enumerará todas las aplicaciones en una instalación de Windows de 32 bits y las 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á enumerar la clave @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall".

Stephen Walter avatar May 19 '2016 04:05 Stephen Walter

Puedes echar un vistazo a este artículo . Hace uso del 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)
                { }
            }
        }
    }
}
Kirtan avatar May 26 '2009 04:05 Kirtan