Cuando digo «aplicaciones instaladas», que básicamente significa cualquier aplicación visible en [Panel de Control]->[Agregar/Quitar Programas].

Yo prefiero hacerlo en Python, pero C o C++ también está bien.

¿Cómo se define «aplicaciones instaladas»?
Aclaración añadido

OriginalEl autor sharkin | 2009-04-29

7 Comentarios

  1. 11

    Si te refieres a la lista de aplicaciones instaladas que se muestra en Agregar o Quitar Programas en el panel de control, usted lo puede encontrar en la clave del registro:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall

    más información acerca de cómo el árbol del registro está estructurado se puede encontrar aquí.

    Que usted necesita para utilizar el winreg API en python para leer los valores del registro.

    Dang. se me pegaba a él.
    Que la clave está vacío en mi sistema. Compruebe el sistema operativo lsiting en la parte inferior de su enlace y verás que no es para WinXP.
    esta clave del registro contiene una gran cantidad de sub-claves (sub carpetas). Cada uno representa un programa en la lista de desinstalación. Por favor, lea acerca de la estructura de la tecla en el mencionado enlace.
    Sí, lo siento, yo los encuentro en que la clave de registración en realidad, mi sistema se congeló por un tiempo y me hizo un rápido judegement desde el enlace que te dio no mencionar a XP. Supongo que el artículo es simplemente viejo.
    Se utiliza tanto en XP y Vista: vistax64.com/attachments/tutorials/…

    OriginalEl autor Aziz

  2. 10

    Retirar el Win32_Product WMI (Instrumental de Administración de Windows) de la clase. Aquí un tutorial sobre el uso de WMI en Python.

    La segunda esta. Acostumbrarse a la WMI le ayudará con otras ventanas de administración de las tareas relacionadas. Hace poco me escribió un ejemplo de cómo utilizar la WMI de C++. blog.emptycrate.com/node/376
    Hay algunas advertencias, sin embargo. WMI puede ser deshabilitado en algunos PCs. También, no una lista de todas las aplicaciones visibles en el applet del Panel de Control — sólo los instalados por una compatible con el instalador.

    OriginalEl autor Tamas Czinege

  3. 8

    Panel de Control utiliza Win32 api de COM, que es el método oficial (ver Grupos de Google, Win32)

    Nunca confíe en el registro.

    +1 para el «nunca confíes en el registro»
    Muchos años de retraso, pero -1 por no decir que COM API se utiliza. Un grupo de usenet es grande; decir «ir a Google de que» en una respuesta no es lo suficientemente bueno.
    Panel de Control utiliza la API de COM pero supongo que la API, a continuación, lee el registro. Que indirectamente significa que se basan en el registro.

    OriginalEl autor

  4. 6

    Las secuencias de Comandos de Microsoft Repositorio tiene un script para listar todos los programas instalados.

    import win32com.client
    strComputer = "."
    objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
    objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")
    colItems = objSWbemServices.ExecQuery("Select * from Win32_Product")
    for objItem in colItems:
        print "Caption: ", objItem.Caption
        print "Description: ", objItem.Description
        print "Identifying Number: ", objItem.IdentifyingNumber
        print "Install Date: ", objItem.InstallDate
        print "Install Date 2: ", objItem.InstallDate2
        print "Install Location: ", objItem.InstallLocation
        print "Install State: ", objItem.InstallState
        print "Name: ", objItem.Name
        print "Package Cache: ", objItem.PackageCache
        print "SKU Number: ", objItem.SKUNumber
        print "Vendor: ", objItem.Vendor
        print "Version: ", objItem.Version

    OriginalEl autor John Fouhy

  5. 4

    El mejor registro basado en la aplicación que he visto es la que está escrita por Chris Wright (chris128) publicado en http://www.vbforums.com/showthread.php?t=598355. Utiliza varias claves del registro y es mucho más compleja que cualquiera de las respuestas que actualmente publicados aquí. Parece producir resultados idénticos a los de la opción Agregar/Quitar Programas de la aplicación, y como parte de la ARP de la aplicación también proporciona una opción para incluir las actualizaciones.

    Aunque se implementa en VB.NET, debe ser fácil de convertir a otros .NET lenguajes de programación como C# o IronPython. Me imagino que la conversión a IronPython primero que debe hacer es bastante fácil de puerto regulares de Python si eso es lo que quieres, pero yo sólo convertida a C# a mí mismo y, a continuación, limpiar el código un poco.

    Sólo un pequeño error: GetUserInstallerKeyPrograms() no añadir la versión para programas de usuario a la lista, aunque lo extrae. Esto es fácil de arreglar, aunque.

    Gracias, esta es la más útil.

    OriginalEl autor PolyTekPatrick

  6. 3

    C#.net código para obtener la lista de software instalado mediante WMI en xp y win7(wmi es la única manera en win7)

        WqlObjectQuery wqlQuery =
          new WqlObjectQuery("SELECT * FROM Win32_Product");
            ManagementObjectSearcher searcher =
                new ManagementObjectSearcher(wqlQuery);
    
            foreach (ManagementObject software in searcher.Get()) {
                Console.WriteLine(software["Caption"]);
            }

    OriginalEl autor mujjiga

  7. 0

    Sé que esta pregunta es viejo, el OP mencionado XP y también se menciona Python, C o C++, pero me pareció que una gran cantidad de información en la red sobre este tema está incompleto o incorrecto. Un ejemplo de esto último es la sugerencia de utilizar WMI-en concreto, la Win32_Product clase; sin embargo, como se ha señalado en otra parte, que el método es lento, en parte porque, lo creas o no, cada uno de MSI encontrado realmente ejecuta su reparación. Yo llamo a esto la solución incorrecta debido a la forma dolorosamente lento que es y el porque de sus desagradables efectos secundarios. Por ejemplo, ya ha optado por deshabilitar un programa del servicio de Windows, pero llamando select * from Win32_Product, como parte de garantizar que la MSI reparación de pistas, al parecer, volver a habilitar el servicio.

    Para lo que vale, la de abajo es lo que yo considero el más completo ejemplo hasta la fecha, aunque en C# (he compilado en contra de Marco 4.6.1 pero inferior versiones puede trabajar demasiado.) Las listas de 32 bits y de 64 bits de los programas instalados; dispone claves del registro que se usa y se ejecuta en menos de un segundo, al menos después de la caché se dispara. Si usted puede ofrecer mejoras, por favor, sugiera a ellos en vez de sólo downvoting, y voy a actualizar el código.

    Una cosa es es todavía faltan algunas actualizaciones. Por ejemplo, cuando lo ejecuto en mi Windows 10 sistema y compararlo con Panel de Control | Programas y Características | Actualizaciones Instaladas, me doy cuenta de que no muestra Security Update for Adobe Flash Player por alguna razón.

    No tengo ninguna buena razón para que el método anónimo, es la forma en que yo estaba pensando en el momento, una especie de método-dentro-de-un-método de solución.

    using System;
    using System.Collections.Generic;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Text.RegularExpressions;
    using Microsoft.Win32;
    class Program
    {
    static void Main(string[] args)
    {
    var result = InstalledProgram.GetAllInstalledPrograms();
    result.Sort((a, b) => a.DisplayName.CompareTo(b.DisplayName));
    foreach(var program in result)
    {
    if(!program.IsSystemComponent && !program.IsKB) Console.WriteLine(program.Dump());
    }
    }
    }
    public enum PlatformTypes
    {
    x86,
    amd64
    }
    public class InstalledProgram
    {
    [DllImport("advapi32.dll")]
    extern public static int RegQueryInfoKey(
    Microsoft.Win32.SafeHandles.SafeRegistryHandle hkey,
    StringBuilder lpClass,
    ref uint lpcbClass,
    IntPtr lpReserved,
    IntPtr lpcSubKeys,
    IntPtr lpcbMaxSubKeyLen,
    IntPtr lpcbMaxClassLen,
    IntPtr lpcValues,
    IntPtr lpcbMaxValueNameLen,
    IntPtr lpcbMaxValueLen,
    IntPtr lpcbSecurityDescriptor,
    out long lpftLastWriteTime
    );
    public string DisplayName { get; private set; }
    public string UninstallString { get; private set; }
    public string KBNumber { get; private set; }
    public string DisplayIcon { get; private set; }
    public string Version { get; private set; }
    public DateTime InstallDate { get; private set; }
    public PlatformTypes Platform { get; private set; }
    public bool IsSystemComponent { get; private set; }
    public bool IsKB { get { return !string.IsNullOrWhiteSpace(KBNumber); } }
    public static List<InstalledProgram> GetAllInstalledPrograms()
    {
    var result = new List<InstalledProgram>();
    Action<PlatformTypes, RegistryKey, string> getRegKeysForRegPath = (platform, regBase, path) =>
    {
    using(var baseKey = regBase.OpenSubKey(path))
    {
    if(baseKey != null)
    {
    string[] subKeyNames = baseKey.GetSubKeyNames();
    foreach(string subkeyName in subKeyNames)
    {
    using(var subKey = baseKey.OpenSubKey(subkeyName))
    {
    object o;
    o = subKey.GetValue("DisplayName");
    string displayName = o != null ? o.ToString() : "";
    o = subKey.GetValue("UninstallString");
    string uninstallString = o != null ? o.ToString() : "";
    o = subKey.GetValue("KBNumber");
    string kbNumber = o != null ? o.ToString() : "";
    o = subKey.GetValue("DisplayIcon");
    string displayIcon = o != null ? o.ToString() : "";
    o = subKey.GetValue("DisplayVersion");
    string version = o != null ? o.ToString() : "";
    o = subKey.GetValue("InstallDate");
    DateTime installDate = o != null ? parseInstallDate(o.ToString()) : default(DateTime);
    o = subKey.GetValue("SystemComponent");
    bool isSystemComponent = o != null ? o.ToString() == "1" : false;
    //Sometimes, you need to get the KB number another way.
    if(kbNumber == "")
    {
    var match = Regex.Match(displayName, @".*?\((KB\d+?)\).*");
    if(match.Success) kbNumber = match.Groups[1].ToString();
    }
    //Sometimes, the only way you can get install date is from the last write
    //time on the registry key.
    if(installDate == default(DateTime))
    {
    string keyFull = baseKey + "\\" + subkeyName + "\\DisplayVersion";
    var sb = new StringBuilder(64);
    uint sbLen = 65;
    RegQueryInfoKey(
    subKey.Handle
    , sb
    , ref sbLen
    , IntPtr.Zero
    , IntPtr.Zero
    , IntPtr.Zero
    , IntPtr.Zero
    , IntPtr.Zero
    , IntPtr.Zero
    , IntPtr.Zero
    , IntPtr.Zero
    , out long lastWriteTime);
    installDate = DateTime.FromFileTime(lastWriteTime);
    }
    if(displayName != "" && uninstallString != "")
    {
    result.Add(new InstalledProgram
    {
    DisplayName = displayName,
    UninstallString = uninstallString,
    KBNumber = kbNumber,
    DisplayIcon = displayIcon,
    Version = version,
    InstallDate = installDate,
    Platform = platform,
    IsSystemComponent = isSystemComponent
    });
    }
    }
    }
    }
    }
    };
    getRegKeysForRegPath(PlatformTypes.amd64, Registry.LocalMachine, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
    getRegKeysForRegPath(PlatformTypes.amd64, Registry.CurrentUser, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
    if(Environment.Is64BitOperatingSystem)
    {
    getRegKeysForRegPath(PlatformTypes.x86, Registry.LocalMachine, @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
    getRegKeysForRegPath(PlatformTypes.x86, Registry.CurrentUser, @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
    }
    return result;
    }
    public string Dump()
    {
    return Platform + "\t" + DisplayName + "\t" + InstallDate + "\t" + DisplayIcon + "\t" + Version + "\t" + KBNumber + "\t" + UninstallString;
    }
    private static DateTime parseInstallDate(string installDateStr)
    {
    DateTime.TryParseExact(
    installDateStr
    , format: "yyyyMMdd"
    , provider: new System.Globalization.CultureInfo("en-US")
    , style: System.Globalization.DateTimeStyles.None
    , result: out DateTime result);
    return result;
    }
    public override string ToString()
    {
    return DisplayName;
    }
    }

    [Suspiro] y, a continuación, vi a @PolyTekPatrick la respuesta. ¿Cómo me olvido de que? LOL

    OriginalEl autor Craig Silver

Dejar respuesta

Please enter your comment!
Please enter your name here