In this article, we will learn how to manipulate Windows Registry using winreg in Python.
What is windows registry?
It is a hierarchical database that holds low-level settings for the windows operating system and for applications in which the use of a registry is required. The device drivers, kernel, services, user interfaces, and security accounts manager can all use the registry.
IMPORTANT: As Windows Registry is a very sensitive place to do anything, do not change any value predefined by the Windows System. This article will just be for learning purposes of how Python can be used to create some new registry keys with user-defined values.
Windows registry can be used for different purposes, it can be accessed via typing regedit in the Run application.
Window opens after running “regedit” in run:
Creating a new Key and Assigning a new value to it.
We will be creating a new key with a user-defined value under the HKEY_CURRENT_USER as that holds information about the current user only, not many confidential system files or information, HKEY_LOCAL_MACHINE holds the information related to the system and it is better not to tamper with them or create anything new which can affect the system.
winreg module is a built-in module that installs along with Python. so, we have to just import it.
Python3
import
winreg as wrg
location
=
wrg.HKEY_CURRENT_USER
soft
=
wrg.OpenKeyEx(location, r
"SOFTWARE\\"
)
key_1
=
wrg.CreateKey(soft,
"Geeks"
)
wrg.SetValueEx(key_1,
"value One"
,
0
, wrg.REG_SZ,
"GeeksforGeeks is Best"
)
wrg.SetValueEx(key_1,
"value Two"
,
0
, wrg.REG_SZ,
"Participate in Technical Scripter"
)
if
key_1:
wrg.CloseKey(key_1)
Explanation of the Above Code:
- Firstly importing the module winreg with the alias wrg, users can use anything if they want or can use winreg also every time.
- Then defining the location where we would be creating the key and assign value.
- Then in “soft” variable passing the location and the name of the subfolder inside OpenKeyEx() method of winreg, which is used to open already made keys, it takes two arguments, first one the main folder name and then the subfolder mentioned as ‘key’ here.
- Then we are creating a new key whose name is Geeks inside the Software key.
- Then last two lines are providing some values and name, the REG_SZ is mentioned as we want to use a fixed-length string here, to keep it as simple as possible.
- After creating and assigning values it is time to close the key otherwise it will remain open and other operations can’t be done. It’s like file handling.
Output:
If we open the regedit again then we will see the following output.
Note: To see the changes of anything like the creation, or deletion of keys user need to open the registry editor every time or refresh it.
Reading the contents of the created key.
Now after creating and assigning values it is time to fetch them, for that we will use the method QueryValueEx method and pass the exact location of the keys and a string that acts as a value to query. then we will close the key and print the two variables which were used to store the fetched values.
Python3
import
winreg as wrg
location
=
wrg.HKEY_CURRENT_USER
soft
=
wrg.OpenKeyEx(location,r
"SOFTWARE\\Geeks\\"
)
value_1
=
wrg.QueryValueEx(soft,
"Value One"
)
value_2
=
wrg.QueryValueEx(soft,
"Value Two"
)
if
soft:
wrg.CloseKey(soft)
print
(value_1)
print
(value_2)
Output:
Delete a particular value from a Key
Now we will delete that particular key that we made earlier. But if a key has some value associated with it then we can’t delete the Key directly, we first have to delete the value. Using the below code we can delete the values. Here I will be deleting just one to show how it works, user might delete all the values if they want.
Python3
import
winreg as wrg
location
=
wrg.HKEY_CURRENT_USER
soft
=
wrg.OpenKeyEx(location, r
"SOFTWARE\\"
)
key_1
=
wrg.CreateKey(soft,
"Geeks"
)
del_val_one
=
wrg.DeleteValue(key_1,
"Value One"
)
del_val_two
=
wrg.DeleteValue(key_1,
"Value Two"
)
if
key_1:
wrg.CloseKey(key_1)
The above code deletes both the values, if the user wants they can only delete one, then after refreshing the registry editor there must be one value left.
Note: Remember to close the key after deletion otherwise this will not work as expected.
Output:
Deleting the Key
Now after clearing the key (deleting the values) it is time to Delete the key itself.
Python3
import
winreg as wrg
location
=
wrg.HKEY_CURRENT_USER
soft
=
wrg.OpenKeyEx(location, r
"SOFTWARE\\"
)
key_1
=
wrg.CreateKey(soft,
"Geeks"
)
del_key
=
wrg.DeleteKey(key_1, "")
if
key_1:
wrg.CloseKey(key_1)
DeleteKey also takes two parameters one is the key and the second one is the subkey, as we have already removed all those subkeys we have passed a blank string here (remember don’t even use space, it will be considered as a character).
Output: No Geeks key is there anymore.
Last Updated :
16 Dec, 2022
Like Article
Save Article
Модуль winreg
в Python позволяет получать доступ к реестру Windows и изменять его. Реестр представляет собой иерархическую базу данных, в которой хранятся параметры конфигурации операционной системы, приложений и аппаратных устройств.
Чтобы использовать модуль winreg
, сначала необходимо импортировать его в скрипт Python. Затем вы можете использовать функцию ConnectRegistry()
для подключения к реестру. Функция ConnectRegistry()
принимает один аргумент — корневой ключ куста реестра, к которому вы хотите подключиться. Корневые ключи:
HKEY_CURRENT_USER
: Куст реестра текущего пользователя.HKEY_LOCAL_MACHINE
: Куст реестра локального компьютера.HKEY_CLASSES_ROOT
: Куст реестра для ассоциаций файлов и классов COM.HKEY_USERS
: Куст реестра для всех пользователей на локальном компьютере.HKEY_CURRENT_CONFIG
: Куст реестра для текущей конфигурации оборудования.
После подключения к реестру вы можете использовать функцию OpenKey()
, чтобы открыть определенный раздел реестра. Функция OpenKey()
принимает два аргумента: дескриптор корневого ключа, к которому вы подключились на предыдущем шаге, и путь к ключу реестра, который вы хотите открыть.
Если вы хотите создать новый раздел реестра, вы можете использовать функцию CreateKey()
. Функция CreateKey()
принимает те же два аргумента, что и функция OpenKey()
.
Чтобы прочитать значение ключа реестра, вы можете использовать функцию QueryValueEx()
. Функция QueryValueEx()
принимает три аргумента: дескриптор раздела реестра, который вы хотите прочитать, имя значения, которое вы хотите прочитать, и переменную для хранения значения.
Чтобы записать значение в ключ реестра, вы можете использовать функцию SetValueEx()
. Функция SetValueEx()
принимает четыре аргумента: дескриптор ключа реестра, в который вы хотите записать, имя значения, которое вы хотите записать, тип значения и значение, которое вы хотите записать.
Чтобы закрыть раздел реестра, вы можете использовать функцию CloseKey()
. Функция CloseKey()
принимает дескриптор раздела реестра, который вы хотите закрыть.
Вот простой пример использования модуля winreg
для чтения и записи в реестр:
import winreg
# Подключитесь к реестру.
hkey = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
# Откройте ключ реестра для фона рабочего стола текущего пользователя.
key = winreg.OpenKey(hkey, "Control Panel\\Desktop", 0, winreg.KEY_READ | winreg.KEY_WRITE)
# Прочтите значение раздела реестра "Wallpaper".
wallpaper, reg_type = winreg.QueryValueEx(key, "Wallpaper")
# Запишите значение ключа реестра "Wallpaper" в новое значение.
new_wallpaper = "C:\\Users\\Public\\Pictures\\Sample Pictures\\Desert.jpg"
winreg.SetValueEx(key, "Wallpaper", reg_type, new_wallpaper)
# Закройте раздел реестра.
winreg.CloseKey(key)
# Закрываем соединение с реестром.
winreg.CloseKey(hkey)
- Important
- Будьте осторожны при изменении реестра Windows. Изменение неправильного раздела реестра может привести к нестабильной работе вашей системы или даже к сбою. Всегда полезно создать резервную копию реестра перед внесением каких-либо изменений.
Вот некоторые из наиболее распространенных проблем в Python winreg
:
-
- Неверный путь к ключу реестра
- Путь к ключу реестра — это иерархический путь к определенному ключу реестра. Если путь к ключу реестра неверен, модуль
winreg
не сможет получить доступ к ключу.
-
- Неверная маска доступа к реестру
- Маска доступа к реестру определяет разрешения, необходимые для доступа к разделу реестра. Если маска доступа к реестру недействительна, модуль
winreg
выдаст исключение.
-
- Попытка получить доступ к несуществующему ключу реестра
- Если раздел реестра, к которому вы пытаетесь получить доступ, не существует, модуль
winreg
выдаст исключение.
-
- Попытка записи в раздел реестра, на запись которого у вас нет разрешения.
- Если вы попытаетесь выполнить запись в раздел реестра, на запись которого у вас нет разрешения, модуль
winreg
выдаст исключение.
-
- Неправильное закрытие разделов реестра
- Когда вы закончите доступ к ключу реестра, важно правильно его закрыть. Если вы не закроете раздел реестра должным образом, это может привести к утечке ресурсов и другим проблемам.
Помимо этих распространенных проблем, существует ряд других потенциальных проблем, которые могут возникнуть при использовании модуля winreg
. Например, модуль winreg
поддерживает не все типы данных реестра, и отладка проблем с модулем winreg
может быть затруднена.
Вот несколько советов, как избежать распространенных проблем с модулем winreg
:
-
- Double-check путь к ключу реестра
- Прежде чем попытаться получить доступ к разделу реестра, убедитесь, что путь к ключу реестра правильный. Вы можете использовать редактор реестра, чтобы проверить путь к ключу реестра.
-
- Используйте правильную маску доступа к реестру
- Открывая раздел реестра, убедитесь, что вы используете правильную маску доступа к реестру. Маска доступа к реестру определяет разрешения, необходимые для доступа к ключу.
-
- Прежде чем получить к нему доступ, проверьте наличие ключа реестра.
- Прежде чем попытаться получить доступ к ключу реестра, проверьте, существует ли этот ключ. Вы можете использовать функцию
winreg.QueryValueEx()
, чтобы проверить наличие ключа реестра.
-
- Проверьте разрешение на запись в раздел реестра перед записью в него.
- Прежде чем попытаться выполнить запись в раздел реестра, проверьте, есть ли у вас разрешение на запись в этот раздел. Вы можете использовать функцию
winreg.OpenKey()
, чтобы проверить разрешение на запись в раздел реестра.
-
- Закройте ключи реестра правильно
- Когда вы закончите доступ к ключу реестра, обязательно закройте его правильно. Вы можете использовать функцию
winreg.CloseKey()
, чтобы закрыть раздел реестра.
Чтобы использовать Winreg в Python, сначала необходимо импортировать модуль:
import winreg
После импорта модуля вы можете использовать его для доступа к реестру Windows. В следующем примере показано, как открыть ключ реестра и прочитать его значение:
# Откройте ключ реестра по адресу HKEY_CURRENT_USER\Software\Python\PythonCore.
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Python\PythonCore")
# Прочтите значение ключа реестра
value = winreg.QueryValueEx(key, "InstallPath")
# Close the registry key
winreg.CloseKey(key)
# Распечатываем значение ключа реестра
print(value[0])
Этот код выведет путь к каталогу установки Python.
Вы также можете использовать Winreg для создания, изменения и удаления ключей и значений реестра. Например, следующий код показывает, как создать новый раздел и значение реестра:
# Создайте новый раздел реестра по адресу HKEY_CURRENT_USER\Software\MyCompany\MyApplication.
key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, r"Software\MyCompany\MyApplication")
# Установите значение ключа реестра "Hello, world!".
winreg.SetValueEx(key, "Greeting", winreg.REG_SZ, "Hello, world!")
# Закрываем ключ реестра
winreg.CloseKey(key)
Вот несколько дополнительных советов по использованию Winreg в Python:
- Открывая ключ реестра, обязательно укажите правильные права доступа. Права доступа по умолчанию —
KEY_READ
, что позволяет вам читать ключ и его значения, но не изменять их. Если вам необходимо изменить ключ или его значения, вам потребуется указать право доступаKEY_WRITE
. - При установке значения раздела реестра обязательно укажите правильный тип значения реестра. Наиболее распространенными типами значений реестра являются
REG_SZ
(string),REG_DWORD
(DWORD) иREG_BINARY
(двоичный файл data). - Когда вы закончите использовать ключ реестра, обязательно закройте его. Это обеспечит правильное обновление реестра и освобождение всех ресурсов, выделенных для этого ключа.
Обратите внимание, что изменение реестра Windows может быть опасным, поэтому важно соблюдать осторожность при использовании Winreg.
Эти функции предоставляют доступ к реестру Windows API к Python. Вместо использования целого числа в качестве дескриптора реестра используется handle object , чтобы гарантировать правильное закрытие дескрипторов, даже если программист не закрывает их явно.
Изменено в версии 3.3:. Несколько функций в этом модуле использовались для создания WindowsError
, который теперь является псевдонимом OSError
.
Functions
Этот модуль предлагает следующие функции:
-
winreg.CloseKey(hkey)
-
Закрывает ранее открытый раздел реестра. Аргумент hkey указывает ранее открытый ключ.
Note
Если hkey не закрывается с помощью этого метода (или через
hkey.Close()
), он закрывается, когда объект hkey уничтожается с помощью Python.
-
winreg.ConnectRegistry(computer_name, key)
-
Устанавливает соединение с предопределенным дескриптором реестра на другом компьютере и возвращает handle object .
computer_name — имя удаленного компьютера в форме
r"\\computername"
. ЕслиNone
, используется локальный компьютер.key — это предопределенный дескриптор для подключения.
Возвращаемое значение — это дескриптор открытого ключа. Если функция завершается сбоем, возникает исключение
OSError
.Вызывает auditing event
winreg.ConnectRegistry
с аргументамиcomputer_name
,key
.Изменено в версии 3.3: См. above .
-
winreg.CreateKey(key, sub_key)
-
Создает или открывает указанный ключ, возвращая handle object .
key — уже открытый ключ или один из предопределенных HKEY_* constants .
sub_key — это строка, определяющая ключ, который открывает или создает этот метод.
Если ключ является одним из предопределенных ключей, sub_key может быть
None
. В этом случае возвращаемый дескриптор является тем же дескриптором ключа, который был передан в функцию.Если ключ уже существует, эта функция открывает существующий ключ.
Возвращаемое значение — это дескриптор открытого ключа. Если функция завершается сбоем, возникает исключение
OSError
.Вызывает auditing event
winreg.CreateKey
с аргументамиkey
,sub_key
,access
.Вызывает auditing event
winreg.OpenKey/result
с аргументомkey
.Изменено в версии 3.3: См. above .
-
winreg.CreateKeyEx(key, sub_key, reserved=0, access=KEY_WRITE)
-
Создает или открывает указанный ключ, возвращая handle object .
key — уже открытый ключ или один из предопределенных HKEY_* constants .
sub_key — это строка, определяющая ключ, который открывает или создает этот метод.
Reserved — это зарезервированное целое число, которое должно быть равно нулю. Значение по умолчанию — ноль.
доступ — это целое число, определяющее маску доступа, описывающую желаемый безопасный доступ для ключа. По умолчанию —
KEY_WRITE
. Другие допустимые значения см. в Access Rights .Если ключ является одним из предопределенных ключей, sub_key может быть
None
. В этом случае возвращаемый дескриптор является тем же дескриптором ключа, который был передан в функцию.Если ключ уже существует, эта функция открывает существующий ключ.
Возвращаемое значение — это дескриптор открытого ключа. Если функция завершается сбоем, возникает исключение
OSError
.Вызывает auditing event
winreg.CreateKey
с аргументамиkey
,sub_key
,access
.Вызывает auditing event
winreg.OpenKey/result
с аргументомkey
.Новое в версии 3.2.
Изменено в версии 3.3: См. above .
-
winreg.DeleteKey(key, sub_key)
-
Удаляет указанный ключ.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
sub_key — это строка, которая должна быть подразделом ключа, определяемого параметром key. Это значение не должно быть
None
, а ключ не может иметь подразделов.Этот метод не может удалять ключи с подразделами.
Если метод завершается успешно, весь ключ, включая все его значения, удаляется. Если метод завершается неудачно, возникает исключение
OSError
.Вызывает auditing event
winreg.DeleteKey
с аргументамиkey
,sub_key
,access
.Изменено в версии 3.3: См. above .
-
winreg.DeleteKeyEx(key, sub_key, access=KEY_WOW64_64KEY, reserved=0)
-
Удаляет указанный ключ.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
sub_key — это строка, которая должна быть подразделом ключа, определяемого параметром key. Это значение не должно быть
None
, а ключ не может иметь подразделов.Reserved — это зарезервированное целое число, которое должно быть равно нулю. Значение по умолчанию — ноль.
доступ — это целое число, определяющее маску доступа, описывающую желаемый безопасный доступ для ключа. По умолчанию —
KEY_WOW64_64KEY
. В 32-битной Windows константы WOW64 игнорируются. Другие допустимые значения см. в Access Rights .Этот метод не может удалять ключи с подразделами.
Если метод завершается успешно, весь ключ, включая все его значения, удаляется. Если метод завершается неудачно, возникает исключение
OSError
.В неподдерживаемых версиях Windows возникает
NotImplementedError
.Вызывает auditing event
winreg.DeleteKey
с аргументамиkey
,sub_key
,access
.Новое в версии 3.2.
Изменено в версии 3.3: См. above .
-
winreg.DeleteValue(key, value)
-
Удаляет именованное значение из раздела реестра.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
value — это строка, определяющая значение, которое нужно удалить.
Вызывает auditing event
winreg.DeleteValue
с аргументамиkey
,value
.
-
winreg.EnumKey(key, index)
-
Перечисляет подразделы открытого раздела реестра, возвращая строку.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
index — целое число, которое идентифицирует индекс ключа, который нужно получить.
Функция извлекает имя одного подраздела при каждом вызове. Обычно он вызывается повторно, пока не возникнет исключение
OSError
, указывающее, что больше доступных значений нет.Вызывает auditing event
winreg.EnumKey
с аргументамиkey
,index
.Изменено в версии 3.3: См. above .
-
winreg.EnumValue(key, index)
-
Перечисляет значения открытого ключа реестра, возвращая кортеж.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
index — целое число, которое идентифицирует индекс извлекаемого значения.
Функция извлекает имя одного подраздела при каждом вызове. Обычно он вызывается неоднократно, пока не возникнет исключение
OSError
, указывающее на отсутствие дополнительных значений.В результате получается кортеж из трех элементов:
Index
Meaning
0
Строка, идентифицирующая имя значения.
1
Объект, содержащий данные значения, тип которого зависит от базового типа реестра.
2
Целое число, которое идентифицирует тип данных значения (см. таблицу в документации для
SetValueEx()
).Вызывает auditing event
winreg.EnumValue
с аргументамиkey
,index
.Изменено в версии 3.3: См. above .
-
winreg.ExpandEnvironmentStrings(str)
-
Расширяет заполнители переменных среды
%NAME%
в строки типаREG_EXPAND_SZ
:>>> ExpandEnvironmentStrings('%windir%') 'C:\\Windows'
Вызывает auditing event
winreg.ExpandEnvironmentStrings
с аргументомstr
.
-
winreg.FlushKey(key)
-
Записывает все атрибуты ключа в реестр.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
Для замены ключа не обязательно звонить в К14153К. Изменения реестра сбрасываются на диск реестром с помощью ленивой программы очистки. Изменения реестра также сбрасываются на диск при завершении работы системы. В отличие от
CloseKey()
, методFlushKey()
возвращает результат только тогда, когда все данные записаны в реестр. Приложению следует вызыватьFlushKey()
только в том случае, если ему требуется абсолютная уверенность в том, что изменения реестра находятся на диске.Note
Если вы не знаете, требуется ли вызов
FlushKey()
, возможно, это не так.
-
winreg.LoadKey(key, sub_key, file_name)
-
Создает подраздел под указанным ключом и сохраняет регистрационную информацию из указанного файла в этом подразделе.
key — это дескриптор, возвращаемый
ConnectRegistry()
или одной из константHKEY_USERS
илиHKEY_LOCAL_MACHINE
.sub_key — это строка, определяющая загружаемый подраздел.
file_name — имя файла, из которого загружаются данные реестра. Этот файл должен быть создан с помощью функции
SaveKey()
. В файловой системе таблицы размещения файлов (FAT) имя файла может не иметь расширения.Вызов
LoadKey()
завершается неудачей, если вызывающий процесс не имеет привилегииSE_RESTORE_PRIVILEGE
. Обратите внимание, что привилегии отличаются от разрешений — более подробную информацию см. в RegLoadKey documentation .Если ключ — это дескриптор, возвращаемый
ConnectRegistry()
, то путь, указанный в file_name, относится к удаленному компьютеру.Вызывает auditing event
winreg.LoadKey
с аргументамиkey
,sub_key
,file_name
.
-
winreg.OpenKey(key, sub_key, reserved=0, access=KEY_READ)
-
winreg.OpenKeyEx(key, sub_key, reserved=0, access=KEY_READ)
-
Открывает указанный ключ, возвращая handle object .
key — уже открытый ключ или один из предопределенных HKEY_* constants .
sub_key — это строка, которая идентифицирует sub_key, который нужно открыть.
Reserved — это зарезервированное целое число, которое должно быть равно нулю. Значение по умолчанию — ноль.
доступ — это целое число, определяющее маску доступа, описывающую желаемый безопасный доступ для ключа. По умолчанию —
KEY_READ
. Другие допустимые значения см. в Access Rights .Результатом является новый дескриптор указанного ключа.
Если функция завершается сбоем, выдается
OSError
.Вызывает auditing event
winreg.OpenKey
с аргументамиkey
,sub_key
,access
.Вызывает auditing event
winreg.OpenKey/result
с аргументомkey
.Изменено в версии 3.2:. Разрешено использование именованных аргументов.
Изменено в версии 3.3: См. above .
-
winreg.QueryInfoKey(key)
-
Возвращает информацию о ключе в виде кортежа.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
В результате получается кортеж из трех элементов:
Index
Meaning
0
Целое число, указывающее количество дополнительных ключей, которые имеет этот ключ.
1
Целое число, указывающее количество значений этого ключа.
2
Целое число, указывающее дату последнего изменения ключа (если доступно) в виде сотен наносекунд с 1 января 1601 года.
Вызывает auditing event
winreg.QueryInfoKey
с аргументомkey
.
-
winreg.QueryValue(key, sub_key)
-
Получает безымянное значение ключа в виде строки.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
sub_key — это строка, содержащая имя подраздела, с которым связано значение. Если этот параметр равен
None
или пуст, функция получает значение, установленное методомSetValue()
для ключа, идентифицируемого ключом.Значения в реестре имеют имя, тип и компоненты данных. Этот метод извлекает данные для первого значения ключа, имеющего имя
NULL
. Но базовый вызов API не возвращает тип, поэтому, если возможно, всегда используйтеQueryValueEx()
.Вызывает auditing event
winreg.QueryValue
с аргументамиkey
,sub_key
,value_name
.
-
winreg.QueryValueEx(key, value_name)
-
Извлекает тип и данные для указанного имени значения, связанного с открытым ключом реестра.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
value_name — это строка, указывающая значение для запроса.
В результате получается кортеж из двух элементов:
Index
Meaning
0
Значение элемента реестра.
1
Целое число, указывающее тип реестра для этого значения (см. таблицу в документации для
SetValueEx()
).Вызывает auditing event
winreg.QueryValue
с аргументамиkey
,sub_key
,value_name
.
-
winreg.SaveKey(key, file_name)
-
Сохраняет указанный ключ и все его подразделы в указанный файл.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
file_name — имя файла, в который сохраняются данные реестра. Этот файл не может уже существовать. Если это имя файла включает расширение, его нельзя использовать в файловых системах таблицы размещения файлов (FAT) методом
LoadKey()
.Если ключ представляет собой ключ на удаленном компьютере, путь, описанный file_name, относится к удаленному компьютеру. Вызывающий этот метод должен обладать привилегией безопасности
SeBackupPrivilege
. Обратите внимание, что привилегии отличаются от разрешений — более подробную информацию см. в Conflicts Between User Rights and Permissions documentation .Эта функция передает
NULL
для security_attributes в API..Вызывает auditing event
winreg.SaveKey
с аргументамиkey
,file_name
.
-
winreg.SetValue(key, sub_key, type, value)
-
Связывает значение с указанным ключом.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
sub_key — это строка, определяющая подраздел, с которым связано значение.
type — целое число, определяющее тип данных. В настоящее время это должен быть
REG_SZ
, что означает, что поддерживаются только строки. Используйте функциюSetValueEx()
для поддержки других типов данных.value — это строка, определяющая новое значение.
Если ключ, указанный параметром sub_key, не существует, функция SetValue создает его.
Длина значений ограничена доступной памятью. Длинные значения (более 2048 байт) следует хранить в виде файлов, имена которых хранятся в реестре конфигурации. Это помогает реестру работать эффективно.
Ключ, идентифицируемый параметром key, должен быть открыт с помощью доступа
KEY_SET_VALUE
.Вызывает auditing event
winreg.SetValue
с аргументамиkey
,sub_key
,type
,value
.
-
winreg.SetValueEx(key, value_name, reserved, type, value)
-
Сохраняет данные в поле значения открытого ключа реестра.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
value_name — это строка, определяющая подраздел, с которым связано значение.
зарезервировано может быть что угодно – в API. всегда передается ноль
type — целое число, определяющее тип данных. Доступные типы см. в Value Types .
value — это строка, определяющая новое значение.
Этот метод также может установить дополнительное значение и информацию о типе для указанного ключа. Ключ, идентифицируемый параметром key, должен быть открыт с доступом
KEY_SET_VALUE
.Для открытия ключа используйте методы
CreateKey()
илиOpenKey()
.Длина значений ограничена доступной памятью. Длинные значения (более 2048 байт) следует хранить в виде файлов, имена которых хранятся в реестре конфигурации. Это помогает реестру работать эффективно.
Вызывает auditing event
winreg.SetValue
с аргументамиkey
,sub_key
,type
,value
.
-
winreg.DisableReflectionKey(key)
-
Отключает отражение реестра для 32-битных процессов, работающих в 64-битной операционной системе.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
Обычно вызывает
NotImplementedError
, если выполняется в 32-битной операционной системе.Если ключа нет в списке отражений, функция завершается успешно, но не оказывает никакого эффекта. Отключение отражения для ключа не влияет на отражение каких-либо подразделов.
Вызывает auditing event
winreg.DisableReflectionKey
с аргументомkey
.
-
winreg.EnableReflectionKey(key)
-
Восстанавливает отражение реестра для указанного отключенного ключа.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
Обычно вызывает
NotImplementedError
, если выполняется в 32-битной операционной системе.Восстановление отражения ключа не влияет на отражение каких-либо подразделов.
Вызывает auditing event
winreg.EnableReflectionKey
с аргументомkey
.
-
winreg.QueryReflectionKey(key)
-
Определяет состояние отражения для указанного ключа.
key — уже открытый ключ или один из предопределенных HKEY_* constants .
Возвращает
True
, если отражение отключено.Обычно вызывает
NotImplementedError
, если выполняется в 32-битной операционной системе.Вызывает auditing event
winreg.QueryReflectionKey
с аргументомkey
.
Constants
Следующие константы определены для использования во многих функциях _winreg
.
HKEY_* Constants
-
winreg.HKEY_CLASSES_ROOT
-
Записи реестра, подчиненные этому ключу, определяют типы (или классы) документов и свойства, связанные с этими типами. Приложения Shell и COM используют информацию, хранящуюся под этим ключом.
-
winreg.HKEY_CURRENT_USER
-
Записи реестра, подчиненные этому ключу, определяют предпочтения текущего пользователя. Эти настройки включают настройки переменных среды, данные о группах программ, цветах, принтерах, сетевых подключениях и настройках приложений.
-
winreg.HKEY_LOCAL_MACHINE
-
Записи реестра, подчиненные этому ключу, определяют физическое состояние компьютера, включая данные о типе шины, системной памяти, а также установленном аппаратном и программном обеспечении.
-
winreg.HKEY_USERS
-
Записи реестра, подчиненные этому разделу, определяют конфигурацию пользователя по умолчанию для новых пользователей на локальном компьютере и конфигурацию пользователя для текущего пользователя.
-
winreg.HKEY_PERFORMANCE_DATA
-
Записи реестра, подчиненные этому ключу, позволяют получить доступ к данным о производительности. Данные фактически не хранятся в реестре; функции реестра заставляют систему собирать данные из источника.
-
winreg.HKEY_CURRENT_CONFIG
-
Содержит информацию о текущем профиле оборудования локальной компьютерной системы.
-
winreg.HKEY_DYN_DATA
-
Этот ключ не используется в версиях Windows после 98.
Access Rights
Дополнительную информацию см. Registry Key Security and Access .
-
winreg.KEY_ALL_ACCESS
-
Сочетает права доступа STANDARD_RIGHTS_REQUIRED,
KEY_QUERY_VALUE
,KEY_SET_VALUE
,KEY_CREATE_SUB_KEY
,KEY_ENUMERATE_SUB_KEYS
,KEY_NOTIFY
иKEY_CREATE_LINK
.
-
winreg.KEY_WRITE
-
Сочетает в себе права доступа STANDARD_RIGHTS_WRITE,
KEY_SET_VALUE
иKEY_CREATE_SUB_KEY
.
-
winreg.KEY_READ
-
Сочетает значения STANDARD_RIGHTS_READ,
KEY_QUERY_VALUE
,KEY_ENUMERATE_SUB_KEYS
иKEY_NOTIFY
.
-
winreg.KEY_EXECUTE
-
Эквивалент К14153К.
-
winreg.KEY_QUERY_VALUE
-
Требуется для запроса значений ключа реестра.
-
winreg.KEY_SET_VALUE
-
Требуется для создания, удаления или установки значения реестра.
-
winreg.KEY_CREATE_SUB_KEY
-
Требуется для создания подраздела раздела реестра.
-
winreg.KEY_ENUMERATE_SUB_KEYS
-
Требуется для перечисления подразделов раздела реестра.
-
winreg.KEY_NOTIFY
-
Требуется для запроса уведомлений об изменении раздела реестра или подразделов раздела реестра.
-
winreg.KEY_CREATE_LINK
-
Зарезервировано для использования системой.
64-bit Specific
Для получения дополнительной информации см. Accessing an Alternate Registry View .
-
winreg.KEY_WOW64_64KEY
-
Указывает, что приложение в 64-разрядной версии Windows должно работать с 64-разрядным представлением реестра. В 32-битной Windows эта константа игнорируется.
-
winreg.KEY_WOW64_32KEY
-
Указывает, что приложение в 64-разрядной версии Windows должно работать с 32-разрядным представлением реестра. В 32-битной Windows эта константа игнорируется.
Value Types
Для получения дополнительной информации см. Registry Value Types .
-
winreg.REG_BINARY
-
Двоичные данные в любой форме.
-
winreg.REG_DWORD
-
32-bit number.
-
winreg.REG_DWORD_LITTLE_ENDIAN
-
32-битное число в формате с прямым порядком байтов. Эквивалент
REG_DWORD
.
-
winreg.REG_DWORD_BIG_ENDIAN
-
32-битное число в формате с обратным порядком байтов.
-
winreg.REG_EXPAND_SZ
-
Строка, завершающаяся Null, содержащая ссылки на переменные среды (
%PATH%
).
-
winreg.REG_LINK
-
Символическая ссылка Unicode.
-
winreg.REG_MULTI_SZ
-
Последовательность строк, завершающихся символом null, завершающихся двумя символами null. (Python обрабатывает это завершение automatically.)
-
winreg.REG_NONE
-
Нет определенного типа значения.
-
winreg.REG_QWORD
-
64-битное число.
Новое в версии 3.6.
-
winreg.REG_QWORD_LITTLE_ENDIAN
-
64-битное число в формате с прямым порядком байтов. Эквивалент К14153К.
Новое в версии 3.6.
-
winreg.REG_RESOURCE_LIST
-
Список ресурсов драйвера устройства.
-
winreg.REG_FULL_RESOURCE_DESCRIPTOR
-
Аппаратная настройка.
-
winreg.REG_RESOURCE_REQUIREMENTS_LIST
-
Список аппаратных ресурсов.
-
winreg.REG_SZ
-
Строка, завершающаяся null.
Объекты дескриптора реестра
Этот объект оборачивает объект Windows HKEY, автоматически закрывая его при уничтожении объекта. Чтобы гарантировать очистку, вы можете вызвать либо метод Close()
объекта, либо функцию CloseKey()
.
Все функции реестра в этом модуле возвращают один из этих объектов.
Все функции реестра в этом модуле, которые принимают объект дескриптора, также принимают целое число, однако использование объекта дескриптора приветствуется.
Объекты-дескрипторы обеспечивают семантику для __bool__()
– таким образом
if handle: print("Yes")
напечатает Yes
, если дескриптор в данный момент действителен (не был закрыт или detached).
Объект также поддерживает семантику сравнения, поэтому объекты дескрипторов будут сравнивать true, если они оба ссылаются на одно и то же базовое значение дескриптора Windows.
Объекты-дескрипторы можно преобразовать в целое число (e.g., с помощью встроенного int()
function),, и в этом случае возвращается базовое значение дескриптора Windows. Вы также можете использовать метод Detach()
для возврата целочисленного дескриптора, а также отключить дескриптор Windows от объекта дескриптора.
-
PyHKEY.Close()
-
Закрывает базовый дескриптор Windows.
Если дескриптор уже закрыт, ошибка не возникает.
-
PyHKEY.Detach()
-
Отсоединяет дескриптор Windows от объекта дескриптора.
Результатом является целое число, которое содержит значение дескриптора до его отсоединения. Если дескриптор уже отсоединен или закрыт, это вернет ноль.
После вызова этой функции дескриптор фактически становится недействительным, но не закрывается. Вы можете вызвать эту функцию, если вам нужно, чтобы базовый дескриптор Win32 существовал после времени существования объекта дескриптора.
Вызывает auditing event
winreg.PyHKEY.Detach
с аргументомkey
.
-
PyHKEY.__enter__()
-
PyHKEY.__exit__(*exc_info)
-
Объект HKEY реализует
__enter__()
и__exit__()
и, таким образом, поддерживает контекстный протокол для оператораwith
:with OpenKey(HKEY_LOCAL_MACHINE, "foo") as key: ... # work with key
автоматически закроет ключ, когда управление покинет блок
with
.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/winreg.html
I simplified _winreg
functionality for querying a given registry key’s nested values.
For instance, this is how straight-forward it is to query the registry key you asked about:
key = r'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'
for sub_key in get_sub_keys(key):
path = join(key, sub_key)
value = get_values(path, ['DisplayName', 'DisplayVersion', 'InstallDate'])
if value:
print value
output
{'DisplayVersion': u'347.25', 'DisplayName': u'NVIDIA Control Panel 347.25', 'InstallDate': u'20150125'}
{'DisplayVersion': u'347.25', 'DisplayName': u'NVIDIA Graphics Driver 347.25', 'InstallDate': u'20150125'}
{'DisplayVersion': u'2.2.2', 'DisplayName': u'NVIDIA GeForce Experience 2.2.2', 'InstallDate': u'20150212'}
...
Add these utility functions as well:
from _winreg import *
import os
roots_hives = {
"HKEY_CLASSES_ROOT": HKEY_CLASSES_ROOT,
"HKEY_CURRENT_USER": HKEY_CURRENT_USER,
"HKEY_LOCAL_MACHINE": HKEY_LOCAL_MACHINE,
"HKEY_USERS": HKEY_USERS,
"HKEY_PERFORMANCE_DATA": HKEY_PERFORMANCE_DATA,
"HKEY_CURRENT_CONFIG": HKEY_CURRENT_CONFIG,
"HKEY_DYN_DATA": HKEY_DYN_DATA
}
def parse_key(key):
key = key.upper()
parts = key.split('\\')
root_hive_name = parts[0]
root_hive = roots_hives.get(root_hive_name)
partial_key = '\\'.join(parts[1:])
if not root_hive:
raise Exception('root hive "{}" was not found'.format(root_hive_name))
return partial_key, root_hive
def get_sub_keys(key):
partial_key, root_hive = parse_key(key)
with ConnectRegistry(None, root_hive) as reg:
with OpenKey(reg, partial_key) as key_object:
sub_keys_count, values_count, last_modified = QueryInfoKey(key_object)
try:
for i in range(sub_keys_count):
sub_key_name = EnumKey(key_object, i)
yield sub_key_name
except WindowsError:
pass
def get_values(key, fields):
partial_key, root_hive = parse_key(key)
with ConnectRegistry(None, root_hive) as reg:
with OpenKey(reg, partial_key) as key_object:
data = {}
for field in fields:
try:
value, type = QueryValueEx(key_object, field)
data[field] = value
except WindowsError:
pass
return data
def get_value(key, field):
values = get_values(key, [field])
return values.get(field)
def join(path, *paths):
path = path.strip('/\\')
paths = map(lambda x: x.strip('/\\'), paths)
paths = list(paths)
result = os.path.join(path, *paths)
result = result.replace('/', '\\')
return result
В этой статье мы рассмотрим, как использовать Python для редактирования реестра в операционной системе Windows. Реестр — это центральное хранилище информации о системе и всех установленных программах. Он содержит ключи и значения, которые можно изменять с помощью различных инструментов, включая Python.
Python обеспечивает доступ к реестру с помощью модуля winreg, который входит в стандартную библиотеку. Этот модуль позволяет читать, записывать и удалять ключи и значения реестра.
Первым шагом в использовании модуля winreg является импорт:
import winreg
Далее мы можем открыть определенную ветвь реестра с помощью функции winreg.OpenKey. Функция принимает два аргумента: первый — константу, определяющую ветвь реестра, и второй — строку, содержащую путь к конкретной ветви. Например, чтобы открыть ветвь HKEY_CURRENT_USER, мы можем использовать следующий код:
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft")
Вместо r»Software\Microsoft» вы можете указать путь к любой другой ветви реестра, с которой хотите работать.
Когда мы открываем ветвь реестра, мы можем читать значения, удалять их или записывать новые. Чтение значения осуществляется с помощью функции winreg.QueryValue, которая принимает два аргумента: первый — объект ключа, второй — строку, содержащую имя значения. Например:
value = winreg.QueryValue(key, "ProgramFilesDir") print(value)
В данном примере мы читаем значение «ProgramFilesDir» из открытой ранее ветви реестра и выводим его на экран.
Чтобы записать значение в реестр, можно использовать функцию winreg.SetValue, которая принимает четыре аргумента: объект ключа, имя значения, его тип (например, строка, целое число или двоичные данные) и само значение. Например, чтобы записать строковое значение, мы можем использовать следующий код:
winreg.SetValue(key, "NewValue", winreg.REG_SZ, "Hello, World!")
В данном примере мы записываем значение «Hello, World!» с именем «NewValue» в открытую ранее ветвь реестра. winreg.REG_SZ — это константа, которая указывает, что мы записываем строковое значение.
Если вы хотите удалить ключ или значение из реестра, вы можете использовать функции winreg.DeleteKey и winreg.DeleteValue соответственно. Например, чтобы удалить ключ, вы можете использовать следующий код:
winreg.DeleteKey(key, "SubKey")
В данном примере мы удаляем ключ с именем «SubKey» из открытой ранее ветви реестра.
После завершения работы с реестром необходимо закрыть объект ключа с помощью функции winreg.CloseKey:
winreg.CloseKey(key)
В данной статье мы рассмотрели основы редактирования реестра с помощью Python. Модуль winreg предоставляет мощные инструменты для работы с системным реестром в операционной системе Windows. Пользуясь вышеописанными методами, вы можете создавать, изменять и удалять ключи и значения в реестре, что позволяет полностью контролировать системные настройки и поведение программ.
Работа с реестром требует аккуратности, поскольку ошибки могут привести к неправильной работе системы. Поэтому перед внесением изменений в реестр рекомендуется создавать резервные копии или использовать инструменты для системного администрирования.
Python’s standard library is known for including lots of handy modules and packages that can be used without installing anything else. That’s one of the primary reasons that its standard library is called “batteries included” so often. So it should come as no surprise that Python includes a Windows only module for editing the Windows Registry. This particular module goes by the odd name of _winreg (odd because it starts with an underscore). In this article, we’ll learn the basics of working with the Registry using this “battery”.
Reading from the Registry
Using Python to read data from the registry is very easy. In the following example, we’ll find out where Outlook Express is installed:
from _winreg import * key = OpenKey(HKEY_LOCAL_MACHINE, r'Software\Microsoft\Outlook Express', 0, KEY_ALL_ACCESS) QueryValueEx(key, "InstallRoot")
On my machine, this will return the following tuple: (u’%ProgramFiles%\\Outlook Express’, 2). The tuple is made up of the value and the registry type of said value. There are two other query methods that one can use called QueryInfoKey and QueryValue. The former gives you information about the key itself in form of three integers while the latter retrieves only the data for a key’s first value that has a NULL name. The documentation recommends that you use QueryValueEx whenever possible.
We should probably quickly explain what’s going on in the code above as well. The OpenKey function takes an HKEY* constant, a subkey path string, a reserved integer (which must be zero) and the security mask. In this case, we passed in KEY_ALL_ACCESS which gives us complete control of that key. Since all we were doing was reading it, we probably should have just used KEY_READ though. As for what QueryValueEx does, it just accepts a key object and the field name that we want to query against.
Writing to the Registry
If you’ve been reading this blog lately, then you’ve probably already seen the _winreg module used for writing to the registry. This will just be review for you, so feel free to skip this section. We’ll start out with a practical example. In the following code snippet, we will set Internet Explorer’s home page. As always, please note that editing Registry entries can be dangerous. IMPORTANT: Be sure to back up your registry before attempting to edit it. Now, on with the show!
keyVal = r'Software\Microsoft\Internet Explorer\Main' try: key = OpenKey(HKEY_CURRENT_USER, keyVal, 0, KEY_ALL_ACCESS) except: key = CreateKey(HKEY_CURRENT_USER, keyVal) SetValueEx(key, "Start Page", 0, REG_SZ, "https://www.blog.pythonlibrary.org/") CloseKey(key)
In the code above, we attempt to open the following key: HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main and set the “Start Page” value to this blog. If the open fails, it’s usually because the key doesn’t exist, so we try to create the key in our exception handler. Then we use SetValueEx to actually set the value and like all good programmers, we clean up when we’re done and close the key. If you skipped the CloseKey command, you’d be fine in this case as the script is done and Python will do it for you. However, if you continued working on this key, you might have an access violation since it’s already open. Thus, the lesson is to always close a key when you finish editing it.
Other _winreg Methods
There are several other methods in the _winreg library worth pointing out. The DeleteKey method is handy when you need to remove a key. Unfortunately, I’ve had occasion when I need to remove keys recursively, such as when an uninstall goes bad and _winreg has no built-in way of doing that. You can write your own, of course, or you can download a wrapper like YARW (Yet Another Registry Wrapper) that can do it for you.
DeleteValue is similar to DeleteKey, except that you delete just a value. Yes, it’s pretty obvious. If you’d wanted to write your own recursive key deleting code, then you’d probably want to take a look at EnumKey and EnumValue as they enumerate keys and values respectively. Let’s take a quick look at how to use EnumKey:
from _winreg import EnumKey, HKEY_USERS try: i = 0 while True: subkey = EnumKey(HKEY_USERS, i) print subkey i += 1 except WindowsError: # WindowsError: [Errno 259] No more data is available pass
The code above will loop through the HKEY_USERS hive printing the subkey to stdout until we reach the end of the hive and a WindowsError is raised. Of course, this does not descend into the subkeys, but I’ll leave that as an exercise for the reader to figure out.
The last method that we’ll talk about here is ConnectRegistry. This is helpful if we need to edit the Registry of a remote machine. It only accepts two arguments: the computer name and the key to connect to (i.e. HKEY_LOCAL_MACHINE or some such). Note that when connecting to remote machines, you can only edit certain keys while the others are unavailable.
Wrapping Up
I hope this was helpful for you and that it gave you lots of good ideas for your future projects. I have many login scripts that use this wonderful library and a couple that use YARW. It’s been quite useful so far and I hope that it will be the same for you.
UPDATE (10/14/2011): We now have a Brazilian Portuguese translation of this post up on Carlisson Galdino’s blog
Further Reading
- Official documentation for _winreg
- Effbot tutorial on _winreg