Глава 14

Автоматизация управления реестром при помощи WHS

Когда дело касается разработки программного обеспечения и распространения приложений среди конечных пользователей, Редактор реестра (Regedit.exe) годится только для целей тестирования. Программы установки, REG-файлы, а также INF-файлы обеспечивают больше удобства и безопасности при работе с реестром. Более того, если вы собираетесь автоматизировать работу в Windows и выполнять модификации в реестре с космической скоростью, то, безусловно, оцените возможности использования сценариев.

В главе 10 мы уже слегка затрагивали данный вопрос и даже приводили небольшой фрагмент кода, демонстрирующего использование WSH. Появившейся с выходом в свет операционной системы Windows 2000, WSH 2.0 позволяет создавать достаточно простые, но вместе с тем гибкие и мощные сценарии для автоматизации сетевого администрирования. Так как WSH является языково-независимым средством, вы абсолютно свободны в выборе языка. Это может быть Visual Basic Scripting Edition (VBScript), JScript или Perl. WSH также обеспечивает поддержку COM, позволяя насладиться такими преимуществами новых технологий, как Windows Management Instrumentation (WMI).

Теперь самое время перейти к более детальному рассмотрению данного вопроса. Разумеется, в рамках одной главы невозможно подробно описать WSH, WMI или же такие языки сценариев, как, например VBScript или JScript. (Каждый из этих вопросов вполне заслуживает отдельной книги. Автору, например, знакомы такие книги, посвященные JScript и Perl, объем которых превышает 1500 страниц. Поэтому, если вам необходимо подробное справочное руководство по языку программирования, то вам следует купить одну из таких книг в ближайшем книжном магазине.)

Однако, здесь мы рассмотрим вопросы, относящиеся к реестру, и в частности, методы WSH — RegRead, RegWrite и RegDelete. Мы также рассмотрим их практическое использование и приведем несколько простых, но полезных сценариев.

 

Краткие сведения о Microsoft Windows Script Host

Microsoft Windows Script Host (WSH) является языково-независимым хостом обработки сценариев для использования в средствах, совместимых с технологией Windows Script. Это административное средство позволяет осуществлять мощную и гибкую обработку сценариев на платформе 32-разрядной системы Windows, запускаемых как с рабочего стола Windows, так и в режиме командной строки.

Windows Script Host является идеальным средством для создания и обработки неинтерактивных сценариев, используемых, например, для регистрации пользователя в системе, для администрирования и управления компьютером (machine automation).

 

Преимущества Windows Script Host

Windows Script Host обладает следующими характеристиками:

В состав Windows XP включена последняя версия Windows Script Host — 5.6.0 (рис. 14.1). Версии Windows Script Host, реализованные операционными системами Microsoft, перечислены в табл. 14.1.

Таблица 14.1. Версии WSH, реализованные в операционных системах Microsoft

Host-приложение

1.0

2.0

5.1

5.6

Microsoft Windows 98

X

Microsoft Windows ME

X

Microsoft Windows NT 4 Option Pack

X

Microsoft Windows 2000

X

Microsoft Windows XP

X

 

Рис. 14.1. В Windows XP включена последняя версия Windows Script Host — версия 5.6.0

По сравнению с предыдущими в этой версии были усовершенствованы перечисленные ниже свойства.

 Примечание

В Windows XP предусмотрен стандартный механизм цифровой подписи с помощью программы signcode.exe. К сожалению, эта программа не поставляется в составе Windows, а входит в состав Windows SDK. Наиболее полезную интересную статью по данному вопросу можно скачать по адресу http://msdn. microsoft.com/library/ default.asp?url=/library/en-us/dnclinic/ html/scripting10082001.asp.

 

Объектная модель Windows Script Host

Как и все в современных операционных системах Microsoft, WSH является объектно-ориентированным средством. Объектная модель Windows Script Host состоит из 14 объектов. Корневым объектом является wscript.

Объектная модель Windows Script Host предоставляет логический и систематизированный способ выполнения многих административных задач. Набор обеспечиваемых СОМ-интерфейсов можно разделить на две главные категории:

 Примечание 

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

 

Объект WshShell

Обеспечивает доступ к собственной оболочке Windows. Объект WshShell является дочерним объектом объекта wscript и для того, чтобы создать объект WshShell необходимо использовать метод createscript объекта WScript (т.е. WScript.CreateObject("WScript.Shell") ). Вы создаете объект WshShell независимо от того, что собираетесь делать — запустить программу локально, манипулировать содержимым реестра, создать ярлык, или получить доступ к системной папке. Объект WshShell обеспечивает коллекцию Environment. Эта коллекция позволяет управлять переменными окружения (такими как WINDIR, PATH или PROMPT).

 

Метод RegRead

Метод RegRead возвращает значение ключа или имя значимого элемента реестра. В этом методе используется следующий синтаксис:

Object.RegRead(strName)

где:

Метод RegRead может возвращать значения следующих типов: REG_SZ, REG_DWORD, REG_BINARY, REG_EXPAND_SZ И REG_MULTI_SZ.

Вы можете указать имя ключа путем добавления в конец значения strName закрывающей обратной наклонной черты. Для указания имени значимого элемента завершающая наклонная черта не нужна. Значимый элемент состоит из трех частей: имени, типа данных и значения. При указании имени ключа (в противоположность имени значимого элемента), RegRead возвращает значение, заданное по умолчанию. Для того чтобы прочитать значение ключа, заданное по умолчанию, укажите имя самого ключа. Полные имена ключей и значимых элементов должны начинаться с корневого ключа. В методе RegRead необходимо придерживаться принятых аббревиатур корневого ключа. В табл. 14.2 представлены пять допустимых корневых ключей.

Таблица 14.2. Аббревиатуры имен корневых ключей реестра

Имя корневого ключа

Аббревиатура

HKEY_CURRENT_USER

HKCU

HKEY_LOCAL_MACHINE

HKLM

HKEY_CLASSES_ROOT

HKCR

HKEY_USERS

HKEY_USERS

HKEY_CURRENT_CONFIG

HKEY_CURRENT_CONFIG

 

Метод Reg Write

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

Object.RegWrite(strName,   anyValue   [,strType]) 

где:

Указывайте имя ключа путем добавления в конец значения strName закрывающей обратной наклонной черты. Для указания имени значения наклонная черта не нужна. Метод Regwrite автоматически преобразует параметр anyvalue либо в строковое, либо в целочисленное значение. Значение strType определяет его тип данных (либо строковое, либо целочисленное). Опции strType приведены в табл. 14.3.

Таблица 14.3. Допустимые значения аргумента strType метода RegWrite

Преобразовано к типу

strType

Строковый

REG_ SZ

Строковый

REG_ EXPAND_ SZ

Целый

REG_ DWORD

Строковый

REG_ BINARY

Примечание 

Для метода RegWrite тип REG_MULTI_SZ не поддерживается.

Полные имена ключей и значимых элементов предваряются указанием корневого ключа. Для метода Regwrite следует использовать аббревиатурную версию имен корневых ключей (если они существуют). Аббревиатуры корневых ключей реестра, используемых методом Regwrite, совпадают с теми, которые применяются для метода RegRead.

 

Метод Reg Delete

Метод RegDeiete используется для удаления ключа реестра или одного из его значимых элементов из реестра. Этот метод использует следующий синтаксис:

Object.RegDelete(strName)

где:

Укажите имя ключа путем добавления в конец значения strName закрывающей обратной наклонной черты; для указания имени значимого элемента наклонная черта не нужна. Полные имена ключей и элементов предваряются указанием корневого ключа. Для метода RegDeiete следует использовать аббревиатурную версию имен корневых ключей (если они существуют). Существует пять корневых ключей; они такие же, как и для методов RegRead и RegWrite.

 

Пример JScript-сценария

Простой пример, написанный на скрипт-языке JavaScript (а точнее говоря, на реализации этого языка компанией Microsoft — JScript), иллюстрирующий использование этих методов, приведен в листинге 14.1. Этот программный КОД создает ключ реестра HKEY_CURRENT_USER\Software\MyCoolSoftware, устанавливает значение его элемента (по умолчанию) ((Default)) (типа данных REG_BINARY) равным 1, затем под этим ключом создает еще один элемент со значением типа REG_SZ и присваивает ему строковое значение "Это всего лишь тест!".

 Листинг 14.1. Пример JScript-кода, иллюстрирующего доступ к реестру

// Простейший пример, демонстрирующий
 доступ к реестру 
 // при помощи JScript 
 // Используйте этот модуль на свой страх и
 риск 
 // Установка переменных
 var vbOKCancel = 1;
 var vblnformation =64;
 var vbCancel = 2;
 var result; 
 // Создание объекта WshShell 
 var WshShell = WScript.CreateObject
("WScript.Shell"); 
 { 
 // Выдача приглашающего сообщения
 пользователю 
 result = WshShell.Popup("Создать новый
 параметр реестра?",
 0, 
 "Доступ к реестру с использованием JScript",
 vbOKCancel + vblnformation)
 if (result != vbCancel)
 { WshShell.RegWrite ("HKCU\\Software\\
MyCoolSoftware\\",      1, "REG_BINARY");
 WshShell.RegWrite ("HKCU\\Software\\
MyCoolSoftware\\MySuperProgram",
 "Это всего лишь тест!", "REG_SZ");
 var bКеу = WshShell.RegRead "HKCU\\Software\\
MyCoolSoftware\\");
 WScript.Echo {WshShell.RegRead "HKCU\\
Software\\MyCoolSoftware\\ 
 MySuperProgram"));
 } 
 // Приглашение пользователю 
 result = WshShell.Popup("Удалить только что
 созданный параметр?",
 0, 
 "Доступ к реестру с использованием JScript",
 vbOKCancel + vblnformation);
if (result != vbCancel)
 { 
 WshShell.RegDelete 
 ("HKCU\\Software\\MyCoolSoftware\
\MySuperProgram"); 
 WshShell.RegDelete ("HKCU\\Software\
\MyCoolSoftware\\");
 }
 }

Для проверки функционирования этого сценария введите в текстовом редакторе (например, в Блокноте (Notepad)) программный код, приведенный в данном листинге, и сохраните полученный файл с расширением JS. Если вы дважды щелкните мышью по этому файлу, запустится сервер WSH и выполнит данный сценарий. Обратите внимание, что этот скрипт приглашает пользователя подтвердить добавление новых элементов реестра (рис. 14.2), отображает содержимое созданного элемента реестра (рис. 14.3), а затем задает вопрос пользователю о том, следует ли удалить созданный ключ и содержащийся в нем параметр (рис. 14.4).

Рис. 14.2. Диалоговое окно, приглашающее пользователя подтвердить создание новых установок реестра

Рис. 14.3. На этом шаге создан новый элемент реестра

Рис. 14.4. Диалоговое окно, приглашающее пользователя подтвердить удаление вновь созданных установок реестра

Рис. 14.5. Для проверки выполненных действий на каждом шаге сценария, можно воспользоваться Редактором реестра

Представленные диалоговые окна дают возможность пользователю выполнить пошаговую модификацию реестра, которую можно отследить, например, с помощью Редактора реестра (Registry Editor) — рис. 14.5.

 

Примеры VBScript-сценариев

Если вы предпочитаете VBScript, то и в этом случае можете воспользоваться рассмотренными выше методами для доступа к реестру (лишь обратите внимание на различие в синтаксисе JScript и VBScript).

 

Разрешение и блокировка записи изменений в меню Пуск

Здесь представлен небольшой пример, разработанный на VBScript, который, в отличие от предыдущего примера, выполняет полезную работу — активизирует или блокирует внесение изменений в меню Пуск (Start).

В главе 12 мы рассматривали те элементы, которые осуществляют управление меню Пуск (Start). Одним из таких значимых элементов является элемент NoChangeStartMenu под ключом HKEY_CURRENT_USER\SOFTWARE\ Microsoft \Windows\CurrentVersion\Policies\Exploreг. Когда значение этого элемента установлено равным 1, внесение изменений в меню невозможно, а когда это значение равно 0, то внесение изменений разрешено. В нашем примере, скрипт считывает значение элемента NoChangeStartMenu в реестре, отображает статус меню Пуск (Start) и предлагает пользователю разрешить (рис. 14.6) или блокировать (рис. 14.7) внесение изменений в меню Пуск (Start).

Рис. 14.6. Приглашение пользователю разблокировать меню Пуск

Рис. 14.7. Предложение пользователю заблокировать меню Пуск

 Исходный код данного примера представлен в листинге 14.2.

 Листинг 14.2. Исходный код VBScript-сценария, устанавливающего  разрешение или блокировку внесения изменений в меню Пуск

Исходный код разрешения и блокировки 
внесения изменений в меню Пуск
 Option Explicit 
 Dim WSHShell, RegKey, NoChangeStartMenu,  
    Result
 Set WSHShell = CreateObject("WScript.Shell")
 RegKey = "HKCU\Software\Microsoft\Windows\
CurrentVersion\Policies\Explorer\"
 NoChangeStartMenu = WSHShell.RegRead    

  (regkey & "NoChangeStartMenu")
 If NoChangeStartMenu  = 1 Then 
'Изменения в меню Пуск запрещены
 Result = MsgBox("Меню Пуск заблокировано."
 & _ 
 vbNewLine & "Разблокировать?",36)
 If Result = 6 Then 'Нажата кнопка Да
 WSHShell.RegWrite regkey   
   & "NoChangeStartMenu",0
End If
Else ' Меню Пуск может быть изменено
 Result = MsgBox("Внесение изменений в
 меню Пуск разрешено." &_
 vbNewLine & "Запретить  одификацию?",36)
 If Result = 6 Then 'Нажата кнопка Да 
 WSHShell.RegWrite regkey   
   & "NoChangeStartMenu",1
 End If
End If 1
 Конец программного кода      

 

Активизация и блокировка службы Восстановление системы

Пример, представленный в этом разделе, показывает, как можно использовать технологию Windows Management Instrumentation для автоматизации работы со средством Восстановление системы (System Restore).

Прежде чем продолжить изучение данного примера, кратко рассмотрим использование возможностей технологии WMI scripting. WMI scripting представляет собой библиотеку интерфейсов автоматизации (Automation). Скрипт-языки, совместимые с СОМ-технологней, используют эти интерфейсы для доступа к инфраструктуре WMI. Все объекты Automation, входящие в WMI, а также методы и свойства реализованы в файле Wbemdisp.dll.

 Примечание 

Для запуска WMI необходимо иметь полномочия администратора.

Для доступа к WMI посредством библиотеки WMI scripting вам следует выполнить три основных действия, которые являются универсальными для большинства WMI-скриптов:

1. Подключиться к сервису Windows Management.

2. Извлечь экземпляры объектов, управляемых WMI.

3. Вызвать методы или получить доступ к свойству управляемого объекта.

 Примечание

Для того чтобы подробнее узнать о возможностях WMI scripting, обратитесь к Microsoft Windows 2000 Professional Resource Kit или Microsoft Windows 2000 Server Resource Kit, где вы сможете найти свыше 50 сценариев, построенных на основе WMI, позволяющие полностью управлять целевым компьютером — от конфигурации загрузки до учетных пользовательских записей.

Пример, представленный в листинге 14.3, автоматизирует задачу разрешения и блокировки использования средства Восстановление системы (System Restore) на указанном диске. При запуске этот скрипт создает объект wshsheii, затем запрашивает ввод данных, приглашая пользователя выбрать разрешение или блокировку средства Восстановление системы (System Restore) — рис. 14.8. Пользователь должен ввести соответствующую строку текста (enable или disable) в текстовое поле в нижней части этого окна и нажать кнопку ОК.

Далее сценарий предложит пользователю указать устройство, по отношению к которому необходимо выполнить указанное действие (рис. 14.9). Укажите диск, в соответствии с форматом: <логический_адрес_диска>: \, например, D: \.

Рис. 14.8. Диалоговое окно, приглашающее пользователя указать, разрешить или блокировать использование службы Восстановление системы

Рис. 14.9. Диалоговое окно, предлагающее пользователю устройство, по отношению к которому будет выполнено заданное действие

Сценарий запускается и выполняет указанное действие на заданном устройстве. После того как действие завершится, скрипт отобразит сообщение, информирующее пользователя о результате (рис. 14.10). Чтобы убедиться в том, что заданное действие выполнено успешно, запустите утилиту Система (System) в Панели управления (Control Panel), перейдите на вкладку Восстановление системы (System Restore) и проверьте, заблокировано ли использование средства Восстановление системы (System Restore) для указанного устройства (рис. 14.11).

Рис. 14.10. Окно сообщений, информирующее пользователя о результате операции

Рис. 14.11. Обращайтесь к пользовательскому интерфейсу средства Восстановление системы для того, чтобы проверить, заблокировано ли это средство для устройства, указанного в процессе работы сценария

Теперь рассмотрим программный код, реализующий эти действия (листинг 14.3).

Как уже отмечалось, для того чтобы использовать WMI scripting, данный код должен выполнить подключение к сервису Windows Management, извлечь экземпляры объектов, управляемых WMI, а затем вызвать метод или получить доступ к свойству управляемого объекта. В приведенном ниже примере, мы подключаемся к WMI с помощью моникера WMI — winmgmts И класса SystemRestore.

 Примечание 

Моникер (moniker) представляет собой стандартный механизм СОМ для построения СОМ-объекта. Подробную информацию о синтаксисе моникеров WMI можно получить по адресу: http://msdn.microsoft.com/library/psdk/wmisdk/ scintro_6tpv.htm.

Листинг 14.3. VBScript-сценарий, выполняющий разрешение/блокировку  использования средства Восстановление системы на указанном дисковом устройстве

Начало кода разрешения/блокировки    
  Восстановления системы
 Option Explicit 
 Dim WSHShell, onoff, drive, SRP, eSRP, Result 
 'Создание объекта WSHShell 
 Set WSHShell = CreateObject("WScript.Shell")
 ' Запрос на ввод данных 
 onoff = inputbox ("Активизировать или
 блокировать" &_
 vbNewLine &
 "Восстановление системы?", _
 "Восстановление системы")
 Drive = inputbox ("Укажите диск, для которого 
следует"& _ 
 vbNewLine & "выполнить операцию,
 например: 'с:\'", _
 "Укажите диск")
 ' Использование моникера      
WMI и класса SystemRestore для доступа к WMI
 set SRP = GetObject("winmgmts:\\.
\root\default:SystemRestore")
If onoff = "enable" then
eSRP = SRP.enable(drive)
 Result = MsgBox("Восстановление  системы" & _ 
 vbNewLine & "активизировано для диска:
 " & Drive, 64)
End If 
 If onoff = "disable"then
 eSRP = SRP.disable(drive)
 Result = MsgBox("Восстановление истемы" & _ 
 vbNewLine & "блокировано для диска: " & 
Drive, 64)
 End If
 ' Конец кода 

 

Автоматическое создание точки восстановления

Что еще можно сделать с помощью WMI и средства Восстановление системы (System Restore)? Попробуем автоматически создать точки восстановления. Теперь, когда мы уже создали несколько сценариев, это довольно просто. Решим, что должен делать разрабатываемый сценарий. Сначала он должен спросить пользователя, надо ли создать новую точку восстановления (рис. 14.12).

Далее, если пользователь нажмет кнопку Да, необходимо предоставить ему возможность ввести описание точки восстановления (рис. 14.13).

Рис. 14.12. Диалоговое окно, приглашающее пользователя согласиться/отказаться на создание точки восстановления

Рис. 14.13. Диалоговое окно, приглашающее пользователя ввести описание создаваемой точки восстановления

После того как пользователь введет описание точки восстановления, воспользуемся моникером WMI и классом SystemRestore для того, чтобы получить доступ к WMI, а затем создадим новую точку восстановления, используя описание, введенное пользователем. Простой код, выполняющий эти задачи, представлен в листинге 14.4.

Листинг 14.4. Автоматическое создание точки восстановления 

Option Explicit 
 Dim WSHShell,SRP,CSRP,description,Result 
 Set WSHShell = CreateObject("WScript.Shell") 
 Result = MsgBox("Создать точку
 восстановления?", 36) 
 If Result = 6 Then ' Нажата кнопка Да 
 description = Inputbox ("Введите описание
 точки восстановления:",_ 
 "Будет создана точка восстановления")
 Используем моникер WMI и класс SystemRestore 
Set SRP = getobject("winmgmts:\\.
\root\default:Systemrestore")
 CSRP = SRP.createrestorepoint(description, 0, 100)
 End If 
 ' Конец кода 

После выполнения этого сценария, запустите средство Восстановление системы (System Restore) и проверьте, действительно ли создана точка восстановления. Моментальный снимок экрана, на котором отображены две тестовых точки восстановления, первая из которых создана автором автоматически в процессе тестирования данного скрипта, показан на рис. 14.14.

Рис. 14.14. В окне Восстановление системы отображены автоматически созданные точки восстановления

Рис. 14.15. Окно редактора групповой политики

Рис. 14.16. Окно Свойства: Вход в систему

Теперь, когда сценарий протестирован, и мы убедились, что он работает, рассмотрим, какую же практическую пользу можно из этого извлечь? Например, было бы неплохо, если бы после каждой успешной регистрации в системе пользователям (в особенности тем, кто экспериментирует с реестром) предлагалось бы создать точку восстановления. Как вы помните, считается, что система Windows XP успешно загружена лишь после того, как, по крайней мере, один пользователь зарегистрировался в ней, и с этого момента в конфигурацию LastKnownGood ("последняя успешная загрузка") копируется управляющий набор clone. Автор считает целесообразным в этот момент создать точку восстановления для того, чтобы надежно застраховаться. Этот маленький сценарий вполне справится с поставленной задачей, если вы назначите его в качестве скрипта регистрации в системе.

Для этого просто скопируйте файл сценария в каталог % System Root% \System32\GroupPolicy\User\Scripts\Logon, затем запустите оснастку ММС Групповая политика (Group policy) и раскройте дерево консоли, как показано на рис. 14.15: Конфигурация пользователя | Конфигурация Windows | Сценарии (вход/выход из системы) (User Configuration | Windows Settings Scripts). Двойным щелчком на политике Вход в систему (Logon) откройте окно Свойства: Вход в систему (Logon Properties) — рис. 14.16, нажмите кнопку Добавить (Add) и тем самым включите наш скрипт в список сценариев регистрации на локальном компьютере.

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

 

Резюме

Итак, мы представили несколько сценариев, начиная с самого простого примера, созданного исключительно в демонстрационных целях, а затем создали небольшой, но полезный сценарий. Самая сильная сторона WSH заключается в ее простоте и той легкости, с которой эта технология может применяться на практике. Разумеется, есть некоторые ограничения (например, методы RegRead, RegWrite и RegDeiete, обсуждавшиеся ранее в этой главе, не обеспечивают прямого способа проверки того, не содержатся ли уже в реестре те ключи или значимые элементы, которые вы собираетесь создавать, удалять или модифицировать). Для этой цели потребуется написать специальное приложение, используя какую-нибудь хорошо известную вам среду разработки (например, Visual Basic, Visual C++ или Delphi).

 Примечание 

Вопрос программирования реестра является одним из самых интересных, но в то же время очень трудным. Тем, кого заинтересовала данная тема, автор рекомендует следующие книги: Weiying Chen, Wayne Berry "Windows NT Registry Guide" (Addison-Wesley Pub. Co.) и Don Kiely, Zane Thomas "Visual Basic Programmer's Guide to Windows Registry" (Marbry Software, Incorporated). Как уже было отмечено, почти каждая глава этой книги заслуживает написания отдельного внушительного тома. Однако, этот вопрос пожалуй, — первый в списке кандидатов!

С другой стороны, Windows-скрипт — это простой текстовый файл, который вы можете создать в любом текстовом редакторе, необходимо лишь, чтобы файл сценария был сохранен с "WSH-совместимым" расширением (JS, VBS, или WSF). В то же самое время, возможности WSH весьма велики, и овладев ими, вы сможете в считанные минуты воплощать в жизнь эффективные технические решения.

Используются технологии uCoz