Появление Windows Management Instrumentation (WMI) в Windows 2000 в качестве одного из компонентов ядра этой операционной системы существенно упростило решение многих задач администрирования с использованием сценариев, тем не менее, Microsoft понимает, что задачи управления реестром по-прежнему играют важную роль в администрировании систем Windows. Поэтому компания предлагает несколько инструментов для чтения и записи данных в реестр из сценариев. К ним относятся:
- Импорт в реестр файлов .reg. Содержимое реестра можно изменять, создавая соответствующие файлы с расширением .reg, а затем импортировать их в реестр с помощью команды Regedit /s. Но это позволяет только обновлять содержимое реестра, читать данные из реестра таким способом невозможно, к тому же здесь нет никакого механизма контроля ошибок. Отметим также, что с помощью этой методики можно изменять содержимое реестра только на локальном, но не на удаленном компьютере.
- Утилита командной строки Reg.exe. Утилита Reg.exe имеется в Windows XP, а также включена в состав пакетов Resource Kit для систем Windows 2000 и Windows NT. Данная утилита позволяет как считывать данные реестра, так и обновлять их. Однако при работе с выходными данными, приходится их разбирать их структуру, а в ходе данного процесса могут возникать ошибки.
- Методы объекта WshShell. В составе компонента Windows Script Host (WSH) имеется объект WshShell, который предоставляет набор методов для чтения и записи данных в реестр, но и этим методам свойственны некоторые ограничения. В частности, как и в случае с файлами .reg, данный подход позволяет работать только с реестром локального компьютера. Кроме этого существуют также и ограничения по типу данных, которые могут быть записаны в реестр через методы WshShell. В частности таким способом, нельзя записывать данные в параметр типа REG_MULTI_SZ, а в параметр типа REG_ BINARY невозможно записать более 32 битов данных.
Несмотря на свойственные им ограничения, все эти три механизма могут оказаться вполне пригодными для использования в сценариях, однако Microsoft предоставляет еще более гибкий инструмент для программного доступа к реестру, а именно, класс WMI StdRegProv. В этом классе реализован набор методов для чтения и записи данных в реестр. Однако нужно отметить, что, несмотря на всю их гибкость, методы StdRegProv достаточно громоздки и не слишком удобны в использовании, при этом им тоже свойственны три основных недостатка:
- Ветви реестра должны указываться в числовом виде. Например, нельзя задавать описание ветви реестра в виде HKEY_LOCAL_ MACHINE или HKLM, вместо этого необходимо использовать соответствующее шестнадцатиричное значение, в данном случае это будет число 80000002. Разумеется, в сценариях можно определять эти величины через соответствующие переменные или константы, но было бы гораздо проще и удобнее, если бы класс StdRegProv сам обеспечивал возможность работы с именами ветвей реестра как со строковыми значениями.
- Отдельные методы для каждого типа данных. Методы класса StdRegProv позволяют считывать и записывать в реестр данные всех стандартных типов, но для каждого типа данных должен применяться свой метод доступа, что не совсем удобно. В частности, для чтения данных типа REG_MULTI_SZ, необходимо пользоваться методом GetMultiStringValue. Это становится особенно неприятным в тех случаях, когда требуется выполнить чтение параметра реестра независимо от его типа, а также когда заранее неизвестно к какому типу данных относится значение, которое нужно прочитать.
- Доступ к этим методам из JScript затруднителен. Структура языка JScript предписывает, чтобы простые типы данных (т.е. числовые и булевы значения) всегда передавались по значению (by value). В JScript нет эквивалента ключевому слову ByRef языка VBScript, с помощью которого можно указать в объявлении функции на то, что данные передаются по ссылке (by reference). Однако в некоторых методах StdRegProv используется передача параметров ByRef. И хотя для вызова этих методов можно использовать объект SWbemMethod и связанные с ним объекты, тем не менее, непосредственно вызывать эти методы (как это можно делать из языка VBScript) нельзя. Отметим также, что методы StdRegProv используют объекты VBarray, которые представляют собой встроенные типы массивов Visual Basic (VB), а стандартного механизма преобразования массивов JScript в объект VBArray не существует.
Имея в виду все описанные выше недостатки, я решил создать компонент WSC (Windows Script Components), RegObject.wsc, который мог бы обрабатывать методы StdRegProv. Но прежде чем начинать использовать RegObject.wsc, следует познакомиться с объектом Penton.RegObject и его методами.
Знакомство с возможностями объекта Penton.RegObject
Объект Penton.RegObject реализован в виде файла RegObject.wsc. Файл .wsc представляет собой файл в формате XML, который содержит описание объекта Active X, предназначенного для использования в сценариях. Одно из преимуществ использования WSC заключается в том, что можно создавать объект, используя разные языки программирования. В RegObject.wsc, для обеспечения его функциональности, используются как компоненты JScript, так и VBScript.
Файл .wsc содержит четыре основных элемента XML: