domingo, 24 de junio de 2012

Cómo ver si un programa está instalado en nuesta PC

Utilizando el registro de windows se pueden ver todos los programas instalados en nuestra máquina (o cualquier texto que esté en la registry de windows). El código que sigue a continuación se desarrolló para buscar una serie de programas instalados en un cliente.

El llamado al método de búsqueda es algo del estilo:
reg.buscarEnLaRegistry(Registry.LocalMachine.OpenSubKey(@"SOFTWARE"), busqueda);

Siendo busqueda:
private List<RegistroWindows.itemBuscar> busqueda;

Y siendo reg
RegistroWindows reg = new RegistroWindows();

Como notarán uso Registry.LocalMachine.OpenSubKey(@"SOFTWARE") solo buscando en el nodo SOFTWARE de la registry ya que allí se encuentra el soft instalado.


using System;
using System.Collections.Generic;
using Microsoft.Win32;

namespace ProgramasInstalados.Clases
{
    /// <summary>
    /// Clase para trabajar con el registro de windows
    /// </summary>
    public class RegistroWindows
    {
        /// <summary>
        /// Item a buscar
        /// </summary>
        public class itemBuscar
        {
            /// <summary>
            /// Nombre del item o texto a buscar
            /// </summary>
            public string Nombre { get; set; }
            public bool Encontrado { get; set; }
            public string Paths { get; set; }
            public itemBuscar(string nombre)
            {
                Nombre = nombre;
                Encontrado = false;
                Paths = "";
            }
        }


        /// <summary>
        /// Busca un texto en la registry
        /// </summary>
        /// <param name="registryKey">Clave del registro donde se realiza la busqueda (y en sus nodos hijo)</param>
        /// <param name="buscar">Lista de items a buscar del tipo itemBuscar</param>
        public void buscarEnLaRegistry(RegistryKey registryKey, List<itemBuscar> buscar)
        {
            foreach (string keyName in registryKey.GetSubKeyNames())// me fijo si esta en alguna clave de este nivel
            {
                if (!ignorar(keyName))// solo veo las claves que no estan en la lista de ignorar
                {
                    try
                    {
                        using (RegistryKey rk = registryKey.OpenSubKey(keyName))
                        {
                            foreach (string valueName in rk.GetValueNames())
                            {
                                foreach (itemBuscar item in buscar)
                                {
                                    string path = "";
                                    if ((path = rk.GetValue(valueName).ToString()).ToLower().EndsWith(item.Nombre.ToLower()))// me fijo si tiene el .exe que estoy buscando
                                    {// si no esta NO lo seteo en false porque podria haberlo encontrado antes
                                        item.Encontrado = true;
                                        if (!item.Paths.Contains(path))// me fijo que ya no este cargado
                                        {
                                            item.Paths += path;
                                        }
                                    }
                                }
                            }
                            buscarEnLaRegistry(rk, buscar);// me fijo si esta en alguno de sus hijos
                        }
                    }
                    catch (Exception)
                    {
                    }
                }
            }
        }

        /// <summary>
        /// Verifica si keyName esta en la lista de ignorar (en los settings, sitting Excluir separado por comas)
        /// </summary>
        /// <param name="keyName">el string a buscar para ver si se debe ignorar</param>
        /// <returns>true si se debe ignorar, sino false</returns>
        private bool ignorar(string keyName)
        {
            foreach (string ignorar in ProgramasInstalados.Properties.Settings.Default.Excluir.Split(','))
            {
             // En settings guardo en un string separado por comas los nodos en los que no quiero
             // que se busque dentro de la registry; ya que por ejemplo el nodo Microsoft tiene
             // todos los programas que instalo Microsoft, tambien se puede evitar el nodo Windows
             // ya que tiene los programas propios de windows, entre otros. Esto hace que sea mas
             // rapida la busqueda dentro de la registry, ya que recorrerla completa si no es
             // necesario insumiria bastante tiempo.
                if (ignorar == keyName)
                {
                    return true;
                }
            }
            return false;
        }
    }
}

No hay comentarios:

Publicar un comentario