Хотя в большинстве случаев для настройки сервера можно использовать Control Panel или другие инструменты, некоторые рекомендуемые исправления требуют редактирования реестра вручную. Ручное редактирование реестра может иметь необратимые последствия для операционной системы, поэтому, если изменения в реестре настолько важны, что должны выполняться вручную, столь же важно вносить их согласованно на всех компьютерах. К этому может прибавиться желание задокументировать изменения реестра и цель редактирования, а также перепроверить и подтвердить изменения.

Те, кому приходилось редактировать реестр вручную на нескольких машинах, вероятно, знают, как вносить изменения, не проходя через лабиринт HKEY более одного раза. Можно сохранить отредактированный раздел в .reg-файле, затем импортировать этот файл на все компьютеры, которым требуется то же самое исправление. Однако при таком подходе запись в системный файл регистрации событий не вносится и достигается лишь ограниченный уровень детализации (т. е. можно импортировать раздел, но не отдельный отредактированный параметр). Более правильный подход предполагает использование сценариев VBScript, когда в реестр вносятся изменения и одновременно появляется запись в журнале Application, чтобы было ясно, какие сделаны изменения и почему. Можно модифицировать тот же сценарий для повторного чтения реестра и таким образом утвердить изменения.

С помощью VBScript можно редактировать любую часть реестра, однако проиллюстрируем основную идею на примере, в котором реестр редактируется на серверах приложений таким образом, чтобы отдельное приложение было привязано к именам пользователей, а не к именам компьютеров. Это действие относится к настройке приложения, поэтому следует отредактировать определенный раздел реестра для данного приложения. Окончательное значение параметра является суммой двух шестнадцатеричных чисел (это чуть сложнее, чем операции с двоичными числами), поэтому необходимо обеспечить ввод верного числа на всех серверах приложений. О цели редактирования трудно судить по одним лишь цифрам, поэтому следует сделать поясняющую запись.

Чтобы добиться желаемого, нужно подготовить сценарий, выполняющий несколько задач. Сценарий должен создать объект WshShell (который представляет Windows Shell и, следовательно, открывает доступ к программным средствам редактирования реестра и программе просмотра событий), внести изменения в реестр и сделать запись об изменениях в журнале Application.

Внесение изменений

О WshNetwork, объекте Windows Script Host (WSH) 2.0, представляющем сетевые принтеры и дисководы, я рассказывала в статьях «Организация доступа к сетевым ресурсам» (http://www.winnetmag.ru/programme/ 31prg07.htm) и «Сценарии подключения к принтерам» (http://www.winnetmag.ru/programme/ 15prg08.htm). WshShell, другой объект WSH, взаимодействует с определенными объектами, относящимися к Windows Shell, включая редактор реестра и программу просмотра событий (Event Viewer).

WshShell поддерживает несколько методов чтения и редактирования реестра. Как правило, использовать методы редактирования реестра несложно, но необходимы аккуратность и точность — добавление в строку хотя бы одного лишнего пробела приведет к ошибке.

В данном примере мы работаем с методами RegRead, для чтения параметра и значения параметра, и RegWrite, для записи параметра и значения параметра. Эти методы имеют простой синтаксис:

WshShell.RegRead strName

и

WshShell.RegWrite strName, varValue, [strtype]

Метод RegRead читает имя параметра или значение параметра, которое указано в аргументе strName. Каждый метод обращается к разделам реестра в соответствии с полным именем раздела, поэтому в качестве обязательной части аргумента strName должны использоваться известные названия разделов:

  • HKEY_CURRENT_USER (или HKCU);
  • HKEY_CLASSES_ROOT (или HKCR);
  • HKEY_LOCAL_MACHINE (или HKLM) ;
  • HKEY_USERS;
  • HKEY_CURRENT_CONFIG.

Метод RegWrite записывает в реестр имя параметра или значение параметра, указанное в аргументе varValue. Если аргумент strName заканчивается на обратный слеш (), то RegWrite записывает в реестр varValue как имя параметра. Иначе RegWrite записывает в реестр varValue как значение параметра. С помощью необязательного аргумента strtype можно задать тип параметра: REG_SZ и REG_EXPAND_SZ определяют строковые значения, REG_DWORD — 32-разрядное целое значение и REG_BINARY — 32-разрядное двоичное значение.

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

Запись и подтверждение изменений

Сценарий в Листинге 1 выполняет редактирование реестра, но проверить, были ли действительно внесены изменения, можно только двумя способами — запустить приложение (и посмотреть, как оно будет себя вести) или просмотреть реестр. Если ни то, ни другое не нравится, можно добавить к сценарию код, который вносит запись об изменениях в журнал Application.

Чтобы сделать такую запись, нужно применить метод RegRead совместно с другим методом, LogEvent. Он почти так же прост, как и RegRead, но использует в качестве аргументов обе строки — ту, которую можно задействовать для описания изменений, и код, определяющий тип события. Эти типы, перечисленные в Таблице 1, известны каждому, кто использует программу просмотра событий. LogEvent имеет следующий синтаксис:

WshShell.LogEvent eventcode, strmessage [strtarget]

Аргумент eventcode определяет тип события, которое записывается, аргумент strmessage — сообщение, которое появляется в журнале Application, а необязательный аргумент strtarget задает имя того компьютера, где записываются изменения. Можно придерживаться централизованной записи — в таком случае имя компьютера, на котором должны быть сделаны изменения, указывается в свойстве ComputerName объекта WshNetwork или же используется запись на локальном сервере. Окончательная версия сценария, содержащаяся в Листинге 2, отличается от сценария в Листинге 1 только тем, что в нее добавлены новые переменные и метод LogEvent.

Иногда бывает необходимо не столько внести изменения в настройки реестра сервера, сколько подтвердить или задокументировать их. Пусть, например, некто редактирует реестр сервера для изменения порта прослушивания Windows 2000 Server Terminal Services (порт 3389 по умолчанию). Любой, кто попытается установить с этим сервером соединение, не указав нового порта, получит туманное и бесполезное сообщение об ошибке, гласящее, что клиент не может подключиться к терминальному серверу. Чтобы устранить данную проблему, можно задействовать короткий сценарий, как в Листинге 3, прочитать реестр и определить порт прослушивания Terminal Services. В сценарии используется метод RegRead (а не RegWrite) объекта WshShell. С помощью метода RegRead выясняется текущее значение параметра HKEY_LOCAL_MACHINECurrentControlSetControlTerminal ServerWinStationsRDP-TCPPortNumber. Это значение присваивается переменной, а затем записывается в журнал Application вместе с поясняющим текстом.

Быстро, просто и единообразно

Каждый раз, когда возникает необходимость сделать одни и те же изменения на многих серверах (и задокументировать их) или когда нужно определить текущие значения параметров реестра без утомительных поисков, использование методов RegRead, RegWrite и LogEvent объекта WshShell поможет сэкономить время и избавит от проблем. Возможности VBScript этим не ограничиваются — с помощью еще нескольких методов можно создавать более тонкие инструменты редактирования реестра. Имеет смысл научиться использовать функцию InputBox (см. описание в статье «Сценарии подключения к принтерам») для того, чтобы запрашивать и вводить определенное значение через командную строку в процессе исполнения сценария. Помимо прочего, можно использовать метод Select Case (также описанный в предыдущей статье), чтобы один и тот же сценарий вносил разные изменения в настройки реестра в различные группы серверов.

Криста Андерсон — независимый автор и консультант журнала Windows NT Magazine. Ее последняя книга — « Mastering Local Area Networks». С ней можно связаться по адресу: candersn@adelphia.net.


Таблица 1. Коды LogEvent и соответствующие события.
Код Тип события
0 Success
1 Error
2 Warning
4 Information
8 Audit success
16 Audit failure