[PowerShell] Использование класса WMI StdRegProv для работы с реестром ОС Windows

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
7,814
Реакции
6,593
Автор: Сергей Васин

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

StdRegProv отличается от большинства классов WMI в том, каким способом осуществляется взаимодействие с данным классом. Получить экземпляр объекта класса StdRegProv можно несколькими способами:

PowerShell:
$srp = [wmiclass]"\\computername\root\default:StdRegProv"


1.jpg


либо
PowerShell:
$srp = Get-WMIObject –Namespace 'root\default' –list –ComputerName 'computername' |
Where-Object {$_.name –eq 'StdRegProv'}

2.jpg


Содержимое переменной $srp.

3.jpg


Хотя в более ранних операционных системах (WindowsXP, WindowsServer 2003) этот класс находился только в пространстве имен ‘root\default’, в нынешнем поколении операционок (Windows 7) он также находится в пространстве имен ‘root\cimv2’, которое в большинстве случаев является пространством имен по умолчанию.

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

Эти значения приведены в таблице:
Название раздела |Шестнадцатеричное значение |Десятичное значение
HKEY_CLASSES_ROOT |0x80000000| 2147483648
HKEY_CURRENT_USER |0x80000001| 2147483649
HKEY_LOCAL_MACHINE |0x80000002| 2147483650
HKEY_USERS |0x80000003| 2147483651
HKEY_CURRENT_CONFIG |0x80000005| 2147483653
HKEY_DYN_DATA (Windows 9x) |0x80000006| 2147483655

Стоит отметить, что на удаленных компьютерах вы не сможете использовать раздел HKEY_CURRENT_USER. Это связано с тем, что провайдер реестра работает под учетной записью LocalService, а не LocalSystem. Хотя, на локальном компьютере он будет доступен для использования.

Определим переменную $hklm, которая будет содержать значение 2147483650, соответствующее разделу реестра HKEY_LOCAL_MACHINE.
PowerShell:
$hklm = 2147483650

4.jpg



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



Итак, методы, предлагаемые нам классом WMIStdRegProv.

EnumKey
PowerShell:
$srp.EnumKey(defKey,subKeyName)

5.jpg


Этот метод используется для перечисления ключей реестра, являющихся дочерними по отношению к ключу, заданному переменной subKeyName, находящемуся в разделе, заданном переменной defKey.

Переменная defKey, это числовое значение, соответствующее определенному разделу реестра.

Переменная subKeyName – это переменная типа string, указывающая путь к ключу реестра, список дочерних ключей которого мы хотим получить.

6.jpg


Метод возвращает объект, имеющий, кроме системных, два свойства: ReturnValue и sNames.

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

sNames – это массив строк, содержащий список ключей, дочерних по отношению к ключу, указанному в параметрах метода.

Присваивание переменной $result объекта, возвращаемого методом EnumKey.

7.jpg


Значение свойства ReturnValue.

8.jpg


Значение свойства sNames.

9.jpg


EnumValues
PowerShell:
$srp.EnumValues(defKey,subKeyName)

10.jpg



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

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

11.jpg


Метод возвращает объект содержащий три свойства (кроме системных): ReturnValue, sNames и Types.

ReturnValue – это, как и в предыдущем методе, числовое значение, указывающее успешность выполнения метода.

sNames – это массив строк, содержащий список записей реестра в ключе, находящемся по указанному пути (subKeyName) в указанном разделе (defKey).

Types – это массив числовых значений, соответствующих типам записей реестра.

Список типов записей реестра и соответствующих им числовых значений.
Тип записи |Обозначение типа записи |Числовое значение
String |REG_SZ| 1
Expandable String |REG_EXPAND_SZ| 2
Binary |REG_BINARY| 3
DWORD |REG_DWORD| 4
Multi-String |REG_MULTI_SZ| 7
QWORD |REG_QWORD| 11

То есть, если свойство sNames состоит из пяти элементов и мы хотим узнать тип третьего элемента в списке, нам нужно определить значение третьего элемента в массиве, содержащемся в свойстве Types и сопоставить его с таблицей типов записей реестра.

В данной случае все записи являются записями типа REG_DWORD.

Присваивание переменной $result объекта, возвращаемого методом EnumValues.

12.jpg


Значение свойства ReturnValue.

13.jpg


Значение свойства sNames.

14.jpg


Значение свойства Types.

15.jpg


CreateKey

Этот метод позволяет создать ключ или иерархию ключей в реестре
PowerShell:
$srp.CreateKey(defKey,subKeyName)

16.jpg



В качестве входных параметров метод принимает параметры раздела реестра (defKey) и строковый параметр пути, который нужно создать (subKeyName).

Например, чтобы создать ключ ‘Vendor’ под ключом ‘Software’ в разделе HKEY_LOCAL_MACHINE, команда должна выглядеть так:
PowerShell:
$srp.CreateKey($hklm,"Software\Vendor")

Если же мы хотим создать иерархию ключей, например ‘Vendor\Product’, то нам не обязательно вызывать данный метод дважды. Мы может создать оба этих ключа при помощи одной команды:
PowerShell:
$srp.CreateKey($hklm,"Software\Vendor\Product")

17.jpg



Данный метод возвращает объект, содержащий одно свойство, которое может быть нам полезно – это свойство ReturnValue, содержащее код, указывающий успешно ли выполнен метод.

18.jpg
 
Последнее редактирование:
DeleteKey

Этот метод удаляет определенный ключ в указанном разделе реестра.
PowerShell:
$srp.DeleteKey(degKey,subKeyName)

1.jpg



В качестве входных параметров метод принимает параметры раздела реестра (defKey) и строковый параметр пути к ключу, который требуется удалить (subKeyName).

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

Например, мы вызываем метод DeleteKey со следующими параметрами:
PowerShell:
$srp.DeleteKey($hklm,"Software\Vendor\Product")

В данном случае результатом выполнения метода будет удаление ключа ‘Product’, находящегося под ключом ‘Vendor’.

Метод без подтверждения удаляет все записи реестра находящиеся в указанном ключе.

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

2.jpg


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

Метод возвращает объект, содержащий свойство ReturnValue, значение которого указывает, успешно ли выполнен метод. Значение 0 указывает на то, что метод был выполнен без ошибок, любое другое значение свидетельствует о каких-либо факторах, препятствующих успешному выполнению метода.

3.jpg


DeleteValue

Метод позволяет удалить определенную запись реестра, находящуюся в указанном ключе.
PowerShell:
$srp.DeleteValue(defKey,subKeyName,deleteValue)

4.jpg



Данный метод принимает три параметра, числовое значение раздела реестра (defKey), строковое значение, указывающее расположение ключа (subKeyName), в котором находится запись, требующая удаления и имя самой записи (deleteValue), также в строковом формате.

При вызове метода со следующими параметрами:
PowerShell:
$srp.DeleteValue($hklm, "Software\Vendor\Product","Entry")

мы удалим запись ‘Entry’, находящуюся к ключе ‘Software\Vendor\Product’ раздела реестра HKEY_LOCAL_MACHINE.

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

5.jpg


GetStringValue

При помощи метода GetStringValue мы можем получить значение записи реестра типа REG_SZ.
PowerShell:
$srp.GetStringValue(defKey,subKeyName,valueName)

6.jpg



При вызове метода, нам нужно будет указать три параметра: числовое значение раздела реестра (defKey), строковое значение пути (subKeyName), по которому находится искомая запись и строковое же значение имени требуемой записи (valueName).

Метод возвращает объект, содержащий свойства ReturnValue, числовое значение которого указывает на успешность выполнения метода, и sValue, содержащее строковое значение запрашиваемой записи.

7.jpg


SetStringValue

Метод устанавливает новое значение существующей записи строкового типа. В случае отсутствия записи с данным именем, метод создает ее и присваивает указанное значение. Если же запись существует, но ее тип отличается от REG_SZ, метод переопределяет ее как запись строкового типа и присваивает указанное значение.
PowerShell:
$srp.SetStringValue(defKey,subKeyName,valueName,value)

8.jpg



Метод принимает четыре параметра: числовое значение раздела реестра (defKey), строковое значение пути (subKeyName), строковое значение имени требуемой записи (valueName), а также строку (либо переменную, содержащую строку), которая будет являться значением указанной записи.

Метод возвращает объект, содержащий свойство ReturnValue, указывающее успешность выполнения метода.

9.jpg


GetMultiStringValue

Метод получает значение записи реестра типа REG_MULTI_SZ.
PowerShell:
$srp.GetMultiStringValue(defKey,subKeyName,valueName)

10.jpg



Принимает три параметра: числовое значение раздела реестра (defKey), строковое значение пути (subKeyName), по которому находится искомая запись и строковое же значение имени требуемой записи (valueName).

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

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

11.jpg


SetMultiStringValue

Метод устанавливает новое значение существующей записи типа REG_MULTI_SZ. В случае отсутствия записи с данным именем, метод создает ее и присваивает указанное значение. Если же запись существует, но ее тип отличается от REG_MULTI_SZ, метод переопределяет ее как запись типа REG_MULTI_SZ и присваивает указанное значение.
PowerShell:
$srp.SetMultiStringValue(defKey,subKeyName,valueName,value)

12.jpg



Метод принимает четыре параметра: числовое значение раздела реестра (defKey), строковое значение пути (subKeyName), строковое значение имени требуемой записи (valueName), а также массив строк (либо переменную, содержащую этот массив) которые будут являться значением указанной записи.

Метод возвращает объект, содержащий свойство ReturnValue, указывающее успешность выполнения метода.

13.jpg
 
Последнее редактирование:
GetExpandedStringValue

Метод получает значение записи реестра типа REG_EXPAND_SZ.
PowerShell:
$srp.GetExpandedStringValue(defKey,subKeyName,valueName)

1.jpg



Принимает три параметра: числовое значение раздела реестра (defKey), строковое значение пути (subKeyName), по которому находится искомая запись и строковое же значение имени требуемой записи (valueName).

Метод возвращает объект, содержащий свойства ReturnValue, числовое значение которого указывает на успешность выполнения метода, и sValue, содержащее строковое значение запрашиваемой записи.

2.jpg


SetExpandedStringValue

Метод устанавливает новое значение существующей записи типа REG_EXPAND_SZ. В случае отсутствия записи с данным именем, метод создает ее и присваивает указанное значение. Если же запись существует, но ее тип отличается от REG_EXPAND_SZ, метод переопределяет ее как запись данного типа и присваивает указанное значение.
PowerShell:
$srp.SetExpandedStringValue(defKey,subKeyName,valueName,value)

3.jpg



Метод принимает четыре параметра: числовое значение раздела реестра (defKey), строковое значение пути (subKeyName), строковое значение имени требуемой записи (valueName), а также строку (либо переменную, содержащую строку), которая будет являться значением указанной записи.

Метод возвращает объект, содержащий свойство ReturnValue, указывающее успешность выполнения метода.

4.jpg


GetDWORDValue

Метод получает значение записи реестра типа REG_DWORD.
PowerShell:
$srp.GetDWORDValue(defKey,subKeyName,valueName)

5.jpg



Принимает три параметра: числовое значение раздела реестра (defKey), строковое значение пути (subKeyName), по которому находится искомая запись и строковое же значение имени требуемой записи (valueName).

Метод возвращает объект, содержащий свойства ReturnValue, числовое значение которого указывает на успешность выполнения метода, и uValue, содержащее значение запрашиваемой записи.

Значение свойства uValue представляет из себя целое число типа Int32.

6.jpg


SetDWORDValue

Метод устанавливает новое значение существующей записи типа REG_DWORD. В случае отсутствия записи с данным именем, метод создает ее и присваивает указанное значение. Если же запись существует, но ее тип отличается от REG_DWORD, метод переопределяет ее как запись типа REG_DWORD и присваивает указанное значение.
PowerShell:
$srp.SetDWORDValue(defKey,subKeyName,valueName,value)

7.jpg



Метод принимает четыре параметра: числовое значение раздела реестра (defKey), строковое значение пути (subKeyName), строковое значение имени требуемой записи (valueName), а также целое число (либо переменную, содержащую целочисленное значение типа Int32), которое будет являться значением указанной записи.

Метод возвращает объект, содержащий свойство ReturnValue, указывающее успешность выполнения метода.

8.jpg


GetQWORDValue

Метод получает значение записи реестра типа REG_QWORD.
PowerShell:
$srp.GetQWORDValue(defKey,subKeyName,valueName)

9.jpg



Принимает три параметра: числовое значение раздела реестра (defKey), строковое значение пути (subKeyName), по которому находится искомая запись и строковое же значение имени требуемой записи (valueName).

Метод возвращает объект, содержащий свойства ReturnValue, числовое значение которого указывает на успешность выполнения метода, и uValue, содержащее значение запрашиваемой записи.

Значение свойства uValue представляет из себя целое число типа Int64.

10.jpg


SetQWORDValue

Метод устанавливает новое значение существующей записи типа REG_QWORD. В случае отсутствия записи с данным именем, метод создает ее и присваивает указанное значение. Если же запись существует, но ее тип отличается от REG_QWORD, метод переопределяет ее как запись типа REG_QWORD и присваивает указанное значение.
PowerShell:
$srp.SetQWORDValue(defKey,subKeyName,valueName,value)

11.jpg



Метод принимает четыре параметра: числовое значение раздела реестра (defKey), строковое значение пути (subKeyName), строковое значение имени требуемой записи (valueName), а также целое число (либо переменную, содержащую целочисленное значение типа Int64), которое будет являться значением указанной записи.

Метод возвращает объект, содержащий свойство ReturnValue, указывающее успешность выполнения метода.

12.jpg


GetBinaryValue

Метод получает значение записи реестра типа REG_BINARY.
PowerShell:
$srp.GetBinaryValue(defKey,subKeyName,valueName)

14.jpg



Принимает три параметра: числовое значение раздела реестра (defKey), строковое значение пути (subKeyName), по которому находится искомая запись и строковое же значение имени требуемой записи (valueName).

Метод возвращает объект, содержащий свойства ReturnValue, числовое значение которого указывает на успешность выполнения метода, и uValue, содержащее значение запрашиваемой записи.

Значение свойства uValue представляет из массив, состоящий из элеметов типа byte.

15.jpg


SetBinaryValue

Метод устанавливает новое значение существующей записи типа REG_BINARY. В случае отсутствия записи с данным именем, метод создает ее и присваивает указанное значение. Если же запись существует, но ее тип отличается от REG_BINARY, метод переопределяет ее как запись типа REG_BINARY и присваивает указанное значение.
PowerShell:
$srp.SetBinaryValue(defKey,subKeyName,valueName,value)

16.jpg



Метод принимает четыре параметра: числовое значение раздела реестра (defKey), строковое значение пути (subKeyName), строковое значение имени требуемой записи (valueName), а также массив элементов типа byte (либо переменную, его содержащую), которые будут являться значением указанной записи.

Метод возвращает объект, содержащий свойство ReturnValue, указывающее успешность выполнения метода.

17.jpg


Exit
Windows Management Instrumentation значительным образом дополняет набор средств, находящихся в распоряжении администратора и позволяет ему автоматизировать выполнение задач, автоматизация которых обычными средствами представляет собой нетривиальную задачу, либо невозможна в принципе.

В данной статье было рассмотрено использование класса WMI StdRegProv и были приведены примеры использования его методов для работы с ключами и записями реестра операционной системы Windows.
 
Последнее редактирование:
Вроде как ещё существует ключ проверки доступа к реестру CheckAccess
Код не PS:
Такая строка может не сработать:
WMIC /NameSpace:\\root\default Class StdRegProv Call CheckAccess hDefKey=%HKEY_LOCAL_MACHINE% sSubKeyName="Software\My Program" uRequired=%KEY_SET_VALUE%
но при явном задании переменных, всё должно быть ОК:
WMIC /NameSpace:\\root\default Class StdRegProv Call CheckAccess hDefKey="&H80000002" sSubKeyName="Software\My Program" uRequired="&H2
 
Последнее редактирование:
Назад
Сверху Снизу