打开同一个注册表两次?

2024-10-03 02:47:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试获取windows计算机上所有已安装的程序,因此我读取了注册表。你知道吗

但是不知何故,python读取32位程序两次(尽管我给了他另一个注册表项)

以下是截取的代码:

def get_programs(registry):
    reg = ConnectRegistry(None, HKEY_LOCAL_MACHINE)
    programList = []

    key = OpenKey(reg, registry)
    print(QueryInfoKey(key))
    for i in range(0, QueryInfoKey(key)[0]):
        programList.append(EnumKey(key, i))
    CloseKey(key)
    CloseKey(reg)
    return programList

我这样称呼这个函数:

registry32bit = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
registry64bit = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"    
programs32bit = get_programs(registry32bit)
programs64bit = get_programs(registry64bit)

为什么python会打开并读取同一个注册表(32位)两次,然后返回完全相同的列表?你知道吗


Tags: key程序get注册表windowssoftwareregmicrosoft
1条回答
网友
1楼 · 发布于 2024-10-03 02:47:04

这似乎有效,并在下面的注释中使用@eryksun建议,只允许重定向发生,而不显式引用Wow6432Node注册表项。中心思想是在打开uninstall子键时指定KEY_WOW64_32KEYKEY_WOW64_64KEY标志,然后让神奇的事情发生。你知道吗

注意:我还对get_programs()函数中的代码进行了Pythonized。在我看来,这使它更简短,可读性更强。你知道吗

import sys
from _winreg import *

# Assure registry handle objects with context manager protocol implemented.
if sys.version_info.major*10 + sys.version_info.minor < 26:
    raise AssertionError('At least Python 2.6 is required.')

def get_programs(subkey, regBitView):
    with ConnectRegistry(None, HKEY_LOCAL_MACHINE) as hive:
        with OpenKey(hive, subkey, 0, regBitView | KEY_READ) as key:
            return [EnumKey(key, i) for i in range(QueryInfoKey(key)[0])]

UNINSTALL_REG_KEY = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'
programs32bit = get_programs(UNINSTALL_REG_KEY, KEY_WOW64_32KEY)
programs64bit = get_programs(UNINSTALL_REG_KEY, KEY_WOW64_64KEY)

print('32-bit programs:\n{}'.format(programs32bit))
print('')
print('64-bit programs:\n{}'.format(programs64bit))

非常感谢@eryksun提供的线索和许多实施策略建议。你知道吗

相关问题 更多 >