List of installed programs

人盡茶涼 提交于 2019-12-11 22:25:40

问题


I use the search in the register and the Win32_Product class to get the list of the programs installed on the computer, but it doesn’t give all the programs, I’ve seen programs in C ++ that give the same results as in the programs and components of the control panel. Is there any api for python that can give me the same result. Here is the code for c ++ https://www.codeproject.com/Articles/6791/How-to-get-a-list-of-installed-applications That's what i use: 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("Name: ", objItem.Name)

And whis registry:

 aReg = ConnectRegistry(None, HKEY_LOCAL_MACHINE)
                    aKey = OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")
                    for i in range(1024):
                        try:
                            asubkey_name = EnumKey(aKey, i)
                            asubkey = OpenKey(aKey, asubkey_name)
                            val = str(QueryValueEx(asubkey, "DisplayName"))
                            b = "!@#$,01'"
                            for char in b:
                                val = val.replace(char, "")
                            r = len(val)
                            val = str(val[1:r - 2])
                            val2 = str(QueryValueEx(asubkey, "DisplayIcon"))
                            if s.lower() in val.lower():
                                r = len(val2)
                                val2 = str(val2[2:r - 5])
                                # print(val2)
                                subprocess.Popen(val2)
                                break
                            # print(val, val2)
                        except EnvironmentError:
                            continue

回答1:


Check both 32-bit and 64-bit registry using KEY_WOW64_32KEY and KEY_WOW64_64KEY. In addition, some installers will use HKEY_CURRENT_USER, although the latter is rarely used.

Note, pywin32's QueryValueEx returns an tuple, the first element in that tuple contains the required string. QueryInfoKey returns a tuple whose first element is the total number of subkeys.

def foo(hive, flag):
    aReg = winreg.ConnectRegistry(None, hive)
    aKey = winreg.OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", 
                          0, win32con.KEY_READ | flag)

    count_subkey = winreg.QueryInfoKey(aKey)[0]
    for i in range(count_subkey):
        try:
            asubkey_name = winreg.EnumKey(aKey, i)
            asubkey = winreg.OpenKey(aKey, asubkey_name)
            val = winreg.QueryValueEx(asubkey, "DisplayName")[0]
            print(val)
        except EnvironmentError:
            continue

foo(win32con.HKEY_LOCAL_MACHINE, win32con.KEY_WOW64_32KEY)
foo(win32con.HKEY_LOCAL_MACHINE, win32con.KEY_WOW64_64KEY)
foo(win32con.HKEY_CURRENT_USER, 0)



回答2:


Slightly improved version that works without win32con import and retrieves software version and publisher. Thanks Barmak Shemirani for his initial answer :)

import winreg

def foo(hive, flag):
    aReg = winreg.ConnectRegistry(None, hive)
    aKey = winreg.OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
                          0, winreg.KEY_READ | flag)

    count_subkey = winreg.QueryInfoKey(aKey)[0]

    software_list = []

    for i in range(count_subkey):
        software = {}
        try:
            asubkey_name = winreg.EnumKey(aKey, i)
            asubkey = winreg.OpenKey(aKey, asubkey_name)
            software['name'] = winreg.QueryValueEx(asubkey, "DisplayName")[0]

            try:
                software['version'] = winreg.QueryValueEx(asubkey, "DisplayVersion")[0]
            except EnvironmentError:
                software['version'] = 'undefined'
            try:
                software['publisher'] = winreg.QueryValueEx(asubkey, "Publisher")[0]
            except EnvironmentError:
                software['publisher'] = 'undefined'
            software_list.append(software)
        except EnvironmentError:
            continue

    return software_list

software_list = foo(winreg.HKEY_LOCAL_MACHINE, winreg.KEY_WOW64_32KEY) + foo(winreg.HKEY_LOCAL_MACHINE, winreg.KEY_WOW64_64KEY) + foo(winreg.HKEY_CURRENT_USER, 0)

for software in software_list:
    print('Name=%s, Version=%s, Publisher=%s' % (software['name'], software['version'], software['publisher']))
print('Number of installed apps: %s' % len(software_list))


来源:https://stackoverflow.com/questions/53132434/list-of-installed-programs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!