В статье "Процедуры чтения и записи в реестр стали проще" я познакомил читателей с объектом Penton.RegObject. Использование этого объекта может существенно упростить работу с методами класса WMI StdRegProv. Как уже упоминалось в первой части, данный объект можно применять как в сценариях VBScript, так и в сценариях Jscript. Теперь давайте рассмотрим, как с его помощью можно реализовать процедуры считывания и записи значений на обоих языках сценариев. Однако для того чтобы пользоваться объектом Penton.RegObject, сначала необходимо зарегистрировать в системе компонентов RegObject.wsc.

Регистрация и отмена регистрации компонентов

Для того чтобы в сценариях можно было создавать объект Penton.RegObject, необходимо зарегистрировать компонент RegObject.wsc. В ходе процесса регистрации в системный реестр записываются глобально уникальный идентификатор (GUID) и программный идентификатор (ProgID) компонента. При выполнении процедур регистрации и отмены регистрации компонента RegObject.wsc нужно входить в систему под учетной записью члена локальной группы "Администраторы" на данном компьютере.

Чтобы зарегистрировать компонент, следует запустить проводник Windows, найти файл RegObject.wsc, щелкнуть на нем правой кнопкой мыши и выбрать в появившемся меню пункт Register. То же самое можно проделать и из командной строки, для этого используется команда:

Regsvr32 /i:"PathRegObject.wsc"
%SystemRoot%system32scrobj.dll

где Path - путь к каталогу, в котором находится файл RegObject.wsc. Здесь данная команда показана в виде нескольких строк, однако следует помнить, что в окне командной строки команду необходимо набирать в одну строку. То же самое относится и ко всем остальным командам, рассматриваемым в данной статье.

Чтобы отменить регистрацию компонента, запустите проводник Windows, найдите файл RegObject.wsc, щелкните на нем правой кнопкой мыши и выберите в появившемся меню пункт Unregister. Отмена регистрации компонента из командной строки выполняется при помощи следующей команды:

Regsvr32 /u /n /i:"PathRegObject.wsc"
%SystemRoot%system32scrobj.dll

Если требуется, чтобы каждая из этих команд выполнялась в режиме без вывода сообщений, то в командной строке первым после ключевого слова Regsvr32 должен быть указан ключ /s (т.е. Regsvr32 /s).

Считывание и запись значения отдельного параметра реестра

Считывать отдельное значение из реестра позволяет метод ReadValue объекта Penton.RegObject, а метод WriteValue, соответственно, используется для записи отдельного значения. Синтаксис этих и всех остальных методов, а также свойства объекта Penton.RegObject уже обсуждались в первой части, так что здесь я не буду на этом останавливаться. Если у вас есть вопросы по поводу задания параметров метода ReadValue, обратитесь к первой части статьи.

В Листинге 1 показан пример использования метода ReadValue в сценарии JScript для считывания значения параметра DefaultUserName раздела реестра HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWinlogon локального компьютера. В параметре DefaultUserName хранится имя последнего регистрировавшегося в системе пользователя. После успешного завершения метода ReadValue свойство Result объекта Penton.RegObject будет содержать имя этого пользователя. При этом свойство ValueType данного объекта содержит описание типа данных в строковом формате (например, "REG_SZ").

Обратите внимание на фрагмент кода Листинга 1, обозначенный меткой A, где в параметре, задающем раздел (subkey) реестра, используется символ двойного обратного слеша (). В командах языка JScript обратный слеш является служебным (escape) символом, поэтому если в коде JScript нужно, чтобы обратный слеш интерпретировался как обычный символ, его необходимо указывать дважды.

В Листинге 2 показано, как работает метод WriteValue. Здесь с помощью команд языка VBscript устанавливается значение параметра RestrictAnonymous раздела реестра HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsa. В данном случае ему присваивается значение 1. В соответствии с изложенным в статье Microsoft "How to use the RestrictAnonymous registry value in Windows 2000", установка данного значения для этого параметра повышает защищенность системы Windows, запрещая анонимный просмотр информации базы SAM.

Считывание и запись значений, имеющих тип REG_MULTI_SZ и REG_BINARY

К параметрам реестра, содержащим значения REG_MULTI_SZ и REG_BINARY, требуется особый подход. Если вы используете метод ReadValue для считывания значения типа REG_MULTI_SZ или REG_BINARY, то в этом случае свойство Result будет содержать массив, и это необходимо учитывать в сценариях. Рассмотрим, например, параметр Source раздела реестра HKEY_LOCAL_MACHINESYSTEM CurrentControlSetServicesEventlogApplication. Данный параметр представляет собой значение типа REG_MULTI_SZ, в котором содержатся источники событий журнала приложений компьютера. В Листинге 3 показано, как можно реализовать процедуру считывания данного значения на языке VBScript. Как видно из этого примера (Листинг 3, фрагмент, обозначенный меткой A), свойство Property в данном случае возвращает массив, который сохраняется в переменной StrArray. После этого организуется цикл For...Next, с помощью которого последовательно перебираются и отображаются на экране все элементы данного массива.

В Листинге 4 показан пример реализации считывания значения типа REG_MULTI_SZ на языке JScript. Здесь следует обратить внимание на то, что поскольку свойство Result содержит массив Visual Basic (VB safe array), то для его преобразования в массив JScript используется метод toArray языка JScript (Листинг 4, фрагмент с меткой A). Также обратите внимание на то, как в примерах Листинга 3 и Листинга 4 организована проверка содержимого свойства ValueType. Это сделано для того, чтобы убедиться, что данные имеют тип REG_MULTI_SZ, прежде чем начинать обработку массива.

Все технические приемы, продемонстрированные в Листинге 3 и Листинге 4, могут использоваться и при чтении данных типа REG_BINARY. Нужно просто иметь в виду, что в этом случае массив будет содержать не строковые значения, а байты.

Для записи значения типа REG_MULTI_SZ или REG_BINARY нужно сформировать массив VB, заполнить его требуемыми данными и вызвать метод WriteValue. Как можно реализовать запись значения типа REG_BINARY на языке VBScript, показано на Листинге 5. Аналогичный пример на языке JScript иллюстрирует Листинг 6. Во фрагменте, обозначенном меткой A (Листинг 6), вызывается метод VBArray объекта Penton.RegObject, с помощью которого массив JScript перед передачей методу WriteValue преобразуется в массив VB (VB safe array).

Считывание всех параметров раздела за один раз

С помощью методов EnumValues и EnumValuesAndData, имеющихся у объекта Penton.RegObject, можно считать все параметры какого-либо раздела реестра и сохранить их в виде объекта Scripting.Dictionary, доступ к которому осуществляется через свойство EnumDict объекта Penton.RegObject. Как вы, вероятно, знаете, в объекте Scripting.Dictionary данные хранятся в виде пар "ключ/значение". Метод EnumValues в качестве таких пар сохраняет имена параметров и соответствующие им типы данных. С помощью метода EnumValuesAndData сохраняются имена параметров и их содержимое.

Пример использования метода EnumValues в сценарии VBScript показан в Листинге 7. В результате его выполнения на экране отобразятся имена и типы данных всех параметров раздела HKEY_LOCAL_MACHINESOFTWAREMicrosoft WindowsCurrentVersionRun. Для того чтобы понять, в чем различие методов EnumValues и EnumValuesAndData, замените в коде Листинга 7 EnumValues на EnumValuesAndData.

В Листинге 8 показан пример использования метода EnumValues в сценариях JScript. Как видно из фрагмента, обозначенного меткой A, для копирования объекта Scripting.Dictionary в массив JScript используется метод dictToJSArray объекта Penton.RegObject.

Делай раз, делай два ...

Объект Penton.RegObject предназначен для устранения недостатков методов WMI, служащих для работы с реестром, его использование позволяет упростить процедуры чтения и записи в реестр, вне зависимости от предпочитаемого языка разработки сценариев, будь то VBScript или JScript. В следующий раз мы рассмотрим сценарий JScript, который, используя функциональность объекта Penton.RegObject, управляет ключом HKEY_LOCAL_MACHINESOFTWAREMicrosoft WindowsCurrentVersionRun на локальном или удаленном компьютере.


Листинг 1. Код JScript для считывания значения отдельного параметра

regobj = new ActiveXObject("Penton.RegObject");
result = regobj.Connect(".");
if (result == 0) {
// BEGIN CALLOUT A
result = regobj.ReadValue("HKLM",
"SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon",
"DefaultUserName");
// END CALLOUT A
if (result == 0)
WScript.Echo(regobj.Result);
}

Листинг 2. Код VBScript для записи одного значения

Set RegObj = CreateObject("Penton.RegObject")
Result = RegObj.Connect(".")
If Result = 0 Then
Result = RegObj.WriteValue("HKLM", _
"SYSTEMCurrentControlSetControlLsa", _
"RestrictAnonymous", "REG_DWORD", 1)
End If

Листинг 3. Код VBScript для считывания значения типа REG_MULTI_SZ

Set RegObj = CreateObject("Penton.RegObject")
Result = RegObj.Connect(".")
If Result = 0 Then
Result = RegObj.ReadValue("HKLM", _
"SYSTEMCurrentControlSetServicesEventlogApplication", _
"Sources")
If (Result = 0) And (RegObj.ValueType = "REG_MULTI_SZ") Then
' BEGIN CALLOUT A
StrArray = RegObj.Result
For N = 0 To UBound(StrArray)
WScript.Echo StrArray(N)
Next
' END CALLOUT A
End If
End If

Листинг 4. Код JScript для считывания значения типа REG_MULTI_SZ

regobj = new ActiveXObject("Penton.RegObject");
result = regobj.Connect(".");
if (result == 0) {
result = regobj.ReadValue("HKLM",
"SYSTEMCurrentControlSetServicesEventlogApplication",
"Sources");
if ((result == 0) && (regobj.ValueType == "REG_MULTI_SZ")) {
// BEGIN CALLOUT A
strarray = regobj.Result.toArray();
// END CALLOUT A
for (n = 0; n < strarray.length; n++)
WScript.Echo(strarray[n]);
}
}

Листинг 5. Код VBScript для записи значения типа REG_BINARY

Set RegObj = CreateObject("Penton.RegObject")
Result = RegObj.Connect(".")
If Result = 0 Then
ByteArray = Array(0, 1, 2, 3)
Result = RegObj.WriteValue("HKCU", "Software", "TestValue", _
"REG_BINARY", ByteArray)
End If

Листинг 6. Код JScript для записи значения типа REG_BINARY

regobj = new ActiveXObject("Penton.RegObject");
result = regobj.Connect(".");
if (result == 0) {
jsarray = new Array(0, 1, 2, 3);
// BEGIN CALLOUT A
bytearray = regobj.toVBArray(jsarray);
// END CALLOUT A
result = regobj.WriteValue("HKCU", "Software", "TestValue",
"REG_BINARY", bytearray);
}

Листинг 7. Код VBScript для считывания значений всех параметров раздела за один раз

Set RegObj = CreateObject("Penton.RegObject")
Result = RegObj.Connect(".")
If Result = 0 Then
Result = RegObj.EnumValues("HKLM", _
"SOFTWAREMicrosoftWindowsCurrentVersionRun")
If Result = 0 Then
Set Dict = RegObj.EnumDict
For Each RegValue In Dict
WScript.Echo RegValue & vbTab & Dict(RegValue)
Next
End If
End If

Listing 8. Код JScript для считывания значений всех параметров раздела за один раз

var regobj = new ActiveXObject("Penton.RegObject");
result = regobj.Connect(".");
if (result == 0) {
result = regobj.EnumValues("HKLM",
"SOFTWAREMicrosoftWindowsCurrentVersionRun");
if (result == 0) {
// BEGIN CALLOUT A
dict = regobj.dictToJSArray(regobj.EnumDict);
// END CALLOUT A
for (regvalue in dict)
WScript.Echo(regvalue + " " + dict[regvalue]);
}
}