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