Python 已安装程序的列表

Python 已安装程序的列表,python,winapi,pywin32,Python,Winapi,Pywin32,我使用register和Win32_Product类中的搜索来获取计算机上安装的程序列表,但它并没有给出所有程序,我在C++中看到过与控制面板的程序和组件中给出相同结果的程序。有没有python的api可以给我同样的结果。 这是c++的代码 我就是这么用的: 导入win32com.client strComputer = "." objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator") objSWbemServi

我使用register和Win32_Product类中的搜索来获取计算机上安装的程序列表,但它并没有给出所有程序,我在C++中看到过与控制面板的程序和组件中给出相同结果的程序。有没有python的api可以给我同样的结果。 这是c++的代码 我就是这么用的: 导入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)
和whis注册表:

 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

使用
KEY\u WOW64\u 32KEY
KEY\u WOW64\u 64KEY
检查32位和64位注册表。此外,一些安装程序将使用
HKEY\U CURRENT\U USER
,尽管后者很少使用

注意,pywin32的
queryvaluex
返回一个元组,该元组中的第一个元素包含所需的字符串
QueryInfoKey
返回其第一个元素为子键总数的元组

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)

使用
KEY\u WOW64\u 32KEY
KEY\u WOW64\u 64KEY
检查32位和64位注册表。此外,一些安装程序将使用
HKEY\U CURRENT\U USER
,尽管后者很少使用

注意,pywin32的
queryvaluex
返回一个元组,该元组中的第一个元素包含所需的字符串
QueryInfoKey
返回其第一个元素为子键总数的元组

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)

稍有改进的版本,无需win32con导入,即可检索软件版本和发布者。感谢Barmak Shemirani的初步回答:)

[编辑] 免责声明:本文中的代码已经过时。 我已将该代码作为python包发布。 使用
pip安装windows\u工具安装。已安装的\u软件

用法:

from windows_tools.installed_software import get_installed_software

for software in get_installed_software():
    print(software['name'], software['version'], software['publisher'])
[/编辑]

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))

稍有改进的版本,无需win32con导入,即可检索软件版本和发布者。感谢Barmak Shemirani的初步回答:)

[编辑] 免责声明:本文中的代码已经过时。 我已将该代码作为python包发布。 使用
pip安装windows\u工具安装。已安装的\u软件

用法:

from windows_tools.installed_software import get_installed_software

for software in get_installed_software():
    print(software['name'], software['version'], software['publisher'])
[/编辑]

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))

并非所有应用程序都需要安装,因此未在操作系统中注册,因此无论您采取何种方法,除了扫描整个硬盘以查找EXE文件外,都无法找到所有内容。请确保同时读取
软件\Microsoft\Windows\CurrentVersion\Uninstall
的32位和64位分支。是
KEY\u WOW64\u 32KEY
来显式访问32位分支,还是
KEY\u WOW64\u 64KEY
来显式访问64位分支。@zett42这些密钥不是包含完全相同的内容吗?不是所有的应用程序都需要安装,所以没有在操作系统中注册,所以无论您采取什么方法,除了扫描整个硬盘以查找EXE文件外,您将无法找到所有内容。请确保同时读取
SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
的32位和64位分支。是
KEY\u WOW64\u 32KEY
来显式访问32位分支,还是
KEY\u WOW64\u 64KEY
来显式访问64位分支。@zett42这些键不是包含完全相同的内容吗?是否有一个选项来查找允许它们运行的所有exe模块?我可以获取安装它们的文件夹的名称,但无法获取exe模块的确切名称…不,无法可靠地做到这一点。您可以检查“DisplayIcon”以查看它是否是exe文件,它可能指向主应用程序。安装程序需要将“InstallLocation”位置放在卸载键中,主exe(如果有)可以位于该文件夹中的任何位置。有些安装程序甚至不遵守规则。是否有一个选项可以找到允许它们运行的所有exe模块?我可以获取安装它们的文件夹的名称,但无法获取exe模块的确切名称…不,无法可靠地做到这一点。您可以检查“DisplayIcon”以查看它是否是exe文件,它可能指向主应用程序。安装程序需要将“InstallLocation”位置放在卸载键中,主exe(如果有)可以位于该文件夹中的任何位置。有些安装人员甚至不遵守规则。谢谢你的回答,我希望有一天我能完成我的项目。谢谢你的回答,我希望有一天我能完成我的项目。