none
Detectar aplicaciones y servicios windows instalados RRS feed

  • Pregunta

  • Hola,

     

    para consultar las aplicaciones instaladas, he visto en foros que hay que consultar la clave de la aplicación que aparece en SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\

     

    Qué pasaría si se desinstala la aplicación, se eliminaría el valor de la clave correspondiente ?? En algún foro leí que no se eliminaba, y por tanto, cómo podríamos saber si una aplicación (que buscamos por su nombre) está instalada, no éstá instalada, o se ha desinstalado ??

     

    Para los servicios windows, cómo podemos determinar que están instalados ?? Utilizando ServiceController o WMI ???

     

    Saludos.

     

    Código de Lluis Franco

     

    private void TestEnumsoftware()
    {
        var apps = from a in EnumSoftware() orderby a select a;
        foreach (string app in apps)
        {
            Console.WriteLine(app);
        }
    }
     
    private List<string> EnumSoftware()
    {
        List<string> apps = new List<string>();
        const uint HKEY_LOCAL_MACHINE = unchecked((uint)0x80000002);
        ManagementClass wmiRegistry = new ManagementClass("root/default", "StdRegProv", null);
        string keyPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
        object[] methodArgs = new object[] {HKEY_LOCAL_MACHINE, keyPath, null};
        uint returnValue = (uint)wmiRegistry.InvokeMethod("EnumKey", methodArgs);
        if (null != methodArgs[2])
        {
            string[] subKeys = methodArgs[2] as String[];
            if (subKeys == null) return apps;
            ManagementBaseObject inParam =
            wmiRegistry.GetMethodParameters("GetStringValue");
            inParam["hDefKey"] = HKEY_LOCAL_MACHINE;
            string keyName = "";
     
            foreach (string subKey in subKeys)
            {
                keyPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" +
                subKey;
                keyName = "DisplayName";
                inParam["sSubKeyName"] = keyPath;
                inParam["sValueName"] = keyName;
                ManagementBaseObject outParam =
                wmiRegistry.InvokeMethod("GetStringValue", inParam, null);
     
                if ((uint)outParam["ReturnValue"] == 0)
                    apps.Add(outParam["sValue"].ToString());
            }
        }
        return apps;
    }
     

     

     

    martes, 30 de septiembre de 2008 18:37

Respuestas