通过winreg获取软件安装路径

问题描述

我正在尝试获取系统中安装的每个应用程序的安装目录,然后我会将这些目录存储在记事本或任何地方,然后访问该目录。所以基本上我想构建一个像 cortana 这样的 python 应用程序,它打开我系统中安装的任何应用程序并打开它。所以这就是我的想法

  1. 在winreg的帮助下从reg获取安装路径
  2. 然后存储它
  3. 然后使用其他 py 程序访问它,输入应用程序名称并在该文件搜索,复制该特定应用程序的整个路径,然后将其发送到具有 os.open 和 application start 的 python 文件

我会将数据存储在 sqllite3 或 txt 文件中。

下面的代码不显示任何内容

import winreg

def app(hive,flag):
    areg=winreg.ConnectRegistry(None,hive)
    akey=winreg.OpenKey(areg,r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",winreg.KEY_READ | flag)
    subkey=winreg.QueryInfoKey(akey)[0]
    soft_list=[]
    for i in range(subkey):
        soft={}
        try:
            soft['path']=winreg.QueryValueEx(subkey,"InstallSource")[0]
        except:
            soft['path']="null"
        soft_list.append(soft)
    return soft_list

soft_list = app(winreg.HKEY_LOCAL_MACHINE,winreg.KEY_WOW64_32KEY) + app(winreg.HKEY_LOCAL_MACHINE,winreg.KEY_WOW64_64KEY) + app(winreg.HKEY_CURRENT_USER,0)

for software in soft_list:
    print (software['path'])
print(len(soft_list))

下面的代码可以正常工作,但不能显示所有应用程序

import winreg

def foo(hive,flag):
    aReg = winreg.ConnectRegistry(None,hive)
    aKey = winreg.OpenKey(aReg,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['i']=winreg.QueryValueEx(asubkey,"InstallSource")[0]
            except EnvironmentError:
                software['i'] = winreg.QueryValueEx(asubkey,"InstallSource")[0]

            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 (software['name'],software['i'])
print('Number of installed apps: %s' % len(software_list))

下面的代码显示所有应用程序(352个应用程序)但是当我添加路径时代码不显示所有应用程序(205)

import winreg

def foo(hive,"displayName")[0]



            software_list.append(software)
        except EnvironmentError:
            continue

    return software_list

software_list = foo(winreg.HKEY_LOCAL_MACHINE,0)

for software in software_list:
    print (software['name'])
print('Number of installed apps: %s' % len(software_list))

解决方法

您的问题没有好的答案。 您不会从注册表中找到所有安装路径。 此外,InstallSource 不会是安装路径,但它是源代码,并且经常丢失。

顺便说一句,我写了一个包来完成你上面编码的事情,叫做 windows_tools.installed_software

from windows_tools.installed_software import get_installed_software

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

根据我的经验,没有什么好方法可以在 windows 下列出所有已安装的程序。 您可能需要结合各种来源,例如 WMI、注册表,也许还需要遍历 program filesprogram files (x86)

通过 WMI 获取数据的一种方法:

from windows_tools.wmi_queries import query_qmi

product = query_wmi('SELECT * FROM Win32_Product','cimv2','test_query',can_be_skipped=False)
for product in products:
    print(product)

祝你好运。

,

由于 anshul raj 要求一种获取所有可执行文件的方法以查找安装了哪些程序,因此这里提供了该问题的解决方案。 尽管如此,这只会列出路径中的所有可执行文件,并且会为具有多个可执行文件的现有程序产生大量结果。

from ofunctions.file_utils import get_files_recursive

program_paths = [r'C:\Program Files',r'C:\Program Files (x86)']

executables = []
for program_path in program_paths:
    executables += get_files_recursive(program_path,ext_include_list=['.exe'])

print(executables)

免责声明:我是 ofunctions 模块的作者