Frage

Als ich „installierte Software“ sage, meine ich im Grunde jede Anwendung sichtbar in [Systemsteuerung] -> [Programme hinzufügen / entfernen].

Ich würde es vorziehen, es in Python zu tun, aber in C oder C ++ ist auch in Ordnung.

War es hilfreich?

Lösung

Wenn Sie die Liste der installierten Anwendungen bedeuten, die in Add \ gezeigt wird auf Software in der Systemsteuerung, können Sie es in dem Registrierungsschlüssel finden:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall

weitere Informationen darüber, wie die Registrierungsstruktur strukturiert ist gefunden Sie hier.

Sie verwenden müssen, um die winreg API in Python, die Werte lesen von die Registrierung.

Andere Tipps

Überprüfen Sie die Win32_Product WMI (Windows Management Instrumentation) Klasse. Hier ist ein Tutorial zur Verwendung von WMI in Python.

Systemsteuerung verwendet Win32 COM-API, die die offizielle Methode (siehe Google Groups, Win32)
Verlassen Sie sich nie auf Registrierung.

Das Microsoft Script Repository hat ein Skript für alle installierten Software auflistet.

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

Die beste Registry-basierte Implementierung, die ich gesehen habe, ist die von Chris Wright geschrieben (chris128) veröffentlicht unter http://www.vbforums.com/showthread.php?t=598355 . Es verwendet mehrere Registrierungsschlüssel und ist viel komplexer als eine der Antworten zur Zeit hier gepostet. Es scheint, identische Ergebnisse zum Hinzufügen zu produzieren / Software-Anwendung, und wie die ARP-App auch eine Option bietet Updates enthalten.

Auch wenn es in VB.NET implementiert ist, sollte es leicht sein, zu anderen .NET-Sprachen wie C # oder Ironpython zu konvertieren. Ich stelle mir vor, dass zunächst auf Ironpython Umwandlung sollte es in den Hafen regelmäßig Python ziemlich einfach machen, wenn das ist, was Sie wollen, aber ich konvertiert es nur zu C # selbst und dann den Code ein bisschen aufgeräumt.

Nur ein kleiner Fehler hinweisen: GetUserInstallerKeyPrograms () hinzufügen, nicht die Version für Anwenderprogramme auf der Liste, obwohl sie es extrahiert. Das ist einfach, obwohl zu beheben.

C # -Code für die Liste der installierten Software immer mit WMI in xp und win7 (wmi ist der einzige Weg, in win7)

    WqlObjectQuery wqlQuery =
      new WqlObjectQuery("SELECT * FROM Win32_Product");
        ManagementObjectSearcher searcher =
            new ManagementObjectSearcher(wqlQuery);

        foreach (ManagementObject software in searcher.Get()) {
            Console.WriteLine(software["Caption"]);
        }

Ich weiß, diese Frage ist alt, erwähnte die OP XP und auch Python, C oder C ++ erwähnt, aber ich fand, dass eine Vielzahl von Informationen im Netz zu diesem Thema entweder unvollständig oder falsch ist. Ein Beispiel des letzteren ist der Vorschlag WMI zu verwenden - insbesondere die Win32_Product Klasse; jedoch, wie erwähnt an anderer Stelle ist, dass Verfahren ist langsam , zum Teil, weil es glauben oder nicht, fand jeder MSI läuft tatsächlich seine Reparatur. Ich nenne diese Lösung falsch, weil, wie quälend langsam ist und wegen seiner unangenehmen Nebeneffekt. Zum Beispiel haben Sie sich bereits ein Programm der Windows-Dienst, sondern ruft select * from Win32_Product als Teil sicherzustellen, dass die MSI-Reparatur ausgeführt wird, wird offenbar den Dienst aktivieren wieder zu deaktivieren.

Für das, was es wert ist, unten ist, was ich die vollständigste Beispiel auf dem Laufenden sein, wäre zu prüfen, wenn auch in C # (ich es gegen Rahmen zusammengestellt 4.6.1 aber niedrigere Versionen können auch funktionieren.) Es listet 32-Bit- und 64 -Bit-Programme installiert; es verfügt Registry-Schlüssel, die es verwendet und es läuft in weniger als eine Sekunde, zumindest nach dem Caching von Kicks in. Wenn Sie Verbesserungen bieten können, bitten sie vorschlagen, anstatt nur Downvoting, und ich werde den Code aktualisieren.

Eine Sache, es ist immer noch fehlen einige Updates. Zum Beispiel, wenn ich laufe es auf meinem Windows-10-System und vergleichen Sie es mit der Systemsteuerung | Programme und Funktionen | Installierte Updates, merke ich, dass es nicht Security Update for Adobe Flash Player aus irgendeinem Grunde nicht zeigen.

Ich habe keinen guten Grund für die anonyme Methode, es ist nur, wie ich damals dachte -. Eine Art von Verfahren-in-a-Methode Lösung

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;
    }
}

[Sigh] und dann sah ich @ PolyTekPatrick Antwort. Wie habe ich verpasst das? LOL

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top