Использование сценариев для обновления реестра на удаленных станциях

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

Не так давно члены группы Microsoft Resource Kit Group обратились ко мне с просьбой написать серию сценариев для руководства по обслуживанию Active Directory (а именно раздела «Best Practice Guide for Securing Active Directory Installations and Day-to-Day Operations: Part II»). Один из написанных сценариев, ApplyReg.vbs, позволяет в удаленном режиме обновлять реестр на большом числе компьютеров. Хотя для этих целей можно воспользоваться утилитой Reg с ключом Add, данная утилита работает только на ограниченном числе разделов реестра. В отличие от утилиты Reg, сценарий ApplyReg.vbs ничем в своей работе не ограничен. Сценарий обрабатывает подготовленный список компьютеров и вносит изменения в реестр, после чего создает отчет о проделанной работе с указанием результата обновления реестра на указанных компьютерах.

ApplyReg.vbs основан на нескольких технологиях: Active Directory (AD), Active Directory Service Interfaces (ADSI), Windows Management Instrumentation (WMI), Windows Script Host (WSH) 5.6 и VBScript. Рассмотрим, как следует подготовиться к использованию ApplyReg.vbs (в том числе — как протестировать сценарий), как организовать применение сценария в реальной сети и, наконец, как он работает.

Подготовка сценария к работе

Общеизвестная «мантра» Microsoft на тему реестра звучит примерно так: «Не редактируйте реестр до тех пор, пока ничего другого не остается. Редактор реестра обходит все стандартные меры безопасности, позволяя производить настройки, которые могут разрушить систему или даже привести к необходимости переустановки всей системы. Если же деваться некуда, то сначала хотя бы создайте резервную копию реестра». Сценарий ApplyReg.vbs в состоянии отредактировать — и разрушить — реестр на тысячах компьютеров в течение нескольких минут. Учитывая приведенное выше предупреждение Microsoft, перед использованием ApplyReg.vbs в реальных условиях необходимо всесторонне протестировать сценарий в лаборатории. Тестовые системы должны соответствовать стандартным компьютерам, на которых планируется обновлять реестр.

ApplyReg.vbs использует данные AD для определения хост- и NetBIOS-имен компьютеров, участвующих в обновлении реестра. Следовательно, для начала необходимо убедиться, что все тестируемые компьютеры, в том числе тот, с которого запускается ApplyReg.vbs, являются членами домена AD. После того как все тестовые системы сконфигурированы, нужно загрузить или создать несколько файлов.

  • Загрузить ApplyReg.vbs с сайта нашего журнала.
  • Создать .reg-файл, содержащий устанавливаемые обновления реестра. Я в целях тестирования создал файл-пример AAA123Test!!!.reg. Его можно использовать для тестового прогона ApplyReg.vbs. Но данный файл — всего лишь пример, не нужно устанавливать его на рабочие компьютеры. Тем, кто еще не слишком хорошо знаком с форматом файлов реестра, рекомендую прочесть врезку «Формат файла реестра» и внимательно просмотреть содержимое файла AAA123Test!!!.reg.
  • Нужно создать текстовый (.txt) файл (файл входа), содержащий список компьютеров для обновления. В этом файле список целевых компьютеров упорядочен по отличительному имени (Distinguished Name, DN). Необходимо поместить каждое DN в отдельной строке, заключить его в кавычки и после закрывающей кавычки поставить запятую. Не следует создавать пустые строки. В самом верху файла нужно указать заголовки полей, например Distinguished Name. На рис. 1 приведен пример правильно оформленного списка. Присутствие заголовков полей и замыкающая запятая — обязательное условие, иначе при работе ApplyReg.vbs могут возникнуть ошибки.
Рисунок 1. Пример правильно составленного списка компьютеров

Чтобы не создавать файл входа вручную, следует воспользоваться сценарием ComputerSearch.vbs для программной генерации списка, подаваемого на вход ApplyReg.vbs. Загрузив файл Best Practice Guide for Securing Active Directory Installations and Day-to-Day Operations: Part II, можно получить и файл ComputerSearch.vbs. В руководстве по использованию в секции Identifying Computers to Receive New Registry Settings with ComputerSearch.vbs описана процедура создания и запуска ComputerSearch.vbs. Сценарий ComputerSearch.vbs генерирует файл входа в нужном формате, содержащем DN компьютеров домена. Необходимо установить ApplyReg.vbs, свой .reg-файл и файл входа на станцию, с которой планируется запускать сценарий ApplyReg.vbs (в дальнейшем будем называть эту станцию исходным компьютером). Важно убедиться, что на исходном компьютере установлена система WSH 5.6. ApplyReg требует для своей работы именно WSH 5.6, поскольку работает с объектом WshNamed и свойствами StdOut объекта WScript. Эти две возможности в предыдущих версиях WSH отсутствуют. Загрузить WSH 5.6 можно по адресу http://msdn.microsoft.com/library/default.asp?url=/downloads/list/webdev.asp; поддерживаются платформы Windows 2000, Windows NT 4.0, Windows Me и Windows 98. На Windows Server 2003 и Windows XP версия WSH 5.6 уже установлена. Для XP Microsoft успела выпустить обновление. Возможно, многие захотят установить это обновление, если уже не сделали это.

Исходный компьютер и все целевые системы требуют поддержки WMI. Исходному компьютеру WMI нужен для установки удаленного соединения с хранилищем WMI на удаленных станциях. Каждому задействованному целевому компьютеру при обновлении реестра требуется провайдер реестра WMI — Registry Provider (StdRegProv). На всех компьютерах, на которых работает WMI, в пространстве имен rootdefault присутствует StdRegProv.

За исключением NT 4.0 и Win98, все версии Windows изначально содержат WMI. Версию WMI CORE 1.5 for Win98 можно загрузить по адресу http://msdn.microsoft.com/library/default.asp?url=/downloads/list/wmi.asp. Версия WMI CORE 1.5 для NT 4.0 на сайте Microsoft отсутствует, поэтому я включил ее в состав файла загрузки вместе со сценарием ApplyReg.vbs.

Тестирование сценария

Итак, тестовая среда создана, можно приступать к тестированию ApplyReg.vbs. В качестве примера попробуем запустить файл реестра update.reg для обновления реестра на удаленных компьютерах согласно списку, заданному во входном файле computers.txt. После создания update.reg и computers.txt нужно скопировать ApplyReg.vbs, update.reg и computers.txt в какой-нибудь один каталог. Затем следует открыть окно командной строки, перейти в каталог, куда только что были скопированы файлы, и набрать:

cscript applyreg.vbs /r:update.reg /f:computers.txt

Нажимаем Enter. ApplyReg.vbs реализует изменения, представленные в update.reg, на всех компьютерах из computers.txt. Кроме того, будет составлен отчет, по которому можно установить, все ли закончилось успешно. Имя файла-отчета появится на экране после завершения работы сценария. После того как тест отработает, следует обязательно убедиться, что изменения не разрушили реестр и не прервали нормальную работу целевых компьютеров.

Далее, на произвольной станции, не включенной в список computers.txt, требуется запустить update.reg вручную. Для этого нужно просто открыть Windows Explorer в каталоге, куда был помещен файл update.reg, и запустить его. Сравните изменения, выполненные в ручном и автоматическом режиме с помощью ApplyReg.vbs.

Запуск сценария в корпоративной сети

Если тестирование ApplyReg.vbs в лабораторных условиях прошло успешно, можно приступать к обновлению корпоративной сети. Для начала я бы посоветовал выполнить обновление на небольшом числе целевых компьютеров. После чего необходимо убедиться, что системы продолжают нормально работать. Если все проверки выполнены успешно, следует потихоньку увеличивать число целевых компьютеров. После каждой отработки сценария нужно просматривать отчет. Из отчета можно узнать, удалось ли «достучаться» до компьютера, правильно ли во входном списке указано DN, не было ли другой ошибки, помешавшей обратиться к удаленному реестру. Данные отчета позволят установить, на каких компьютерах потребуется повторно запустить ApplyReg.vbs. Если доступ к удаленному реестру не удалось получить из-за проблем с разрешениями, следует убедиться, что у вас имеются административные или эквивалентные им права на удаленном компьютере. По умолчанию для внесения изменений в удаленный реестр необходимо иметь права администратора. Дополнительную информацию о разрешениях при работе с удаленным реестром можно найти в статье Microsoft «How to Restrict Access to the Registry from a Remote Computer» (http://support.microsoft.com/?kbid=153183).

Как работает сценарий

Я уже говорил, что для работы ApplyReg.vbs используется несколько технологий. WSH 5.6 обеспечивает обработку кода сценария и некоторых объектов, таких как WshArguments (передача в сценарий параметров командной строки), Regular Expression (RegExp) (проверка строковых данных). Через ADSI выполняется подключение (привязка) к AD и чтение атрибутов объекта «компьютер». WMI позволяет сценарию установить привязку к удаленному реестру и с помощью StdRegProv обновить его.

Код сценария ApplyReg.vbs начинается с описания констант и глобальных переменных, затем вызывается подпрограмма CheckForCScript, приведенная на Web-листинге 1. Эта подпрограмма должна подтвердить, что сценарий обрабатывается с помощью хоста CScript. Необходимость использования CScript вызвана тем, что WScript не поддерживает работу со свойствами StdOut WScript.

После верификации хоста сценарий определяет файл входных данных, используя ключ /f, и файл реестра (/r), и устанавливает соответствующие переменные strRptFileName и strRegFileName (см. Web-листинг 2.) Если при запуске ApplyReg.vbs параметры /f и /r указаны не были, то сценарий выводит сообщение о том, что они должны быть заданы. Сценарий вызывает функцию SampleCommandLine для вывода синтаксиса вызова и прекращает работу.

Далее ApplyReg.vbs использует объект Dictionary из Script Runtime Library, в котором в качестве констант приведено описание пяти корневых ветвей реестра (т. е. HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS и HKEY_CURRENT_CONFIG). В дальнейшем эти константы применяются для обращения к разделам и подразделам реестра, указанным в .reg-файле. Использование объекта Dictionary не представляет никакой сложности, поэтому я не стал включать распечатку в zip-файл. Но те, кто недостаточно хорошо знаком с Dictionary Object, могут обратиться к документации Microsoft Developer Network (MSDN) (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/jsobjdictionary.asp).

ApplyReg.vbs создает отчет в формате CSV, доступный для просмотра после завершения работы сценария. Для создания уникальных имен файлов применяется функция GenFileName, которая использует имя файла (без расширения) в качестве входного параметра (т. е. параметр prefix). В данном случае префикс — это ApplyReg, в чем можно убедиться, посмотрев на Web-листинг 3. GenFileName создает уникальное имя файла, добавляя дату и время в конец префикса (ApplyReg). Например, если сценарий ApplyReg.vbs был запущен 16 апреля 2003 года в 11:43:53 a.m., GenFileName сгенерирует имя ApplyReg-030416-114353.csv. Заметим, что дата представлена в формате YYMMDD. В метке А на Web-листинге 3 показан вызов функции GenFileName. Оставшаяся часть кода — это и есть тело функции.

ApplyReg.vbs создает копию объекта FileSystemObject (библиотека Script Runtime Library), связывает его с заданным именем отчета, а затем сценарий использует этот объект для создания, открытия и записи в отчет. Кроме того, сценарий задействует объект для открытия на чтение файла реестра (см. Web-листинг 4).

ApplyReg.vbs создает объект RegExp для проверки каждой строчки файла реестра. В ходе проверки выясняется, что будет создаваться в реестре — раздел или параметр. Запись — это совокупность имени параметра, типа данных и собственно значения. Если сценарий должен создать запись, RegExp также устанавливает тип данных записи: String, Binary, DWORD, Expandable String или Multi-String. В Web-листинге 5 показано, как создается RegExp и как устанавливаются свойства объекта.

Перед началом проверки файла реестра ApplyReg.vbs вызывает функцию BindDN, пытаясь выполнить операцию связывания ADSI для каждого DN входного файла. BindDN за одно обращение считывает по одной строке входного файла и возвращает строку значений, в зависимости от того, успешно ли завершились различные операции (см. рис. 2).

Рисунок 2. Как работает функция BindDN

Функция BindDN приведена в листинге 1. Обратите внимание, как эта функция формирует строку возврата (см. рис. 2). В том случае если BindDN = strDN||None||Invalid (метка А в листинге 1), функция не находит DN в AD. Это означает, что DN указан неверно или что имя компьютера было удалено из AD. В случае когда BindDN = strDN||strComptName||Host (метка В листинга 1), функция находит DN и присваивает переменной strComptName значение атрибута dNSHostName (DNS Host Name компьютера). Если BindDN = strDN||strComptName||NetBIOS (метка С листинга 1), функция находит DN, но не может определить атрибут компьютера dNSHostName. Тогда BindDN обращается к атрибуту cn, который является обязательным для объекта «компьютер». Атрибут cn обычно совпадает с NetBIOS-именем компьютера.

Затем функция VBScript Split разделяет строку возврата BindDN на части, используя в качестве разделителя две вертикальные черты (||). Функция Split присваивает результат своей работы (три значения) элементам массива arrComputerInfo (Web-листинг 6, метка А). Сценарий использует этот массив для проверки кода и записи информации в отчет. Первый элемент массива, arrComputerInfo(0), содержит DN компьютера (переменная сценария strDN). Второй элемент, arrComputerInfo(1), содержит имя компьютера (переменная сценария strComputerName). Переменная может принимать значение None, имя хоста или имя NetBIOS. Третий элемент, arrComputerInfo(2), содержит информацию общего характера (переменная strNote). Значения переменной — Invalid, Host или NetBIOS.

Почему нас должны беспокоить неудачные попытки выполнения операций связывания и извлечения атрибутов AD? Потому что перед тем, как приступить к обновлению реестра, необходимо убедиться, что целевой компьютер найден. Если компьютер присутствует в AD и BindDN возвращает dNSHostName или атрибут cn, сценарий ApplyReg.vbs запускает Ping для связи с компьютером, используя или имя DNS, или имя NetBIOS компьютера. Для выполнения этой задачи сценарий загружает объект WshShell и использует его для обращения к утилите Ping (см. Web-листинг 7). Это удобный способ найти сетевой компьютер, если он в настоящий момент включен.

При успешном завершении программы Ping сценарий пытается подключиться к провайдеру реестра — StdRegProv (Web-листинг 7, метка А). В случае успеха ApplyReg.vbs выполняет обновление реестра. Для этого сценарий считывает строки файла реестра и присваивает переменной strLine соответствующие значения строк. Затем RegExp оценивает шаблон переменной strLine. Если шаблон соответствует значению параметра, вызывается метод WMI CreateKey и создается параметр (листинг 2). Если нет, тогда сценарий тестирует каждое имя параметра, разрешенное для использования в реестре. При обнаружении соответствия ApplyReg.vbs вызывает необходимую подпрограмму. В листинге 3 показан шаблон соответствия, с которым сценарий сопоставляет каждый тип записи, а также имя подпрограммы, вызываемой сценарием при обнаружении совпадения.

Итак, сценарий прочитал все строки .reg-файла. Теперь переменной strStatus присваивается значение Registry update applied. Если до хоста «достучаться» не удалось (Ping завершилась неудачно), сценарий присваивает strStatus значение Host unreachable, а strNotes — Verify that this host is online. Затем с помощью метода FileSystemObject WriteLine значения strDN, strComputer, strStatus и strNotes записываются в файл отчета. После завершения обработки всех строк входного файла на консоли появится сообщение, что данные о работе сценария сохранены в отчете.

Итак, подготовка к работе с ApplyReg.vbs включает в себя следующие этапы: загрузка сценария, создание файла реестра, построение списка имен целевых компьютеров, тщательное тестирование файла сценария в лабораторных условиях. Если все проверки прошли успешно, значит, все готово к использованию ApplyReg.vbs в сети организации. Нужно продолжать выполнять обновление на небольшом подмножестве бизнес-компьютеров до тех пор, пока процедура обновления реестра не будет отработана до мелочей. Если тестирование было проведено со всей возможной тщательностью, а установка обновлений проходила со всеми предосторожностями, это позволит значительно сэкономить время по сравнению с обновлением реестра того же числа компьютеров вручную.

Этан Вилански (ewilansky@yahoo.com) — руководитель группы Network Design Group, независимый автор и консультант по проектированию сетей и написанию сценариев


Формат файла реестра

Файл реестра (.reg-файл) представляет собой текстовый файл, содержащий пути к разделам, имена параметров и сами значения. Пути к разделам всегда начинаются с одного из пяти возможных имен корневой ветви: HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS или HKEY_CURRENT_CONFIG. Корневые имена указывают на начальное местоположение в реестре для внесения изменений. Например, HKEY_LOCAL_MACHINESOFTWARExxx123abc указывает на подраздел xxx123abc, путь к которому начинается от корня HKEY_LOCAL_MACHINESOFTWARE.

Ниже пути к разделу в файле реестра находятся имена параметров и их значения, вместе они составляют ссылку на запись в реестре. В реестр могут быть записаны данные следующих типов: String, Binary, DWORD, Expandable String или Multi-String. Как показано в табл. А, формат записи в файле реестра состоит из следующих элементов (пробелы между элементами не допускаются).

  • Тип данных и число в кавычках (число всегда одно и то же). Для типа данных String число не указывается.
  • Знак равенства (=).
  • Текстовый префикс.
  • Двоеточие (:). Для типа данных String не используется.
  • Собственно значение. Для типа данных String значение указывается в кавычках.