Программная работа с Реестром Windows

Реестром Windows называют хранилище параметров самой системы Windows, ее штатных и сторонних компонентов, а также пользователей системы. Хранилище реестра представляется как иерархия кустов и разделов, содержащих значения параметров нескольких типов.

Фактически Реестр является не единым объектом, а динамическим набором кустов, каждый из которых находится в специальном файле:

  • HKEY_LOCAL_MACHINE виртуальный куст Системы
    • \HARDWARE виртуальный динамический куст Оборудования
    • \BCD00000000 %SystemRoot%\Boot\BCD
    • \SYSTEM куст Системы: %SystemRoot%\System32\config\SYSTEM
    • \SOFTWARE куст Программ: %SystemRoot%\System32\config\SOFTWARE
    • \SECURITY куст Безопасности (скрытая в regedit): %SystemRoot%\System32\config\SECURITY
    • \SAM куст Безопасности (скрытая в regedit): %SystemRoot%\System32\config\SAM
  • HKEY_USERS виртуальный куст Пользователей
    • \.DEFAULT %SystemRoot%\System32\config\DEFAULT
    • \S-1-5-18 куст системной учетной записи system: %SystemRoot%\System32\config\systemprofile\NTUSER.DAT
    • \S-1-5-19 куст системной учетной записи LocalService: %SystemRoot%\ServiceProfiles\LocalService\NTUSER.DAT
    • \S-1-5-20 куст системной учетной записи NetworkService: %SystemRoot%\ServiceProfiles\NetworkService\NTUSER.DAT
    • \<SID_пользователя> кустов параметров пользователя %USERPROFILE%\NTUSER.DAT
    • \<SID_пользователя>_Classes куст пользователя %USERPROFILE%\AppData\Local\Microsoft\Windows\UsrClass.dat
  • HKEY_CURRENT_USER динамический куст пользователя активного сеанса

Источники: Реестр Windows на //ru.wikipedia.org

1С:Предприятие 8.x через WMI

В среде платформы 1С инструменты для работы с реестром не предусмотрены, поэтому необходимо использовать объект COM с доступом к  Windows Management Instrumentation (WMI), который служит базовой технологией для централизованного управления и слежения за работой различных частей компьютерной инфраструктуры под управлением Windows. Для управления системным реестром предназначен объект RegProv, он детально описан на //docs.microsoft.com/ru-ru/.

Объект провайдера реестра RegProv может управлять не только локальным реестром, но и реестром другого доступного по сети компьютера, имя которого задается при инициализации:

Объект провайдера реализует набор методов:

Метод Описание
CheckAccess(hDefKey, sSubKeyName, lRequired, bGranted) Проверяет, имеет ли пользователь указанные разрешения. Возвращает целое число (код ошибки) или 0, если метод завершён успешно. Параметры:

  • hDefKey — ветвь реестра, в которой находится проверяемый раздел. По умолчанию — HKEY_LOCAL_MACHINE (_H80000002).
  • sSubKeyName — проверяемый раздел.
  • lRequired — право доступа, наличие которого проверяется. По умолчанию — KEY_QUERY_VALUE и KEY_SET_VALUE (3).
  • bGranted — если после выполнения метода этот параметр равен True, пользователь имеет указанное право.
CreateKey(hDefKey, sSubKeyName) Создаёт подраздел указанного раздела. Возвращает целое число (код ошибки) или 0, если метод завершён успешно. Параметры:

  • hDefKey — ветвь реестра, в которой будет находиться создаваемый раздел. По умолчанию — HKEY_LOCAL_MACHINE (_H80000002).
  • sSubKeyName — раздел, который будет создан. Метод создаст все разделы, указанные в пути, которые ещё не существуют.
DeleteKey(hDefKey, sSubKeyName) Удаляет подраздел указанного раздела. Возвращает целое число (код ошибки) или 0, если метод завершён успешно. Чтобы удалить раздел, необходимо сначала удалить все его подразделы. Параметры:

  • hDefKey — ветвь реестра, в которой находится удаляемый раздел. По умолчанию — HKEY_LOCAL_MACHINE (_H80000002).
  • sSubKeyName — раздел, который будет удалён.
DeleteValue(hDefKey, sSubKeyName, sValueName) Удаляет указанный параметр в определённом разделе. Возвращает целое число (код ошибки) или 0, если метод завершён успешно. Параметры:

  • hDefKey — ветвь реестра, в которой находится удаляемый параметр. По умолчанию — HKEY_LOCAL_MACHINE (_H80000002).
  • sSubKeyName — раздел, который содержит удаляемый параметр.
  • sValueName — имя параметра, который будет удалён. Укажите пустую строку, чтобы присвоить параметру по умолчанию значение «»value not set»» («»значение не присвоено»»).
EnumKey(hDefKey, sSubKeyName, sNames[]) Перечисляет подразделы указанного раздела. Возвращает целое число (код ошибки) или 0, если метод завершён успешно. Параметры:

  • hDefKey — ветвь реестра, в которой находится раздел. По умолчанию — HKEY_LOCAL_MACHINE (_H80000002).
  • sSubKeyName — раздел.
  • sNames — массив строк, содержащий подразделы (после выполнения метода).
EnumValues(hDefKey, sSubKeyName, sNames[], Types[]) Перечисляет параметры указанного раздела. Возвращает целое число (код ошибки) или 0, если метод завершён успешно. Параметры:

  • hDefKey — ветвь реестра, в которой находится раздел. По умолчанию — HKEY_LOCAL_MACHINE (_H80000002).
  • sSubKeyName — раздел.
  • sNames — массив строк, содержащий имена параметров (после выполнения метода). Точно корреспондирует с массивом Types.
  • Types — массив целочисленных значений типов данных параметров (после выполнения метода). Точно корреспондирует с массивом sNames.
GetBinaryValue(hDefKey, sSubKeyName, sValueName, Value[]) Возвращает значение для указанного параметра, тип данных которого — REG_BINARY, REG_DWORD, REG_EXPAND_SZ, REG_MULTI_SZ или REG_SZ соответственно (конкретный метод нужно выбирать по типу данных параметра). Возвращает целое число (код ошибки) или 0, если метод завершён успешно. Параметры:

  • hDefKey — ветвь реестра, в которой находится параметр. По умолчанию — HKEY_LOCAL_MACHINE (_H80000002).
  • sSubKeyName — раздел, в котором находится параметр.
  • sValueName — имя параметра, значение которого должно быть возвращено. Укажите пустую строку, чтобы получить значение параметра по умолчанию.
  • Value — значение параметра: массив байтов, значение DWORD, строка или массив строк (после выполнения метода).
GetDWORDValue(hDefKey, sSubKeyName, sValueName, Value)
GetExpandedStringValue(hDefKey, sSubKeyName, sValueName, Value)
GetMultiStringValue(hDefKey, sSubKeyName, sValueName, Value[])
GetQWORDValue(hDefKey, sSubKeyName, sValueName, Value)
GetStringValue(hDefKey, sSubKeyName, sValueName, Value)
SetBinaryValue(hDefKey, sSubKeyName, sValueName, Value[]) Устанавливает значение для указанного параметра, тип данных которого — REG_BINARY, REG_DWORD, REG_EXPAND_SZ, REG_MULTI_SZ или REG_SZ соответственно (конкретный метод нужно выбирать по типу данных параметра). Возвращает целое число (код ошибки) или 0, если метод завершён успешно. Параметры:

  • hDefKey — ветвь реестра, в которой находится параметр. По умолчанию — HKEY_LOCAL_MACHINE (_H80000002).
  • sSubKeyName — раздел, в котором находится параметр.
  • sValueName — имя параметра, значение которого должно быть установлено. Укажите пустую строку, чтобы установить значение параметра по умолчанию. Если указанный параметр не существует, он будет создан.
  • Value — значение параметра: массив байтов, значение DWORD, строка или массив строк.
SetDWORDValue(hDefKey, sSubKeyName, sValueName, Value)
SetExpandedStringValue(hDefKey, sSubKeyName, sValueName, Value)
SetMultiStringValue(hDefKey, sSubKeyName, sValueName, Value)
SetQWORDValue(hDefKey, sSubKeyName, sValueName, Value)
SetStringValue(hDefKey, sSubKeyName, sValueName, Value)
GetSecurityDescriptor(hDefKey,
sSubKeyName, Descriptor)
The GetSecurityDescriptor method returns the security descriptor that controls access to the specified registry key. The security descriptor is returned as an instance of __SecurityDescriptor. For more information, see Changing Access Security on Securable Objects.
Parameters:

  • hDefKey [in] — A registry tree, also known as a hive, that contains the sSubKeyName path. The default value is HKEY_LOCAL_MACHINE.
  • sSubKeyName [in] — The name of the registry key that has the security descriptor.
  • Descriptor [out] — The security descriptor from the key.

Return value:
In C++, the method returns a uint32 value that is 0 (zero) if successful. If the function fails, the return value is a nonzero error code that is defined in WinError.h. In C++, use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error. You can also look up return values under the WMI Error Constants.
In scripting or Visual Basic, the method returns an integer value that is 0 (zero) if successful. If the function fails, the return value is a nonzero error code that you can look up in WbemErrorEnum.
Remarks: 
The Win32_SecurityDescriptor instance represents a SECURITY_DESCRIPTOR_CONTROL data type and contains a discretionary access control list (DACL) and a system access control list (SACL). For more information, see Access Control Lists.
If the SeSecurityPrivilege is not granted or enabled when getting a security descriptor, then only the DACL is returned in the returned security descriptor. For more information, see Privilege Constants and Executing Privileged Operations.

SetSecurityDescriptor(hDefKey, sSubKeyName, Descriptor) The SetSecurityDescriptor method updates the security descriptor of the specified key with a new security descriptor that is defined by an instance of a __SecurityDescriptor class.
Parameters

  • hDefKey [in] — A registry tree, also known as a hive, that contains the sSubKeyName path. The default value is HKEY_LOCAL_MACHINE.
  • sSubKeyName [in] — The key name on which to set the security descriptor.
  • Descriptor [in] — The security descriptor to set on the key name.

Return value
In C++, the method returns a uint32 value that is 0 (zero) if successful. If the function fails, the return value is a nonzero error code that is defined in WinError.h. In C++, use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error. You can also look up return values under the WMI Error Constants.
In scripting or Visual Basic, the method returns an integer value that is 0 (zero) if successful. If the function fails, the return value is a nonzero error code that you can look up in WbemErrorEnum.

Remarks
The Win32_SecurityDescriptor instance represents a SECURITY_DESCRIPTOR_CONTROL data type and contains a discretionary access control list (DACL) and a system access control list (SACL). For more information, see Access Control Lists.
If the SeSecurityPrivilege is not granted or enabled when getting a security descriptor, then only the DACL is returned in the returned security descriptor. For more information, see Privilege Constants and Executing Privileged Operations.
You can update both the DACL and the SACL in the Win32_SecurityDescriptor instance when calling this method, but you also can update only the DACL or only the SACL.

The following values in SECURITY_DESCRIPTOR_CONTROL determine whether the DACL or the SACL or both are updated.

  • SE_DACL_PRESENT — Indicates that the DACL should be updated. If this is not set then WMI preserves the original value of the DACL.
  • SE_SACL_PRESENT — Indicates that the SACL should be updated. If this is not set then WMI preserves the original value of the SACL. To update the SACL, the account must have the SeSecurityPrivilege privilege enabled. For scripting, the privilege name is SeSecurityPrivilege. For more information, see Privilege Constants.

If the Group trustee and the Owner trustee properties are not NULL, then they are updated. Otherwise, WMI preserves the original values. For more information, see WMI Security Descriptor Objects.
When a new SACL is NULL in a call this method, then the security descriptor SACL on the target securable object is left unchanged.

Для параметра hDefKey предусмотрены следующие значения:

вид куста реестра (hdefkey) HEX DEC Комментарий
HKEY_CLASSES_ROOT &H80000000 2147483648
HKEY_CURRENT_USER &H80000001 2147483649
HKEY_LOCAL_MACHINE &H80000002 2147483650
HKEY_USERS &H80000003 2147483651
HKEY_CURRENT_CONFIG &H80000005 2147483653
HKEY_DYN_DATA &H80000006 2147483654 только для Windows 95 и Windows 98

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

Тип параметра Реестра Код типа Комментарий
REG_SZ 1 Код типа для Строкового значения
REG_EXPAND_SZ 2 Код типа для Расширяемого строкового значения
REG_BINARY 3 Код типа для Бинарного значения
REG_DWORD 4 Код типа для Числового 32 бита значения
REG_MULTI_SZ 7 Код типа для Мультистрокового значения
REG_QWORD 11 Код типа для Числового 64 бита значения
REG_FULL_RESOURCE_DESCRIPTOR
REG_LINK
REG_NONE
REG_RESOURCE_LIST
REG_RESOURCE_REQUIREMENTS_LIST
Эти типы упоминаются в документации в качестве существующих, но методы для работы с ними не упоминаются.

///

Чтение имен, типов и значений

Для получения из реестра строкового значения применяется метод .GetStringValue(…):

Если значение по типу не будет соответствовать примененному методу, то результатом будет NULL, поэтому для успешного получения, тип параметра необходимо знать заранее. Если тип неизвестен, то его можно получить из перечисления всех параметров в разделе (метод получения типа определенного параметра не предусмотрен).

Перечислить все значения в разделе можно с помощью метода .ЕnumValues(…), который возвращает в два последних параметра пару массивов типа COMSafeArray, содержащие имена и коды типов:

Перечислить все ключи в разделе можно с помощью метода .ЕnumKeys(…), который возвращает в последний параметр массив типа COMSafeArray, содержащий имена ключей:

Запись

Запись параметра тоже осуществляется методом в строгом соответствии с типом, поскольку метод переустанавливает тип параметра, независимо от того, какой тип был до записи, если до записи, параметра не существовало, то он будет создан, если раздел параметра не существует то запись не выполнится:

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

Массивы COMSafeArray

В тех случаях, когда в качестве параметров используется массив, COMObject использует массив типа COMSafeArray. 1С поддерживает работу с этим типом и краткая справка о его методах есть в справочной системе конфигуратора.

Создать и работать с массивом COMSafeArray можно средствами его методов, однако существует и возможность преобразования массива COMSafeArray в обычный Массив методом .Выгрузить(), и также есть возможность обратного преобразования через специальный конструктор.

Важно заметить, что COMSafeArray требователен к типизации своих данных. Тип данных нового массива определяется вторым параметром конструктора, для которого существует несколько вариантов, описанных на //its.1c.ru:

  • VT_NULL
  • VT_EMPTY
  • VT_I4 — Число Integer x32
  • VT_R8 — Число Real x64
  • VT_BSTR — Строка
  • VT_DATE — Дата
  • VT_BOOL — Булево
  • VT_NULL — NULL
  • VT_I2, VT_I4, VT_R4, VT_R8, VT_CY, VT_ERROR, VT_DECIMAL, VT_I1, VT_UI1, VT_UI2, VT_UI4, VT_I8, VT_UI8, VT_INT, VT_UINT —  Число

Неправильный выбор параметра типа преобразования часто приводит к ошибке «-2147352571(0x80020005): Несовпадение типов«.

Источники:

Практическое назначение некоторых разделов реестра

Источники ODBC

HKLM\SOFTWARE\Microsoft\ODBC\ODBC.INI
HKLM\SOFTWARE\ODBC\ODBC.INI

Перечисление ресурсов для Потоковой передачи мультимедиа

HKCU\<sid>\Software\Microsoft\MediaPlayer\Preferences\HME\ShareFolders
HKU\<sid>\Software\Microsoft\MediaPlayer\Preferences\HME\ShareFolders

Физическая структура Реестра

Источник: Где хранится реестр на //iteron.ru

HKEY_LOCAL_MACHINE\\SECURITY

Папка реестра, также отвечающая за настройки безопасности Windows. Эта папка вообще не видна в обычном редакторе реестра REGEDIT. Редак-тор REGISTRAR позволяет смотреть и редактировать. В этой ветви живут пользователи, группы, относящиеся к ним политики безопасности и тому по-добные вещи. Содержимое этой папки хранится в файлах, также находящих-ся в каталоге C:\\WINDOWS\\SYSTEM32\\ CONFIG. Файлы называются SECU-RITY, SECURITY.SAV и SECURITY.LOG.

Папка HKEY_LOCAL_MACHINE\\SOFTWARE

Папка реестра, в которой хранятся настройки различных приложений и самого Windows, общие для всех пользователей. Папка доступна для редак-тирования обычным REGEDIT, так что сами посмотрите, что именно в ней лежит. Как вы уже, наверно, догадались, содержимое этой папки, опять-таки, хранится в файлах, находящихся в каталоге C:\\WINDOWS\\SYSTEM32\\CONFIG. Файлы называются SOFTWARE, SOFTWARE.SAV и SOFTWARE.LOG.

Папка HKEY_LOCAL_MACHINE\\SYSTEM

Папка реестра, в которой хранятся настройки вашего компьютерного железа. Тут же лежат описания запускаемых на вашей машине сервисов и тому подобные низкоуровневые вещи. Папка доступна для свободного ре-дактирования через REGEDIT. Содержимое этой папки хранится в файлах, находящихся в каталоге… Ну как, догадались? Так и есть: C:\\WINDOWS\\SYSTEM32\\CONFIG. Файлы называются SYSTEM, SYSTEM.SAV и SYSTEM.LOG.

Папка HKEY_USERS\\.DEFAULT

Папка реестра, в которой хранятся настройки так называемого «пользо-вателя по умолчанию». Настройки этого пользователя служат своеобразным макетом, на основе которого формируются настройки всех остальных вновь создаваемых вами пользователей. Система просто копирует все содержимое этой папки в папку HKEY_USERS вновь созданного пользователя. Папка дос-тупна для свободного редактирования через REGEDIT. Содержимое этой папки хранится в файлах, находящихся в каталоге C:\\WINDOWS\\SYSTEM32\\ CONFIG. Файлы называются DEFAULT, DE-FAULT.SAV и DEFAULT.LOG.

Папки каждого отдельного пользователя внутри HKEY_USERS

Хранят настройки программ под каждого конкретного пользователя, имеющегося в вашей системе. В момент установки WINDOWS XP регистри-рует как минимум двух пользователей «Администратора» и того пользовате-ля, имя которого вы указали на одном из экранов ее установки. Папка дос-тупна для свободного редактирования через REGEDIT. Содержимое этой папки хранится в файлах, находящихся в каталоге… а вот и не угадали! На этот раз в C:\\Documents and Settings\\<имя пользователя>. Файл называется NTUSER. DAT. Рядышком обычно лежат файлы-компаньоны. В файле NTUSER.LOG хранится содержимое ветви HKEY_ CURRENT_USER. Файлы NTUSER.POL и NTUSER.INI создаются редактором глобальных политик WINDOWS, в них хранятся созданные с его помощью политики для этого пользователя. О редакторе политик мы еще с вами поговорим в последую-щих статьях цикла.

Папка HKEY_USERS\\USER_CLASSES

Эта папка является дополнением к папке HKEY_LOCAL_MACHINE\\SOFTWARE\\CLASSES. В ней хранятся классы и ти-пы приложений, зарегистрированные (или измененные) под этого конкретно-го пользователя. Эти данные хранятся в файлах USRCLASS.DAT и USRCLASS.DAT.LOG. Файлы расположены в папке C:\\Documents and Settings\\ <имя пользователя>\\Local Settings\\Ap-plication Data\\Microsoft\\ Windows.

Такие папки как HKEY_LOCAL_ MACHINE и HKEY_USERS в реальности не существуют. Система строит их только для нашего удобства.

 

Добавить комментарий