Как избежать права доступа при открытии ключей реестра с Winreg в Python? - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь открыть ключ реестра

(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render)

в python с winreg для чтения и записи, но я продолжаю сталкиваться с

«PermissionError: [WinError 5] доступ запрещен»

Сначала я вручную изменил разрешения в regedit (как описано в этом руководстве) для необходимых мне ключей.это работает, но это неудобно.я также заметил, что установка обновлений, например, для видеокарт, может удалить старые ключи и создать новые, поэтому вам всегда придется настраивать разрешения после установки обновления, что непрактично.Запуск от имени администратора также не помогает.

import winreg

reg_hive = winreg.HKEY_LOCAL_MACHINE
main_key = r"SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render"

with winreg.ConnectRegistry(None, reg_hive) as Hive:
    with winreg.OpenKey(
            Hive, main_key, 0, winreg.KEY_ALL_ACCESS) as RenderKey:

        get_subkey_tuple = winreg.QueryInfoKey(RenderKey)
        # this tuple counts sub_key starting with 1
        # we subtract -1 so we get the correct index for range()
        subkey_indices = get_subkey_tuple[0] - 1

        for i in range(0, subkey_indices):
            sub_key = winreg.EnumKey(RenderKey, i)
            final_key_string = main_key + "\\" + sub_key
            print(final_key_string)
            with winreg.OpenKey(Hive, final_key_string, 0, winreg.KEY_ALL_ACCESS) as local_key:
                pass

строки "winreg.OpenKey" вызывают Permissionerror (те, которые я не изменял разрешения вручную в regedit).я хотел бы открывать / читать / записывать ключи реестра без необходимости вручную настраивать разрешения.

--- edit --- параметр "reserved" имеет какое-либо отношение к нему?документация по этому вопросу довольно скудная.

упоминает об этом только двумя предложениями: «зарезервированное является зарезервированным целым числом и должно быть равно нулю. По умолчанию это ноль».и «зарезервировано может быть что угодно - ноль всегда передается в API».последний предназначен только для winreg.SetValueEX ().

...