Windows XP에 설치된 모든 응용 프로그램을 열거/목록하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/802499

문제

"설치된 응용 프로그램"이라고 말하면 기본적으로 [제어판]-> [프로그램 추가/제거]에 보이는 응용 프로그램을 의미합니다.

나는 파이썬에서 그것을 선호하지만 C 또는 C ++도 괜찮습니다.

도움이 되었습니까?

해결책

제어판에서 add remove 프로그램에 표시된 설치된 응용 프로그램 목록을 의미하는 경우 레지스트리 키에서 찾을 수 있습니다.

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall

레지스트리 트리가 어떻게 구성되어 있는지에 대한 자세한 정보는 여기에서 찾을 수 있습니다..

당신은 그것을 사용해야합니다 Winreg API Python에서 레지스트리에서 값을 읽습니다.

다른 팁

확인하십시오 Win32_Product WMI (Windows Management Instrumentation) 클래스. 다음은 튜토리얼입니다 파이썬에서 WMI를 사용합니다.

제어판은 공식 방법 인 Win32 COM API를 사용합니다 (Google Groups, Win32 참조)
레지스트리에 의존하지 마십시오.

Microsoft 스크립트 저장소에는 설치된 모든 소프트웨어를 나열하기위한 스크립트가 있습니다.

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

내가 본 최고의 레지스트리 기반 구현은 Chris Wright (Chris128)가 게시 한 것입니다. http://www.vbforums.com/showthread.php?t=598355. 여러 레지스트리 키를 사용하며 현재 게시 된 답변보다 훨씬 더 복잡합니다. Add/Remain 프로그램 앱과 동일한 결과를 생성하는 것으로 보이며 ARP 앱과 마찬가지로 업데이트를 포함하는 옵션도 제공합니다.

vb.net에서 구현되었지만 C# 또는 Ironpython과 같은 다른 .NET 언어로 쉽게 변환 할 수 있어야합니다. 먼저 Ironpython으로 변환하면 원하는 경우 일반 Python으로 포트가 쉽게 포트가되기 쉽지만 C# 직접 C#로 변환 한 다음 코드를 약간 정리했습니다.

지적 할 작은 버그 중 하나만 : GetUserInstallerKeyPrograms ()는 추출하더라도 사용자 프로그램의 버전을 목록에 추가하지 않습니다. 그래도 해결하기 쉽습니다.

XP 및 Win7에서 WMI를 사용하여 설치된 소프트웨어 목록을 얻기위한 C#.NET 코드 (WMI는 Win7의 유일한 방법입니다)

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

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

나는이 질문이 오래되었음을 알고 있습니다. OP는 XP를 언급했으며 Python, C 또는 C ++도 언급했지만이 주제에 대한 인터넷에 대한 많은 정보가 불완전하거나 부정확하다는 것을 알았습니다. 후자의 예는 WMI-Specile을 사용하라는 제안입니다. Win32_Product 수업; 그러나 다른 곳에서 언급 한 바와 같이, 그 방법은 느린, 부분적으로 믿거 나 말거나, 발견 된 각 MSI는 실제로 수리를 실행합니다. 나는 그 솔루션을 얼마나 고통스럽게 느리게하고 불쾌한 부작용으로 인해 그 솔루션을 잘못 부릅니다. 예를 들어, 이미 프로그램의 Windows 서비스를 비활성화하기로 선택했지만 select * from Win32_Product, MSI 수리가 실행되도록 보장의 일환으로 서비스를 다시 활성화 할 수 있습니다.

가치가있는 것은 아래에서 가장 완전한 예라고 생각하는 것입니다. C# (프레임 워크 4.6.1에 대해 편집했지만 더 낮은 버전도 작동 할 수 있습니다.) 32 비트 및 64 비트 설치가 나열되어 있습니다. 프로그램들; 그것은 사용하는 레지스트리 키를 처분하고 적어도 캐싱이 시작된 후 1 초 안에 실행됩니다. 개선을 제공 할 수 있다면 다운 투보 대신 제안 해 주시면 코드를 업데이트하겠습니다.

한 가지 ~이다 여전히 누락 된 것은 일부 업데이트입니다. 예를 들어, Windows 10 시스템에서 실행하고 제어판과 비교할 때 | 프로그램 및 기능 | 설치된 업데이트, 나는 그것이 표시되지 않는다는 것을 알았습니다. Security Update for Adobe Flash Player 몇 가지 이유.

익명의 방법에 대한 충분한 이유가 없으며, 그 당시에 생각하는 방식, 방법이 방법의 방법입니다.

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

한숨] 그리고 나는 @polytekpatrick의 대답입니다. 내가 어떻게 그리워 했어? ㅋㅋㅋ

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top