首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过winreg获取软件安装路径

通过winreg获取软件安装路径
EN

Stack Overflow用户
提问于 2021-04-18 11:30:24
回答 2查看 442关注 0票数 0

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

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

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

下面的代码没有显示任何内容

代码语言:javascript
复制
import winreg

def app(hive, flag):
    areg=winreg.ConnectRegistry(None,hive)
    akey=winreg.OpenKey(areg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
                          0, 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))

下面的代码可以运行idk,但它没有显示所有的应用程序

代码语言:javascript
复制
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['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个应用程序),但是当我为path添加时,代码没有显示所有的应用程序(205)

代码语言:javascript
复制
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]



            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'])
print('Number of installed apps: %s' % len(software_list))
EN

回答 2

Stack Overflow用户

发布于 2021-04-18 12:03:16

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

顺便说一句,我写了一个包,它可以完成你上面编码的东西,叫做windows_tools.installed_software

代码语言:javascript
复制
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获取数据的一种方法是:

代码语言:javascript
复制
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)

祝好运。

票数 1
EN

Stack Overflow用户

发布于 2021-04-20 13:22:04

由于anshul要求获得所有可执行文件的方法,以便找到安装了哪些程序,这里有一个解决方案。不过,这只会列出路径中的所有可执行文件,并将为具有多个可执行文件的现有程序产生许多结果。

代码语言:javascript
复制
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模块的作者

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67148024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档