Реестр Windows Python: отображение списка профилей - PullRequest
0 голосов
/ 27 ноября 2018

Я новичок в реестрах Windows и в настоящее время пытаюсь получить список имен профилей из моих реестров Windows, используя Python, но я не уверен, что делаю неправильно.Мой код следующий:

from winreg import *
def get_profiles():

    regKey = OpenKey(HKEY_LOCAL_MACHINE,
        r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList')
    recent = QueryValueEx(regKey,'DisplayName')[0]
    recent_list = []
    for subkey in recent:
        recent_list.append(QueryValueEx(regKey,subkey)[0])
    return recent_list

Когда я пытаюсь выполнить вышеизложенное, я получаю следующее:

---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-45-6261438d1fdc> in <module>()
----> 1 l = get_profiles()

<ipython-input-44-f572c6ac8843> in get_profiles()
      4     regKey = OpenKey(HKEY_LOCAL_MACHINE,
      5         r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList')
----> 6     recent = QueryValueEx(regKey,'DisplayName')[0]
      7     recent_list = []
      8     for subkey in recent:

FileNotFoundError: [WinError 2] The system cannot find the file specified

У меня есть догадка, что часть 'DisplayName' неверна,как мне это исправить?

1 Ответ

0 голосов
/ 27 ноября 2018

Вы можете использовать EnumKey для получения вложенных ключей открытого ключа реестра.

winreg.EnumKey (ключ, индекс)

Перечисляетподразделы открытого ключа реестра, возвращающие строку.

ключ - это уже открытый ключ, или одна из предопределенных констант HKEY_ *.

index - это целое число, которое идентифицирует индекс ключа

from contextlib import suppress
from winreg import \
    (OpenKey,
     HKEY_LOCAL_MACHINE,
     QueryInfoKey,
     QueryValueEx,
     EnumKey)


PROFILE_REGISTRY = "SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion\\ProfileList"


def get_profile_attribute(*, attribute):
    profile_to_sub_key_map = {}
    with OpenKey(HKEY_LOCAL_MACHINE, PROFILE_REGISTRY) as key:
        number_of_sub_keys, _, _ = QueryInfoKey(key)  # The `QueryInfoKey` Returns information about a key, as a tuple.
        # At the index 0  will be An integer giving the number of sub keys 
        # this key has.

        for index in range(number_of_sub_keys):
            sub_key_name = EnumKey(key, index)
            # Open the sub keys one by one and fetch the attribute.
            with OpenKey(HKEY_LOCAL_MACHINE,
                         f"{PROFILE_REGISTRY}\\{sub_key_name}") as sub_key:
                with suppress(FileNotFoundError):
                    registry_value, _ = QueryValueEx(sub_key, attribute)
                    profile_to_sub_key_map.update({sub_key_name: registry_value})

    return profile_to_sub_key_map


print(get_profile_attribute(attribute='ProfileImagePath'))

Также обратите внимание, что согласно документации.

Объект HKEY реализует __enter__() и __exit__() и, таким образом, поддерживает протокол контекста дляс оператором:

with OpenKey(HKEY_LOCAL_MACHINE, "foo") as key:
    ...  # work with key

автоматически закроет клавишу, когда элемент управления выйдет из блока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...