Получение данных реестра

Вы можете получить или изменить данные реестра с помощью класса WMI StdRegProv и его методов. При использовании служебной программы Regedit для просмотра и изменения значений реестра на локальном компьютере StdRegProv позволяет использовать скрипт или приложение для автоматизации таких действий на локальном компьютере и удаленных компьютерах.

StdRegProv содержит методы для выполнения следующих действий:

  • Проверка разрешений доступа для пользователя
  • Создание, перечисление и удаление разделов реестра
  • Создание, перечисление и удаление вложенных ключей или именованных значений
  • Чтение, запись и удаление значений данных

Данные реестра организованы поддерями, ключами и вложенными ключами, вложенными под ключом верхнего уровня. Фактические значения данных называются записями или именованными значениями.

Ниже приведены поддеревы:

  • HKEY_CLASSES_ROOT (сокращено как HKCR)
  • HKEY_CURRENT_USER (HKCU)
  • HKEY_LOCAL_MACHINE (HKLM)
  • HKEY_USERS
  • HKEY_CURRENT_CONFIG

Например, в записи реестра HKEY\SOFTWARE\Microsoft\DirectX\InstalledVersion поддерев HKEY — SOFTWARE, подключи — Microsoft и DirectX, а именованное значение — InstalledVersion.

RegistryKeyChangeEvent возникает при изменении определенного ключа, но запись не определяет, как изменяются значения, и это событие не активируется изменениями под указанным ключом. Чтобы определить изменения в иерархической структуре ключей, используйте RegistryTreeChangeEvent, который не возвращает определенные значения или изменения ключей, которые происходят. Чтобы получить определенное изменение значения входа, используйте RegistryValueChangeEvent, а затем прочитайте запись, чтобы получить базовое значение.

StdRegProv имеет только методы, которые можно вызывать из C++ или скрипта, которые отличаются от структуры классов Win32.

В следующем примере кода показано, как использовать метод StdRegProv.EnumKey для перечисления всех подразделов программного обеспечения Майкрософт в разделе реестра.

HKEY_LOCAL_MACHINE ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ\Майкрософт\

const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."

Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")

strKeyPath = "SOFTWARE\Microsoft"
objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys

For Each subkey In arrSubKeys
Wscript.Echo subkey
    
Next

Примечание.

VBScript устарел. Дополнительные сведения см. в записи блога о прекращении использования VBScript: временная шкала и дальнейшие действия.


# The signature for EnumKey method of StdRegProv class:
#
# uint32 EnumKey(
#  [in]  uint32 hDefKey = HKEY_LOCAL_MACHINE,
#  [in]  string sSubKeyName,
#  [out] string sNames[]
# );

$arguments = @{
    hDefKey = [uint32]2147483650 # HKEY_LOCAL_MACHINE
    sSubKeyName = 'SOFTWARE\Microsoft'
}

$subkeys = Invoke-CimMethod -ClassName StdRegProv -MethodName EnumKey -Arguments $arguments
subkeys.sNames

StdRegProv имеет различные методы для чтения различных типов данных значений записи реестра. Если запись имеет неизвестные значения, можно вызвать StdRegProv.EnumValues для их перечисления. В следующей таблице перечислены соответствия между методами StdRegProv и типами данных.

Способ Тип данных
GetBinaryValue REG_BINARY
GetDWORDValue REG_DWORD
GetExpandedStringValue REG_EXPAND_SZ
GetMultiStringValue REG_MULTI_SZ
GetStringValue REG_SZ

 

В следующей таблице перечислены соответствующие методы для создания новых ключей или значений или изменения существующих.

Способ Тип данных
SetBinaryValue REG_BINARY
SetDWORDValue REG_DWORD
SetExpandedStringValue REG_EXPAND_SZ
SetMultiStringValue REG_MULTI_SZ
SetStringValue REG_SZ

 

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

\система событий\HKEY_LOCAL_MACHINE SYSTEM\Current Control Set Services\\

Обратите внимание, что элементы в многостроонном значении рассматриваются как коллекция или массив.

const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."

Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")

strKeyPath = "SYSTEM\CurrentControlSet\Services\Eventlog\System"
objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys

For Each subkey In arrSubKeys
Wscript.Echo subkey
    
Next

Примечание.

VBScript устарел. Дополнительные сведения см. в записи блога о прекращении использования VBScript: временная шкала и дальнейшие действия.


# The signature for EnumKey method of StdRegProv class:
#
# uint32 EnumKey(
#  [in]  uint32 hDefKey = HKEY_LOCAL_MACHINE,
#  [in]  string sSubKeyName,
#  [out] string sNames[]
# );

$arguments = @{
    hDefKey = [uint32]2147483650 # HKEY_LOCAL_MACHINE
    sSubKeyName = 'SYSTEM\CurrentControlSet\Services\Eventlog\System'
}

$subkeys = Invoke-CimMethod -ClassName StdRegProv -MethodName EnumKey -Arguments $arguments
subkeys.sNames

Поставщик реестра размещается в LocalService, а не LocalSystem. Поэтому удаленное получение информации из поддеревого HKEY_CURRENT_USER невозможно. Однако скрипты, выполняемые на локальном компьютере, по-прежнему могут получить доступ к HKEY_CURRENT_USER. Модель размещения можно задать на локальном компьютере, но это риск безопасности, так как реестр на удаленном компьютере уязвим для враждебного доступа. Дополнительные сведения см. в разделе "Размещение и безопасность поставщика".

Задачи WMI: Реестр