/
Tags: компьютерные технологии информатика информационные технологии windows
ISBN: 5-94157-349-9
Year: 2004
Text
Андрей Попов Евгений Шикин Администрирование Windows с помощью WMI и WMIC Санкт-Петербург «БХВ-Петербург» 2004
УДК 681.3.06 ББК 32.973.26-018.2 П58 Попов А. В., Шикин Е. А. П58 Администрирование Windows с помощью WMI и WMIC. — СПб.: БХВ-Петербург, 2004. — 752 с: ил. ISBN 5-94157-349-9 В книге рассматривается базовая технология Microsoft для управления Windows-системами — Windows Management Instrumentation (WMI). Описаны стандартные администраторские утилиты WMI (пакет WMI Tools). Приведено большое количество готовых сценариев WMI на языке VBScript, с помощью которых можно управлять файловой системой, журналами операций, системным реестром, процессами и службами на удаленных компьютерах, проводить инвентаризацию установленного оборудования и программного обеспечения на рабочих станциях в локальной сети, выполнять автоматическую обработку событий, возникающих в операционной системе. Рассмотрена работа с WMI из командной строки (WMI Command-line, WMIC) и возможные варианты расширения стандартной схемы WMIC. Для программистов и администраторов Windows УДК 681.3.06 ББК 32 973.26-018.2 Группа подготовки издания: Главный редактор Екатерина Кондукова Зам. главного редактора Анатолий Адаменко Зав. редакцией Григорий Добин Редактор Екатерина Капалыгина Компьютерная верстка Натальи Караваевой Корректор Виктория Пиотровская Дизайн обложки Игоря Цырульникова Зав. производством Николай Тверских Лицензия ИД № 02429 от 24.07.00. Подписано в печать 25.11.03. Формат 70х1001Лв. Печать оо>сетная. Усл. печ. л. 60,6. Тираж 3 000 экз. Заказ No 1250 "БХВ-Петербург", 198005, Санкт-Петербург, Измайловский пр., 29. Гигиеническое заключение на продукцию, товар Ne 77.99.02.953.Д.001537.03.02 от 13.03.2002 г. выдано Департаментом ГСЭН Минздрава России. Отпечатано с готовых диапозитивов в Академической типографии "Наука" РАН 199034, Санкт-Петербург, 9 линия, 12. ISBN 5-94157-349-9 с Попов А. В., Шикин Е А., 2004 О Оформление, издательство "БХВ-Петербург", 2004
Содержание Введение 1 Для кого предназначена эта книга? 2 Структура книги 2 Принятые в книге соглашения 3 Как связаться с авторами? 3 Глава 1. Общие сведения о WMI 5 Назначение и возможности WMI 5 Установка WMI 7 Общая структура WMI 7 Ядро\УМ1 9 Провайдеры WMI 9 Менеджер объектов CIM 11 Репозиторий CIM. Пространства имен 12 Путь к классам и объектам CIM 15 Структура классов WMI 16 Основные типы классов CIM 16 Свойства классов WMI 18 Методы классов WM1 24 Квалификаторы классов, свойств и методов 26 Квалификаторы классов 27 Квалификаторы свойств 28 Квалификаторы методов 29 События WMI 30 Внутренние события 31 Внешние события 32 События таймера 33 Временные и постоянные потребители событий 33 Безопасность при работе с WMI 36
Глава 2. Интерактивная работа с WMI 41 Настройка свойств WMI (элемент управления WMI) 41 Запуск элемента управления WMI 42 Настройка журнала ошибок WMI 44 Архивирование и восстановление репозитория CIM 46 Управление безопасностью на уровне пространства имен 47 Дополнительные возможности элемента управления WMI 50 Тестер WMI (WBEMTest) 52 Подключение к пространству имен 54 Смена пространства имен 57 Открытие класса или экземпляра класса (объекта) 57 Редактирование классов и объектов 58 Просмотр и изменение квалификаторов класса или объекта 62 Просмотр и изменение свойств класса или объекта 63 Просмотр и изменение методов класса или объекта 66 Просмотр ассоциативных связей для класса или объекта 67 Формирование списка классов или объектов 70 Выполнение методов класса или объекта 72 Выполнение обычных WQL-запросов 76 Выполнение запросов для подписки на уведомления о наступлении событий 78 Административные утилиты WMI (WMI Tools) 79 Подключение к пространству имен WMI 80 WMICIM Studio 84 Проводник классов (Class Explorer) 85 Просмотрщик классов (Class Viewer) 86 Поиск класса 88 Просмотр экземпляров класса 90 Просмотр и изменение квалификаторов класса или объекта 91 Просмотр и изменение свойств класса или объекта 92 Просмотр и изменение методов класса или объекта 95 Просмотр ассоциативных связей для класса или объекта 98 Выполнение методов класса 100 Выполнение WQL-запросов 103 Генерация MOF-файлов для классов или объектов 105 Компиляция MOF-файлов 111 WMI Object Browser 114 Проводник объектов (Object Explorer) 115 Просмотрщик объектов (Object Viewer) 122 Пример: просмотр информации о жестком диске 123 WMI Event Registration 126 Просмотр и изменение свойств класса или объекта 128 Создание событий таймера 129
Создание фильтров событий 133 Создание постоянного потребителя событий 135 Установка связи между фильтром и потребителем событий 139 WMI Event Viewer 142 Интерфейс утилиты 144 Создание и регистрация потребителя класса EventViewerConsumer 144 Просмотр информации о возникающих событиях 147 Глава 3. Доступ к WMI из командной строки (WMIC) 149 Запуск WM 1С. Использование встроенной справки 149 Архитектура WMIC 155 Интерактивная работа с WMIC 157 Синтаксис командного языка WMIC 157 Команды WMIC 162 Команда CONTEXT 162 Команда CLASS 163 Команда PATH 164 Команды QUIT и EXIT 164 Глобальные параметры (ключи), настройки WMIC 164 Параметр /NAMESPACE 165 Параметр /R OLE 165 Параметр /NODE 165 Параметры /IMPLEVEL и /AUTHLEVEL 166 Параметр /LOCALE. 167 Параметр /PRIVILEGES 167 Параметр /TRACE 167 Параметр /RECORD 167 Параметры /OUTPUT и /APPEND 170 Параметр /INTERACTIVE 171 Параметры /USER и /PASSWORD 172 Псевдонимы WMIC 172 Операторы (действия) WMIC 180 Оператор ASSOC 180 Оператор CALL 182 Оператор CREATE 185 Оператор SET 186 Оператор DELETE. 187 Оператор GET 187 Оператор LIST 194 Форматы вывода данных WMIC 196 Вывод в буфер Windows 196 Вывод в XML-файл 197 Вывод в HTML-файл 203
Вывод в текстовый файл 206 Вывод в CSV-файл 211 Примеры команд WMIC 212 Завершение сеанса пользователя 212 Перезагрузка и выключение компьютера 213 Вывод информации о BIOS 213 Просмотр параметров загрузки 214 Вывод свойств операционной системы 215 Получение информации о процессоре 217 Получение информации об оперативной памяти 218 Вывод и изменение параметров журналов событий Windows 219 Вывод записей из журналов событий Windows 221 Получение информации о свойствах и состоянии служб 222 Запуск и остановка служб 222 Создание и завершение процессов 222 Мониторинг информации о процессах 223 Пакетный режим работы WMIC 224 Практические примеры командных файлов WM1C 225 Расширение схемы WMIC 231 Создание новых псевдонимов 232 Определение новых форматов вывода 239 Глава 4. Сценарии WSH как средство доступа к WMI 245 Создание и запуск простейших сценариев WSH 246 Запуск сценария из командной строки в консольном режиме 247 Запуск сценария из командной строки в графическом режиме 248 Запуск сценария с помощью меню Пуск 249 Запуск сценария с помощью Проводника Windows (Windows Explorer)...249 Стандартные объекты WSH 5.6 250 Типичные примеры сценариев WSH 251 Вывод на экран текстовых строк 251 Метод Echo объекта WScript 252 Методы Write и WriteLine объекта WScript.StdOut 254 Функция MsgBox языка VBScript 258 Метод Popup объекта WshShell 259 Ввод строк текста 260 Ввод строк в консольном режиме 261 Ввод строк в графическом режиме 269 Получение свойств WSH и запущенного сценария 270 Работа с параметрами командной строки сценария 274 Выход из сценария с определенным кодом завершения 278 Использование внешних объектов автоматизации (на примере Microsoft Word) 280
Запуск из сценариев внешних программ 284 Запуск приложений Windows 284 Переключение между приложениями, имитация нажатий клавиш 287 Запуск независимых консольных приложений и команд Windows 291 Запуск дочерних консольных приложений и команд DOS, использование их входных и выходных потоков 294 Доступ к специальным папкам Windows XP 298 Создание ярлыков в специальных папках 301 Работа с системным реестром Windows 306 Работа с ресурсами локальной сети 311 Определение имен рабочей станции, пользователя и домена 311 Получение списка подключенных сетевых дисков и принтеров 312 Подключение и отключение сетевых дисков и принтеров 315 Выполнение основных операций с файловой системой 323 Получение сведений о диске 325 Получение сведений о каталоге 327 Получение сведений о файле 328 Проверка существования диска, каталога или файла 330 Получение списка всех имеющихся дисков 331 Получение списка всех подкаталогов заданного каталога : 334 Получение списка всех файлов заданного каталога 336 Создание каталога 338 Создание текстового файла 339 Операции чтения и записи строк для текстового файла 341 Копирование и перемещение файлов и каталогов 344 Удаление файлов и каталогов 346 Просмотр информации о пространствах имен и классах CIM 348 Получение списка всех пространств имен 348 Получение списка всех классов в пространстве имен 355 Получение списка классов определенного типа 361 Просмотр сведений о классе 365 Просмотр свойств класса 365 Просмотр методов класса 370 Просмотр квалификаторов класса 373 Вывод описания класса в MOF- и XML-файлы 376 Глава 5. Механизм работы и основные типы сценариев WMI 385 Объектная модель библиотеки поддержки сценариев WMI 385 Соединение с подсистемой WMI 388 Соединение с помощью объекта SWbemLocator 388 Соединение посредством моникера WMI 392 Префикс "WinMgmts:". 392 Настройки безопасности в моникере 394 Путь к объекту WMI в моникере 395
Основные типы сценариев WMI 396 Синхронный, полусинхронный и асинхронный режимы выполнения методов WMI 397 Получение экземпляров управляемых ресурсов 398 Синхронный режим получения экземпляров 398 Полусинхронный режим получения экземпляров 404 Асинхронный режим получения экземпляров 408 Чтение свойств объекта WMI 416 Чтение определенных свойств с известными именами 417 Чтение всех свойств (коллекция SWbem Object.Properties^ 418 Изменение свойств объекта WMI 420 Вызов методов объекта WMI 421 Вызов метода при прямом доступе к нужному объекту 421 Синхронный вызов метода (метод SWbemServices.ExecMethod) 423 Асинхронный вызов метода (метод SWbemServices.ExecMethodAsync) .' 425 Создание нового экземпляра управляемого ресурса 428 Удаление экземпляра управляемого ресурса 429 Создание временных потребителей событий WMI 435 Подписка на события в синхронном режиме 435 Подписка на события в полусинхронном режиме 439 Подписка на события в асинхронном режиме 441 Создание постоянных потребителей событий WMI 445 Создание фильтра событий 445 Создание потребителя событий 447 Установка связи между фильтром и потребителем 450 Глава 6. Типичные администраторские сценарии WMI 453 Управление компьютером 453 Завершение сеанса пользователя 453 Перезагрузка компьютера 454 Выключение компьютера 456 Получение и анализ системной информации 457 Определение роли компьютера в домене 457 Вывод информации о BIOS 459 Вывод списка команд, выполняемых при загрузке системы 461 Вывод свойств операционной системы 462 Определение номера последнего обновления, установленного на компьютере 464 Вывод списка установленных программных продуктов 465 Вывод списка установленных программных продуктов со всеми компонентами 467
Сбор сведений о подключенных устройствах 470 Получение информации о процессоре 470 Получение информации о физической памяти 473 Получение списка устройств Plug-and-Play 475 Получение информации о клавиатуре 477 Получение информации о мыши 479 Получение информации о параллельных и последовательных портах 480 Получение информации о звуковой карте 485 Получение информации о видеокарте 487 Получение информации о сетевом адаптере 490 Работа с журналом событий 492 Резервирование и очистка определенного журнала событий 492 Резервирование и очистка журналов событий, размер которых превышает заданный 493 Резервирование журнала событий в файл с именем, содержащим текущую дату 495 Копирование записей из журнала событий в базу данных 497 Поиск в журнале всех событий краха системы 500 Вывод всех событий из определенного журнала .' 501 Вывод всех событий за определенную дату 503 Вывод всех событий с определенным кодом 506 Вывод свойств определенного журнала событий 509 Работа с системным реестром 511 Создание подразделов и параметров 511 Проверка прав доступа к разделам и параметрам 513 Чтение подразделов и параметров 516 Изменение значений параметров 517 Удаление подразделов и параметров 519 Управление службами и процессами 522 Получение информации о свойствах и состоянии служб 522 Запуск и восстановление работы служб 525 Изменение пароля учетной записи службы 527 Создание процессов 529 Завершение процессов 532 Получение информации о процессах 533 Определение владельца процесса 536 Работа с файловой системой 537 Формирование множества файлов или папок по заданному условию 538 Получение информации о разделах жесткого диска 540 Получение информации о логических дисках и папках 542 Копирование файлов и папок 547 Удаление файлов и папок 549
Манипуляции с папками для совместного доступа 552 Создание папки для совместного доступа 552 Изменение свойств папки для совместного доступа 554 Определение имени папки на жестком диске для папки совместного доступа 555 Удаление папки для совместного доступа 557 Мониторинг состояния системы 558 Мониторинг состояния служб 558 Мониторинг создания процессов 560 Защита от запуска процесса 562 Мониторинг изменений реестра 563 Мониторинг изменений файловой системы 567 Мониторинг журналов событий 568 Управление учетными записями пользователей и групп 570 Связывание с нужным объектом каталога 572 Список всех доступных доменов в локальной сети 573 Создание пользователя и группы на рабочей станции 574 Вывод информации о пользователе и смена его пароля 575 Удаление пользователя и группы на рабочей станции 577 Список всех групп на рабочей станции 578 Список всех пользователей в группе 579 Автоматический запуск сценария на одном компьютере 580 Сценарии включения/выключения и входа/выхода 580 Сценарии, выполняемые при загрузке операционной системы 581 Сценарии, выполняемые при завершении работы операционной системы 583 Сценарии входа для всех локальных пользователей 583 Сценарий выхода для всех локальных пользователей 585 Сценарий входа для одного пользователя 585 Запуск сценария на нескольких компьютерах 588 Задание имен компьютеров в командной строке 588 Задание имен компьютеров в текстовом файле 589 Выполнение сценария для всех компьютеров в домене 592 Глава 7. Более сложные сценарии WMI 595 WMI-утилита для администрирования рабочих станций 595 Использование Internet Explorer для работы с диалоговыми окнами 596 Разработка HTML-формы для диалогового окна 596 Вывод HTML-формы из сценария WMI 600 Сценарий Sample_WMI_Tool.vbs 604 Сценарий для инвентаризации оборудования на рабочих станциях 615 Структура таблицы для инвентаризации 615 НТА-файл для интерфейса сценария 617 Сценарий Invent.hta 619
Заключение 637 Приложение 1. Справочник по языку запросов WQL 639 Запросы к данным 641 Оператор SELECT. 641 Оператор ASSOCIATORS OF 641 Оператор REFERENCES OF 643 Запросы к событиям WMI 644 Подписка на внешние события 644 Подписка на одиночные внутренние события. Ключевые слова WITHIN к ISA 644 Подписка на групповые события. Ключевые слова GROUP к HAVING 645 Приложение 2. Работа с ODBC-адаптером WMI 647 Установка ODBC-адаптера WMI. Регистрация источника данных WMI 647 Использование источника данных WM1 в Microsoft Access 650 Приложение 3. Средства разработки и отладки сценариев WSH 655 Создание и редактирование сценариев 655 Редактор Primalscript 655 Создание нового одиночного сценария 655 Открытие существующего одиночного сценария 658 Запуск одиночного сценария 658 Подписывание сценариев 659 Возможности пользовательского интерфейса 659 Другие редакторы 664 Отладка сценариев в Microsoft Script Debugger 664 Активизация отладчика 664 Команды отладчика 667 Установка и удаление точек прерывания 667 Выполнение сценария 667 Просмотр стека вызовов 668 Просмотр и изменение значений переменных 668 Приложение 4. Справочник по языкам VBScript и JScript 671 Язык JScript 671 Строки кода и комментарии 671 Переменные 672 Типы данных 673 Числа 673
Текстовые строки 674 Объекты 674 Логические данные 675 Null (пустой тип) и undefined (неопределенный тип) 675 Преобразование типов данных 675 Операторы 675 Унарные операторы 675 Бинарные операторы 676 Операторы побитовых логических операций и сдвига 676 Операторы присваивания 677 Операторы отношения 677 Условные операторы 678 Операторы циклов 679 Оператор break 682 Оператор continue 682 Прочие операторы 683 Обработка исключительных ситуаций 683 Порядок выполнения операторов 684 Функции 685 Встроенные функции 685 Функции пользователя 686 Встроенные объекты (классы) 687 Объект Array 687 Объект Date 689 Объект Enumerator 692 Объект Math 694 Объект String 695 Язык VBScript 698 Строки кода и комментарии 698 Переменные 698 Подтипы данных 699 Ссылки на объекты 700 Константы 700 Массивы 704 Операторы 705 Арифметические операторы 705 Операторы отношения и логические операторы 705 Условные операторы 706 Операторы циклов 708 Прочие операторы 711 Обработка исключительных ситуаций 711 Процедуры и функции 712 Математические функции 712 Символьные функции 713
Функции для работы с датой и временем 715 Функции для работы с массивами 716 Функции для работы с подтипами данных 717 Прочие функции 718 Функции и процедуры пользователя 719 Приложение 5. Описание прилагаемого компакт-диска 721 Список литературы 723 Ссылки на ресурсы Internet 725 Сайты компании Microsoft 725 Другие сайты 726 Телеконференции 726 Предметный указатель 727
Введение .Данная книга посвящена рассмотрению, как с теоретической, так и с практической точек зрения, одной из базовых технологий компании Microsoft, предназначенной для централизованного управления и слежения за работой различных частей компьютерной сети под управлением Windows, — Windows Management Instrumentation (WMI). Понимание и применение этой технологии окажется полезным для администратора операционной системы, т. к. WMI позволяет посредством одних и тех же стандартных утилит,- не прибегая к помощи сложных корпоративных приложений типа Microsoft Systems Management Server, успешно решать различные задачи, связанные, например, с проведением инвентаризации оборудования и программного обеспечения на компьютерах или с мониторингом работы процессов и служб на удаленной машине. Освоив же относительно несложные сценарии Windows Script Host (WSH), которые пишутся на языках VBScript или JScript, можно автоматизировать работу с WMI, выполняя, например, с помощью сценария одни и те же действия на всех рабочих станциях локальной сети. Кроме этого, сценарии WSH позволяют использовать совместно с WMI другие ActiveX-технологии Microsoft (например, ActiveX Data Object (ADO) для доступа к базам данных разных форматов или Active Directory Service Interface (ADSI) для работы со службами каталогов (Active Directory для Windows 2000, Windows Directory Service для Windows NT 4.0 и т. д.)). Отметим, что компания Microsoft в последнее время проводит большую работу по развитию и популяризации упомянутых ранее технологий, доступных в сценариях Windows: □ в операционных системах Windows XP/Server 2003 реализован механизм доступа к WMI из командной строки и пакетных файлов (WM1 Command-line, WMIC); □ на сайте Microsoft поддерживаются активно обновляемые разделы Microsoft Windows Script Technologies и TechNet Script Center; □ в издательстве Microsoft Press недавно выпущена весьма объемная и серьезная книга "Microsoft Windows 2000 Scripting Guide" [14];
D постоянно появляются публикации в журнале Windows & .Net Magazine/RE, для которых имеется перевод на русский язык [15]-|191. В настоящей книге мы описали базовые концепции и объектные модели, на которых основаны технологии WMI и WMIC, дали инструкции по работе со стандартными административными утилитами WMI и привели примеры использования сценариев WMI для решения практических задач администратора Windows. Для кого предназначена эта книга? Книга, в первую очередь, понадобится администраторам Windows, которые желают освоить технологии WMI и WMIC и использовать их в своей повседневной работе. Кроме этого, изложенная здесь информация может оказаться полезной разработчикам программного обеспечения, т. к. обращение к WMI позволит облегчить и унифицировать процесс написания различных приложений, взаимодействующих с той или иной частью операционной системы Windows. При изучении материала книги от читателя может потребоваться некоторое знакомство с языками JScript и VBScript (краткий справочник по этим языкам включен в приложение), а также понимание основ объектно- ориентированного программирования и СОМ-технологий. Структура книги В первой главе описывается общая архитектура WMI, объясняется роль провайдеров WMI, менеджера объектов CIM и репозитория CIM, подробно рассматривается структура классов WMI. Отдельно обсуждаются механизмы WMI, предназначенные для обработки внешних событий, приводится классификация таких событий. Кроме этого, в первой главе рассматриваются вопросы, связанные с безопасностью при работе с WMI. Во второй главе обсуждается интерактивная работа с WMI посредством специальных утилит, которые либо являются стандартными компонентами операционной системы (оснастка Элемент управления WMI (WMI Control) и тестер WMI (wbemtest.exe)), либо могут быть свободно получены с сайта фирмы Microsoft (административные утилиты WMI Tools). Третья глава посвящена рассмотрению появившегося в Windows XP инструмента WMIC (WMI Command-line), с помощью которого можно работать с WMI из командной строки. Здесь описан синтаксис командного языка, используемого в WMIC, приведены примеры команд и пакетных файлов WMIC, которые могут пригодиться при решении повседневных задач администратора Windows. Отдельно рассмотрены примеры расширения схемы
WMIC с помощью определения собственных псевдонимов и новых форматов вывода команд. В четвертой главе речь идет о сервере сценариев WSH (Windows Script Host), который позволяет непосредственно в операционной системе запускать сценарии на языках VBScript или JScript. Здесь приведены как сценарии, иллюстрирующие использование стандартных объектов WSH, так и сценарии, работающие с объектной моделью CIM (сценарии WMI). В пятой главе рассмотрена объектная модель библиотеки поддержки сценариев WMI (WMI Scripting Library), которая обеспечивает сценариям WSH доступ к объектам WMI. Приведены примеры основных типов сценариев WMI, включая создание временных и постоянных потребителей событий WMI. В шестой главе описаны сценарии WMI, выполняющие типичные администраторские задачи: получение и анализ системной информации, работа с журналом событий и системным реестром, управление процессами и службами, мониторинг происходящих в операционной системе изменений и т. д. В седьмой главе на примере двух WMI-утилит администратора локальной сети показано, каким образом можно создавать более сложные сценарии WMI с полноценным графическим интерфейсом. В приложениях дано описание используемого в WMI языка запросов WQL, показано, как с помощью специального ODBC-адаптера можно сохранять информацию об объектах WMI в базах данных Microsoft Access, приведен справочник по языкам JScript и VBScript, а также рассмотрены специальные редакторы и отладчики для сценариев (в частности, подробно рассмотрен мощный редактор Primalscript). Принятые в книге соглашения При описании операторов, функций и методов объектов мы использовали стандартные соглашения. Названия параметров и аргументов набраны курсивом, необязательные параметры заключены в квадратные скобки [], например: CreateObject{strProgID [,strPrefix]) Как связаться с авторами? Все вопросы, замечания и предложения, касающиеся данной книги и описываемых в ней технологий, можно посылать авторам по следующему электронному адресу: wmi_popov@mail.ru.
Глава 1 Общие сведения о WMI Технология WMI — это созданная фирмой Microsoft реализация модели управления предприятием на базе Web (Web-Based Enterprise Management, WBEM), которая разработана и принята рабочей группой по управлению распределенными системами (Distributed Management Task Force, DMTF), при участии таких компаний, как ВМС Software, Cisco Systems, Compaq Computer, Intel и Microsoft. Задачей WBEM была разработка таких стандартов для удаленного управления информационной средой предприятия, которые позволили бы управлять всеми физическими и логическими компонентами этой среды из одной точки и не зависели бы при этом от конкретного оборудования, сетевой инфраструктуры, операционной системы, файловой системы и т. д. Для этого была предложена схема СШ (Common Information Model), которая представляет физическую и логическую структуры компьютерной системы в виде единой расширяемой объектно-ориентированной информационной модели и определяет единые интерфейсы для получения информации о любом компоненте этой модели. Разработчики Microsoft реализовали WMI для всех 32-разрядных версий Windows, начиная от Windows 95 OSR 2 и заканчивая Windows Server 2003. Назначение и возможности WMI Напомним, что в Windows NT для администрирования операционной системы приходилось пользоваться несколькими утилитами и инструментами, т. к. данные о компонентах системы хранились в различных источниках (база пользователей SAM, журнал событий Event Log, системный реестр и т. д.), доступ к которым осуществлялся с помощью разных утилит (диспетчер пользователей — User Manager, просмотрщик журнала событий — Event Log Viewer, редактор реестра — Regedit) и программных интерфейсов (Network API для работы с данными о пользователях, Event Log API для просмотра сведений о произошедших событиях, Registry API для чтения или редактирования системного реестра). Понятно, что это было неудобно, т. к. во-первых, приходилось осваивать множество не связанных друг с другом
технологий и инструментов, а во-вторых, усложнялось взаимодействие разных компонентов компьютерной системы друг с другом (например, настройки в локальном реестре рабочей станции могли конфликтовать с политиками безопасности, заданными на сервере). С появлением Windows 2000 эта ситуация была в основном исправлена. Появилась встроенная в операционную систему консоль управления ММС (Microsoft Management Console), с помощью которой можно из одной точки управлять большинством логических и физических компонентов компьютерной сети, построенной на основе Windows. В свою очередь, это стало возможным именно благодаря применению технологии WMI, которая, во- первых, делает доступ к информации о самых различных компонентах информационной системы (журнал событий, системный реестр, подсистема производительности, драйверы устройств и т. д.) независимым от типа этих компонентов, а во-вторых, осуществляет управление любой подсистемой стандартным, не зависящим от реализации этой подсистемы, методом. Итак, технология WMI — это глобальная концепция настройки, управления и слежения за работой различных частей корпоративной компьютерной сети. В частности, используя WMI, можно с помощью специальных утилит или сценариев Windows Script Host (WSH) решать следующие задачи. Управление различными версиями операционной системы Windows. С помощью сценариев WMI можно обращаться к системным счетчикам производительности, анализировать журналы событий (Event Logs), работать с файловой системой, установленными принтерами, управлять запущенными процессами и сервисами, просматривать и изменять настройки реестра, создавать и удалять совместно используемые ресурсы и т. д. При этом все операции можно выполнять одинаковым образом как на локальной, так и на удаленной машине. Управление ресурсами и службами сети. Сценарии WMI позволяют настраивать сетевые службы (DNS, DHCP и т. п.) и управлять сетевыми устройствами, поддерживающими технологию SNMP (Simple Network Management Protocol). Мониторинг состояния системы в реальном времени. Можно создавать сценарии-обработчики событий WMI, которые позволяют отслеживать и нужным образом обрабатывать события, связанные с теми или иными изменениями в информационной системе (например, появление определенной записи в журнале событий на локальном или удаленном компьютере, заполнение жесткого диска сервера до определенного предела, изменение определенного ключа в системном реестре и т. п.). Управление серверными приложениями Windows. С помощью WMI можно управлять различными приложениями Microsoft: Application Center, Operations Manager, Systems Management Server, Internet Information Server, Exchange Server, SQL Server.
Установка WMI В операционных системах Windows Me/2000/XP и Windows Server 2003 никакой дополнительной установки WMI не требуется, здесь уже функционирует ядро WMI версии 1.5. Если же требуется использовать WMI на компьютерах с Windows 9jc/NT, to необходимо сначала обновить здесь ядро WMI до версии 1.5; необходимый для этого инсталяционный файл wmicore.exe можно свободно скачать с сервера Microsoft (http://download.microsoft.com/ download/platformsdk/wmicore/1.5/W9XNT4/EN-US/wmicore.exe). Общая структура WMI Архитектура WMI состоит из трех частей, показанных на рис. 1.1. 1. Управляемые объекты/ресурсы (managed resources) — любые логические или физические компоненты информационной системы, доступ к которым может быть получен с помощью WM1. В качестве управляемых ресурсов могут выступать, например, файлы на жестком диске, запущенный экземпляр приложения, системное событие, предоставленный в общее пользование ресурс, сетевой пакет или установленный в компьютере процессор. 2. Ядро WMI (WMI infrastructure). Это связующее звено архитектуры WMI, отвечающее за связь управляющих программ с управляемыми объектами. Ядро WMI, в свою очередь, можно разделить на три части: менеджер объектов CIM (Common Information Model Object Manager, CIMOM), peno- зшпорий (хранилище классов и объектов) CIM и провайдеры WML Кроме этого, для доступа к WMI с помощью сценариев необходима специальная библиотека поддержки сценариев WMI (WMI scripting library), которая располагается в файле wbeindisp.dll в каталоге %SystemRoot%\System32\ Wbem (в Windows Server 2003, Windows XP, Windows 2000 и Windows NT) или в каталоге %WinDir%\System\Wbem (в Windows Me и Windows 9x). 3. Управляющие программы (management applications), которые являются потребителями сервисов WMI. В качестве потребителей могут выступать полновесные Win32-пpилoжeния, Web-приложения, сценарии WSH или другие инструменты администрирования, с помощью которых происходит доступ к управляемым объектам посредством WMI. Отметим, что управляющие программы (потребители) различных типов применяют разные механизмы для доступа к WMI, т. е. используют разные интерфейсы прикладного программирования (Application Programming Interface, API). Программы Win32 могут взаимодействовать с WMI напрямую, используя для этого WMI COM API — главный API управления. ActiveX-компоненты WMI реализуют API другого уровня: разработчики Web-приложений применяют средства управления ActiveX для создания
сетевых интерфейсов к данным WMI. Еще один способ управления WMI предполагает использование сценариев WSH с помощью специального API WMI для сценариев (такие сценарии мы иногда будем называть просто сценариями WMI). Рис. 1.1. Архитектура WMI
Ядро WMI составляют провайдеры WMI, менеджер объектов CIM и репози- торий CIM. Рассмотрим эти компоненты более подробно. Провайдеры WMI Провайдеры WMI обеспечивают связь между менеджером объектов CIM и управляемыми ресурсами: провайдеры предоставляют для CIMOM данные об управляемом объекте, обрабатывают запросы от управляющих программ и генерируют сообщения о наступлении определенных событий (см. рис. 1.1). При этом провайдер WMI общается с управляемым объектом с помощью специфического API этого объекта, а с ОМОМ — посредством стандартного интерфейса прикладного программирования WMI (WMI API). Таким образом, провайдеры скрывают детали внутренней реализации управляемых объектов, позволяя CIMOM обращаться к этим объектам единообразно, используя один и тот же WMI API. Фактически провайдеры WMI являются серверами СОМ или DCOM, которые представлены динамическими библиотеками (DLL), находящимися чаще всего в каталоге %SystemRoot%\System32\Wbem. WMI включает в себя множество встроенных (стандартных) провайдеров для операционных систем Windows 2000, Windows XP и Windows Server 2003, которые предназначены для получения данных из известных системных источников таких, как подсистема Win32, журналы событий, системный реестр, системные счетчики производительности. В табл. 1.1 приведено описание некоторых стандартных провайдеров, которые присутствуют во всех ранее перечисленных операционных системах. Таблица 1.1. Некоторые стандартные провайдеры WMI Провайдер DLL-файл Описание Провайдер каталога Dsprov.dll Active Directory (Active Directory provider) Провайдер журнала Ntevt.dll событий (Event Log provider) Позволяет обращаться к объектам Active Directory как к объектам WMI Обеспечивает управление журналом событий (выборка по определенному критерию записей для чтения, создание резервных копий и очистка журнала, изменение настроек и т. д.). Также этот провайдер позволяет обрабатывать события, генерируемые журналом (например, добавление в журнал записи определенного типа) Ядpo WMI
Таблица 1.1 (окончание) Провайдер DLL-файл Описание Провайдер системных счетчиков производительности (Perfomance Counter provider) Провайдер реестра (Registry provider) Провайдер SNMP- устройств (SNMP provider) Провайдер драйверов устройств (WDM provider) Провайдер подсистемы Win32 (Win32 provider) Провайдер инсталлированных программных продуктов (Windows Installer provider) Wbemperf.dll Обеспечивает доступ к счетчикам производительности, т. е. к данным, позволяющим численно оценивать производительность системы Stdprov.dll Позволяет читать данные из реестра, создавать и модифицировать там ключи и разделы. Кроме этого, провайдер обеспечивает генерацию события WMI при изменении определенного ключа или ветви реестра Snmpincl.dll Является шлюзом для доступа к системам и устройствам, которые управляются с помощью протокола SNMP (Simple Network Management Protocol) Wmiprov.dll Позволяет получить доступ к информации низкого уровня о драйверах устройств Windows Driver Model (WDM); в качестве таких устройств могут выступать, например, порты ввода/вывода или сетевые платы Cimwin32.dll Обеспечивает доступ к информации о компьютере, операционной системе, подсистеме безопасности, дисках, периферийных устройствах, файловых системах, файлах, папках, сетевых ресурсах, принтерах, процессах, сервисах и т. п. Msiprov.dll Позволяет получить информацию об инсталлированном программном обеспечении Технология WMI позволяет также создавать и устанавливать провайдеры сторонних поставщиков, с помощью которых можно будет, скажем, через WMI получать информацию о каких-то специфических устройствах или службах. Отметим, что свои провайдеры WMI имеются в таких продуктах Microsoft, как Application Center, Operations Manager, Systems Management Server, Internet Information Server, Exchange Server, SQL Server.
Менеджер объектов CIM Задачей менеджера объектов CIM (CIMOM) является обеспечение взаимодействия между потребителями сервисов WMI (управляющими приложениями) и провайдерами WMI (см. рис. l.l). CIMOM обрабатывает все запросы, которые поступают от управляющих приложений к WMI, и обеспечивает доставку к этим приложениям информации, полученной в результате выполнения таких запросов. Детальное описание функций CIMOM приведено далее. □ Регистрация провайдеров. Все провайдеры WMI должны быть зарегистрированы с помощью CIMOM; информация о провайдере (например, тип этого провайдера или путь к библиотеке DLL, которой он представлен) хранится в репозитории CIM. □ Переадресация запросов. Используя информацию о зарегистрированных провайдерах, CIMOM перенаправляет полученный от управляющего приложения запрос к нужному провайдеру. □ Доступ к удаленной машине с WMI. Управляющее приложение может обратиться с запросом к любой удаленной машине, на которой установлен WMI. При этом происходит соединение с CIMOM на удаленной машине, после чего все запросы здесь должны обрабатываться точно так же, как и на локальной машине. □ Обеспечение безопасности. Защита ресурсов WMI состоит в том, что CIMOM проверяет права пользователя, который пытается воспользоваться сервисами WMI на локальном или удаленном компьютере. □ Обработка запросов управляющих приложений. Потребители WMI обращаются к управляемым объектам с помощью специального языка запросов WMI Query Language (WQL). Если провайдер запрашиваемого объекта не поддерживает напрямую WQL, то CIMOM должен преобразовать этот запрос к тому виду, в котором он сможет быть обработан этим провайдером. □ Обработка событий WML Поддержка CIMOM этой функции позволяет потребителям WMI создавать обработчики событий, которые возникают при определенном изменении в управляемом объекте (примеры таких событий — снижение объема свободного пространства на жестком диске до заданного значения или запуск на компьютере определенного приложения). Для этого CIMOM периодически опрашивает нужный объект (интервал опроса задается в управляющем приложении) и генерирует событие, как только обнаруживает, что заданное заранее условие возникновения события выполнено. В Windows функциональность менеджера CIM обеспечивает файл winmgmt.exe, который находится в каталоге %SystemRoot%\System32\Wbem (в Windows Server 2003, Windows XP, Windows 2000 и Windows NT) или
%WinDir%\System\Wbem (в Windows Me и Windows 9x). При этом в Windows Server 2003, Windows XP, Windows 2000 и Windows NT этот файл запускается как сервис, а в Windows Me и Windows 9x приложение winmgmt.exe функционирует как стандартный исполняемый процесс. Репозиторий CIM. Пространства имен Повторим еще раз, что основной идеей, на которой базируется WMI, является возможность представить информацию о состоянии любого управляемого объекта в виде стандартной схемы. В качестве такой схемы выступает информационная модель CIM, которая является репозиторием (хранилищем) объектов и классов, моделирующих различные компоненты компьютерной системы. Таким образом, CIM можно считать хранилищем классов, где класс — это модель (шаблон) управляемого объекта (напомним, что в качестве управляемых объектов могут выступать самые различные логические и физические компоненты компьютерной системы: жесткие диски, журналы событий, сетевые карты, файлы и папки, процессы, сервисы, процессоры и т. д.). С этой точки зрения CIM похожа на другие каталоги, которые используются в Windows (например, каталог файловой системы содержит объекты-файлы и объекты-папки, а каталог Active Directory — объекты-домены, объекты- пользователи, объекты-принтеры и т. д.). Однако важной особенностью CIM является то, что хранящиеся в ней классы чаще всего соответствуют динамически изменяемым ресурсам, поэтому объекты-экземпляры таких классов не хранятся постоянно в CIM, а создаются провайдером по запросу потребителя WMI. Связано это с тем, что состояние большинства WMI- совместимых устройств меняется очень быстро и постоянное обновление информации в CIM может значительно снизить общую производительность системы. Замечание Количество классов, имеющихся в CIM, сильно зависит от версии операционной системы. Например, в Windows Server 2003 в CIM хранится около 5 000 классов. Классы, составляющие CIM, имеют свойства и методы и находятся в иерархической зависимости друг от друга — классы-потомки могут наследовать или переопределять свойства родительских классов, а также добавлять собственные свойства. Свойства описывают конфигурацию и текущее состояние управляемого ресурса, а методы позволяют выполнить над этим ресурсом определенные действия. Классы CIM группируются в пространства имен (namespaces), которые упорядочены иерархически (корневое пространство имен обозначается через
Root). Пространство имен — это группа логически связанных друг с другом классов, которые относятся к какой-либо определенной технологии или области управления. Например, одно из наиболее часто используемых на практике пространств имен cimv2 содержит классы, которые описывают компьютер и операционную систему; описание некоторых классов из этого пространства имен приведено в табл. 1.2. Таблица 1.2. Некоторые классы из пространства имен Root\ciMV2 Класс Описание Win32_BaseBoard Win32_Bus Win32_Processor Win32_DiskPartition Win32_FloppyDrive Win3 2_Keyboard Win32_BIOS Win32_OperatingSystem CIM DataFile Описывает системную (материнскую) плату. С помощью экземпляра этого класса можно, например, узнать серийный номер материнской платы Описывает физические шины (например, шины PCI или USB) с точки зрения операционной системы Win32 Представляет процессоры, т. е. устройства, способные обрабатывать наборы машинных команд в системе Win32. В мультипроцессорной системе для каждого из процессоров существует отдельный экземпляр этого класса Позволяет получать информацию об имеющихся в системе разделах жестких дисков. Для каждого из разделов создается свой экземпляр этого класса Описывает имеющиеся в системе дисководы гибких дисков. Для каждого из дисководов создается свой экземпляр этого класса Описывает подключенную к компьютеру клавиатуру (например, отражаются количество функциональных клавиш или используемая раскладка) Свойства этого класса представляют атрибуты базовой системы ввода/вывода (BIOS): компания- производитель, версия, номер сборки и т. д. Описывает установленную на компьютере операционную систему. В свойствах экземпляра этого класса хранятся номер сборки системы, используемая по умолчанию кодовая страница, время последней перезагрузки, число пользовательских лицензий и т. д. Экземпляры этого класса соответствуют логическим файлам. Кроме свойств, описывающих различные атрибуты файла, в классе ciM_DataFile имеются методы, которые позволяют производить над файлом некоторые действия (копировать, перемещать, переименовывать или удалять его, изменять разрешения на файл и т. д.)
Таблица 1.2 (окончание) Класс Описание Win32_Directory Win32_Desktop Win32_Share Win32_Service Win32_Process Экземпляры этого класса соответствуют каталогам файловой системы. Свойства и методы класса win3 2_Directory практически совпадают со свойствами и методами класса ClM_DataFile В свойствах экземпляров класса win3 2__Desktop хранятся характеристики рабочих столов пользователей: частота мигания курсора, имя исполняемого файла заставки, частота вызова заставки, имя файла с рисунком рабочего стола и т. д. Экземпляры этого класса соответствуют общим ресурсам, имеющимся в системе (общие папки, принтеры, именованные каналы и т. д.) Экземпляры данного класса позволяют получать информацию о службах (services) операционной системы Win32 и управлять ими (запускать, останавливать и т. д.) Каждому запущенному в системе процессу соответствует экземпляр класса win3 2_Process. Свойства этого класса позволяют получить полную информацию о процессе (имя, идентификатор, время создания, приоритет и т. д.), ас помощью методов данного класса можно создавать новые процессы, менять приоритеты, завершать процессы и т. д Количество и содержимое пространств имен зависит от операционной системы, а также от используемой версии WMI и установленных в системе приложений. Отметим при этом, что в любом варианте установки WMI имеются четыре предопределенных пространства имен, которые всегда находятся на один уровень ниже корневого пространства имен: cimv2, Default, security и wmi. Для примера на рис. 1.2 показана структура пространств имен, хранящихся в CIM, для Windows XP. Некоторые пространства имен содержат другие пространства. Например, в cimv2 определены подпространства имен Applications и ms_409 (см. рис. 1.2). В операционных системах Windows Server 2003 и Windows XP репозиторий CIM физически располагается в четырех файлах каталога %System- Root%\System32\Wbem\ Repository\FS: П index.btr (индексный файл); П objects.data (репозиторий CIM, в котором хранятся описания управляемых ресурсов); П index.map и object.map (файлы контроля над транзакциями).
Рис. 1.2. Структура пространств имен CIM в Windows XP В более ранних версиях Windows CIM представлена одним файлом cim.rep, который в случае Windows 2000/NT находится в каталоге %SystemRootr%\ System32\Wbem\Repository, а в случае Windows 9x/Mz — в каталоге %WinDir%\ System\Wbem\ Repository. Путь к классам и объектам CIM Все классы внутри одного пространства имен должны иметь уникальные имена (при этом имена классов из разных пространств могут совпадать), причем класс в одном пространстве имен не может иметь предка или потомка из другого пространству. Для идентификации классов и объектов внутри пространства имен в ОЭД нужно задавать путь к этим классам и объектам (object path), аналогично тому, как это делается, например, в пространства имен файловой системы. Напомним, что любой файл на диске однозначно определяется полным путем к нему следующим образом: нужно указать имя устройства, после которого следуют одно или несколько имен каталогов и непосредственно имя файла. Другими словами, в файловой системе используется иерархическая структура каталогов и файлов различной степени вложенности. В отличие от этого, у пространств имен CIM имеется только один уровень в глубину, а для идентификации объекта задействуются свойства объектов, которые рассматриваются как ключи. Другими словами, каждый экземпляр класса должен быть однозначно идентифицируемым по своим ключевым параметрам. Полный путь к хранящемуся в CIM классу или объекту-экземпляру класса (управляемому устройству) имеет следующую структуру: С \ \СотриterName] [ \Namespace] [ iClassName] [ . KeyPropertyl-Valuel [, KeyProperty2=Value2...] ] Здесь wcomputerName — это сетевое имя компьютера, на котором расположен нужный класс или объект (для задания имени локального компьютера
можно использовать символ "."), \Namespace — название пространства имен, в котором находится этот класс или объект, -.ciassName — имя класса. Параметры KeyPropertyl И Valuel, KeyProperty2 И Value2, задают СПИСОК ключевых пар (свойство-значение) объекта. Например, следующий путь \\.\CIMV2:Win32_Process.Name="Notepad.exe" определяет процесс (экземпляр класса win32_Process из пространства имен cimv2) с именем "Notepad.exe", который запущен на локальной машине. Другой пример — построение пути к объекту WMI, соответствующему десятой записи в журнале событий приложений на компьютере с именем \\CPU3. В WMI для представления записей в журнале событий строятся объекты-экземпляры класса win32_NTLogEvent. Этот класс хранится в пространстве имен cimv2, а для идентификации конкретного экземпляра класса win32_NTLogEvent используются два ключевых свойства символьного типа: LogFile (ТИП Журнала СОбыТИЙ) И RecordNumber (сиМВОЛЬНОе представление порядкового номера записи в журнале). Поэтому полный путь к объекту в нашем примере будет иметь следующий вид: \\CPU3\CIMV2:Win3 2_NTLogEvent.LogFile="Application",RecordNumber="1" Структура классов WMI Напомним, что всякому ресурсу, управляемому с помощью WMI, соответствует специальный класс WMI; каждый класс имеет четко определенную структуру и содержит свойства, методы и квалификаторы (свои квалифика- торы могут быть также у свойств и методов). Классы описываются с помощью специального языка MOF (Managed Object Format), который, в свою очередь, базируется на языке IDL (Interface Definition Language), применяемом для описания интерфейсов СОМ-объектов. После определения структуры класса с помощью MOF разработчик может добавить откомпилированное представление этого класса в репозиторий CIM с помощью стандартной утилиты mofcomp.exe. Подробнее понятия свойств, методов и квалификаторов будут обсуждаться далее, а начнем мы с типизации классов CIM. Основные типы классов CIM В CIM существует три основных типа классов, различающихся между собой по способу хранения информации об управляемых ресурсах. □ Абстрактный класс (abstract class) — это шаблон, который служит исключительно для образования новых классов-потомков (абстрактных и неабстрактных). Абстрактный класс не может непосредственно использоваться для получения экземпляра управляемого ресурса.
Статический класс (static class) определяет данные, которые физически хранятся в репозитории CIM (к такому типу относятся, например, данные о собственных настройках WMI). Вследствие этого для доступа к экземплярам статических классов не нужно прибегать к помощи каких- либо провайдеров. Динамический класс (dynamic class) моделирует управляемый ресурс, данные о котором соответствующий провайдер возвращает в динамическом режиме. Кроме трех основных типов классов в CIM выделяется еще один специальный тип — ассоциативный класс (association class) — это абстрактный, статический или динамический класс, который описывает логическую связь между двумя классами или управляемыми ресурсами (например, ассоциативный класс win32_systemProcesses связывает класс win32_Process, экземпляры которого соответствуют запущенным в системе процессам, с классом win32_computerSystem, в котором представлены общие настройки компьютерной системы). Кроме этого, все классы CIM можно разделить на четыре группы по принадлежности к различным информационным моделям. Системные классы. Системными называются те классы, которые служат для задания конфигурации и выполнения внутренних функций WMI (определение пространств имен, обеспечение безопасности при работе с пространствами имен, регистрация провайдеров, подписка на события WMI и формирование сообщений о наступлении таких событий). Системные классы могут быть абстрактными или статическими. Системные классы можно легко отличить от других по названию — имена всех системных классов начинаются с символов " " (двойное подчеркивание), например, SystemClass, NAMESPACE, Provider ИЛИ Win32Provider. Классы модели ядра (основной модели) (core model). К этой модели относятся абстрактные классы, которые обеспечивают интерфейс со всеми областями управления. Названия таких классов начинаются с префикса "ciM_". Примерами классов модели ядра могут служить класс cim_ ManagedSystemEiement (свойства этого класса идентифицируют управляемые КОМПОНеНТЫ СИСТеМЫ) И его наследники CIM_LogicalElement (описание логического управляемого ресурса, например, файла или каталога) и ciM_physicaiEiement (описание физического управляемого ресурса, например, периферийного устройства). Классы общей модели (common model). Общая модель является расширением основной модели — здесь представлены классы, которые являются специфическими для задач управления, но не зависят от конкретной технологии или реализации (другими словами, не зависят от типа операционной системы). Названия таких классов, как и классов модели ядра, начинаются с "cim_". Класс ciM_LogicaiFiie (наследник класса
ciM_LogicalElement), описывающий файл, является примером класса общей модели, т. к. файловая система присутствует практически в любой операционной системе. Классы модели расширения (extension model). Эта категория классов включает в себя специфические для каждой технологии или реализации дополнения к общей модели. В WMI определено большое количество классов, которые соответствуют ресурсам, специфическим для среды Win32 (имена этих классов начинаются с префикса "win32_"). Например, Классы Win32_PageFile И Win32_ShortCutFile, КОТОрые ОПИСЫВаЮТ соответственно файлы подкачки Windows и файлы-ярлыки, являются потомками класса ciM_LogicalFiie из общей модели. Так как класс в одном пространстве имен не может иметь предка или потомка из другого пространства, то в различных пространствах имен находятся одни и те же классы из модели ядра и общей модели. Свойства классов WMI Свойства классов используются для однозначной идентификации экземпляра класса, представляющего конкретный управляемый ресурс, а также для описания текущего состояния этого ресурса. Рассмотрим два простых примера — классы из пространства имен cimv2, являющиеся шаблонами для служб и процессов Windows. Напомним, что для просмотра списка всех служб, установленных на компьютере, можно воспользоваться оснасткой Службы (Services) консоли управления ММС (рис. 1.3). Параметры определенной службы можно просматривать и изменять с помощью диалогового окна с несколькими вкладками, которое появляется после выбора этой службы в правом окне консоли (рис. 1.4). Службам Windows в WMI соответствуют экземпляры класса win32_service; основные свойства этого класса приведены в табл. 1.3. Таблица 1.3. Некоторые свойства класса win32_service Свойство Описание AcceptPause Свойство логического типа, значение которого равно True, если службу можно приостановить, и равно False в противном случае Acceptstop Свойство логического типа, значение которого равно True, если службу можно остановить, и равно False в противном случае Замечание
Рис. 1.3. Службы, зарегистрированные на локальном компьютере Рис. 1.4. Параметры службы Журнал событий (Event Log)
Таблица 1.3 (окончание) Свойство Описание Caption Description Desktoplnteract DisplayName ErrorControl Name PathName Processld ServiceType Started StartMode StartName State WaitHint Краткое описание службы Полное описание службы Свойство логического типа, значение которого равно True, если служба может взаимодействовать с рабочим столом пользователей, и равно False в противном случае Имя службы, которое выводится в списке служб Строка, задающая действие программы загрузки, которое будет выполнено в случае возникновения сбоя при запуске службы во время загрузки операционной системы: ignore— пользователю не будет выведено никаких сообщений о сбое, Normal — будет выведено сообщение о сбое при запуске службы, Critical — система попытается автоматически произвести перезагрузку в хорошей конфигурации, Unknown— действие для подобного типа ошибок не определено Имя службы Полный путь к бинарному файлу, соответствующему службе Уникальный идентификатор службы Строка, описывающая тип службы: Kernel Driver, File System Driver, Adapter, Recognizer Driver, Own Process, Share Process, Interactive Process Свойство логического типа, значение которого равно True, если служба была запущена, и равно False в противном случае Строка, описывающая способ загрузки службы: Boot (применяется только при загрузке служб для драйверов), System (применяется только при загрузке служб для драйверов), Auto (служба загружается автоматически), Manual (служба может быть запущена вручную), Disabled (службу запустить нельзя) Учетная запись, от имени которой запускается служба Текущее состояние службы: stopped (остановлена), Start Pending (стартует), Stop Pending (останавливается), Running (запущена), Continue Pending (возвращается в активное состояние), Pause Pending (приостанавливается), Paused (приостановлена), Unknown (состояние службы определить не удалось) Примерное время (в миллисекундах), необходимое для выполнения операций приостановки, остановки или запуска службы
Как мы видим, многие свойства класса win32_service соответствуют элементам ввода в диалоговом окне свойств службы. Например, для экземпляра класса win32_service, который представляет службу Журнал событий (Event Viewer), СВОЙСТВа Name, DisplayName, Description И StartMode равны Соответственно Eventlog, Журнал событий, Обеспечивает поддержку сообщений журналов событий, выдаваемых Windows-программами и компонентами системы, и просмотр этих сообщений. Эта служба не может быть остановлена И Авто (СМ. рИС. 1.4). Рассмотрим теперь класс win32_Process, экземпляры которого соответствуют запущенным в операционной системе процессам. Напомним, что информацию о всех процессах можно получить с помощью Диспетчера задач (Task Manager), запускаемого нажатием клавиш <Ctrl>+<Alt>+<Del> (рис. 1.5). Рис. 1.5. Процессы, запущенные на локальном компьютере Количество выводимых на экран параметров для процессов зависит от настроек Диспетчера задач (Task Manager): выбрав в меню Вид (View) пункт Выбрать столбцы (Choose columns), можно отметить интересующие нас параметры (рис. 1.6).
Рис. 1.6. Настройка выводимых параметров для процессов Параметрам запущенного процесса соответствуют свойства класса win32_ Process; некоторые из этих свойств приведены в табл. 1.4. Таблица 1.4. Некоторые свойства класса win32_Process Свойство Описание Caption Короткое текстовое описание процесса CommandLine Командная строка, используемая для запуска процесса CreationDate Время начала выполнения процесса Description Полное описание процесса ExecutablePath Полный путь к исполняемому файлу процесса HandleCount Общее количество дескрипторов, открытых в настоящее время процессом (равно общему количеству дескрипторов, открытых каждым потоком в процессе) MaximumWorkingSetsize Максимально возможный размер рабочего набора процесса (рабочий набор процесса — это набор страниц, доступных процессу в физической оперативной памяти) MinimumWorkingSetsize Минимально возможный размер рабочего набора процесса Name Имя процесса
Таблица 1.4 (окончание) Свойство Описание OtherOperationCount OtherTransferCount PageFileUsage ParentProcess ID PeakPageFileUsage PeakVirtualSize PeakWorkingSetSize Priority ProcessID ReadOpera t i onCoun t ReadTrans ferCount ThreadCount VirtualSize WorkingSetSize WriteOperationCount WriteTransferCount Число выполненных операций ввода/вывода, отличных от операции чтения или записи Размер данных, переданных в процессе выполнения операций, отличных от операции чтения или записи Размер части файла подкачки, которая используется процессом в настоящее время Уникальный идентификатор родительского процесса, создавшего данный процесс Максимальный размер части файла подкачки, которая использовалась процессом за все время его работы Максимальное значение размера виртуального адресного пространства, которое использовалось процессом единовременно Максимальное значение размера рабочего набора процесса за все время работы Приоритет процесса (минимальному приоритету соответствует значение 0, максимальному — 31) Уникальный идентификатор процесса. Значение этого свойства актуально с момента создания процесса до окончания его работы Число выполненных процессом операций чтения Размер прочитанных данных Число активных потоков в процессе Текущий размер виртуального адресного пространства в байтах, используемого процессом Размер памяти в байтах, необходимый для успешного выполнения процесса в операционной системе, использующей страничную организацию памяти Число выполненных процессом операций записи Размер записанных данных Отметим, что в основном в WMI свойства классов доступны только для чтения, однако значения определенных свойств в экземплярах некоторых классов можно изменять напрямую (для этого применяется специальный метод Put_o). Например, в экземплярах класса win32_LogicalDisk, которые соответствуют логическим дискам, можно изменять свойство voiumeName, где хранится метка соответствующего диска.
Замечание Количество свойств, значения которых можно изменять, зависит от операционной системы. Например, в Windows 2000 для записи доступны только 39 свойств, а в Windows XP — 145 свойств. Для того чтобы узнать, является ли определенное свойство доступным для записи, нужно проверить значение квалификатора write этого свойства (подробнее это будет описано далее). Наконец, значения некоторых свойств неявно изменяются при вызове определенных методов класса (подробнее это описано далее). Методы классов WMI Методы класса позволяют выполнять те или иные действия над управляемым ресурсом, которому соответствует этот класс (так как не над каждым ресурсом можно производить какие-либо операции, то не у всякого класса есть методы). В табл. 1.5 и 1.6 описаны, например, методы, которые имеются у классов win32_service (службы Windows) и win32_process (процессы Windows). Таблица 1.5. Методы класса win32_service Метод Описание StartServiceO StopService() PauseService() ResumeService() UserControlService(л) Create (Name, DisplayName, PathName, ServiceType, ErrorControl, StartMode, Desktoplnteract, StartName, StartPassword, LoadOrderGroup, LoadOrderGroupDependencies, ServiceDependencies) Change (Di spl ayName, Pa thName, ServiceType, ErrorControl, StartMode, Desktoplnteract, StartName, StartPassword, LoadOrderGroup, LoadOrderGroupDependencies, ServiceDependencies) Запускает службу Останавливает службу Приостанавливает службу Возобновляет работу службы Посылает службе заданный пользователем код п (число от 128 до 255) Создает службу Изменяет параметры службы
Таблица 1.5 (окончание) Метод Описание ChangeStartMode(StartMode) Deleted Изменяет тип загрузки службы. Символьный параметр StartMode может принимать следующие значения: Boot (применяется только при загрузке служб для драйверов), System (применяется только при загрузке служб для драйверов), Auto (служба загружается автоматически), Manual (служба может быть запущена вручную), Disabled (службу запустить нельзя) Удаляет существующую службу Таким образом, методы класса win32_service позволяют изменять значения некоторых свойств этого класса и выполнять манипуляции над конкретной службой: запускать ее, приостанавливать, останавливать и т. д. Перейдем к рассмотрению методов класса win32_Process, которые описаны в табл. 1.6. Таблица 1.6. Методы класса win32_Process Метод Описание AttachDebugger() \ Create(CommandLine, CurrentDirectory, ProcessStartuplnformat ion, Processld) GetOwner(User,Domain) GetOwnerSid(Sid) SetPriority(Priority) Запускает отладчик, установленный в системе по умолчанию, для отладки процесса Создает новый не интерактивный процесс После выполнения этого метода в переменной User будет записано имя пользователя, создавшего процесс (владельца процесса), а в переменной Domain— имя домена, в котором запущен этот процесс Позволяет получить в переменной Sid идентификатор безопасности (Security IDentifier, SID) владельца процесса Устанавливает приоритет процесса. Числовой параметр Priority определяет требуемый приоритет и может принимать следующие значения: 64 (низкий), 16 384 (ниже среднего), 32 (средний), 32 768 (выше среднего), 128 (высокий), 256 (процесс выполняется в реальном времени)
Таблица 1.6 (окончание) Метод Описание Terminate{Reason) Завершает процесс и все его потоки. Числовой параметр Reason задает код выхода, который будет сообщен операционной системе после завершения процесса Таким образом, методы класса win3 2_Process позволяют выполнять над процессами те же действия, которые можно осуществить в Диспетчере задач Windows с помощью контекстного меню, появляющегося после щелчка правой кнопкой мыши над выделенным процессом в списке (см. рис. 1.7), и кнопки Завершить процесс (Terminate process). Рис. 1.7. Контекстное меню, позволяющее выполнять действия над определенным процессом Квалификаторы классов, свойств и методов В WMI для классов, свойств и методов можно задать так называемые квалификаторы (qualifiers). Квалификаторы содержат дополнительную информацию о том классе, свойстве или методе, в котором они определены.
Квалификаторы классов Квалификаторы классов предоставляют информацию о классе в целом. Например, тип класса описывает квалификаторы логического типа cim_boolean с именами abstract (абстрактный класс), dynamic (динамиче- ский класс) и association (ассоциативный класс). Один и тот же класс в различных операционных системах может иметь разное количество квалификаторов (версия WMI, поставляемая с Windows XP, соответствует спецификации CIM 2.5, а версии WMI в Windows 2000 и ниже — спецификации CIM 2.0). Для примера в табл. 1.7 приведено описание квалификаторов для класса win32_service в Windows XP. Таблица 1.7. Квалификаторы класса win32_service Квалификатор Тип Значение Описание Dynamic CIM_BOOLEAN True Locale CIM_SINT32 1033 Provider CIM_STRING CIMWin32 SupportsUpdate CIM_BOOLEAN True UUID CIM_^TRING {8502C4D9-5FBB \ 11D2-AAC1- 006008C78BC7} Класс win32_Process позволяет создавать новые процессы и завершать уже существующие, поэтому в данном классе появляется несколько новых квалификаторов (табл. 1.8). Таблица 1.8. Квалификаторы класса win32_Process Квалификатор Тип Значение Описание CreateBy CIM_STRING Create Название метода, при помощи которого создается экземпляр класса DeleteBy CIM_STRING Deletelnstance Название метода, при помощи которого уничтожается экземпляр класса Тип класса Язык по умолчанию для класса или экземпляра класса Имя провайдера класса Указывает на то, что класс поддерживает операцию изменения (обновления) экземпляров Универсальный уникальный идентификатор класса
Квалификатор Тип Значение Описание Dynamic CIM_BOOLEAN True Тип класса Locale CIM.SINT32 1033 Язык по умолчанию для класса или экземпляра класса Provider CIM_STRING CIMWin32 Имя провайдера класса SupportsCreate ClM_BOOLEAN True Указывает на то, что класс поддерживает операцию создания экземпляров SupportsDelete CIM_BOOLEAN True Указывает на то, что класс поддерживает операцию уничтожения экземпляров uuid cim_string {8502C4DC- Универсальный уни- 5FBB-11D2- кальный идентифика- ААС1~ тор класса 006008С78ВС7} Квалификаторы свойств Квалификаторы свойств позволяют определить тип данного свойства (квалификатор ciMType), доступность его для чтения (квалификатор Read) и записи (квалификатор write) и т. п. Для примера в табл. 1.9 приведено описание КВалификаТОроВ СВОЙСТВа ServiceType Класса Win3 2_Service (напомним, что это свойство описывает тип службы). Таблица 1.9. Квалификаторы свойства ServiceType класса win32_service Квалификатор Тип Значение Описание CIMType Mappingstrings CIM_STRING CIM_STRING | CIM_FLAG_ARRAY Read CIM_BOOLEAN String Win32APl| Service Structures| QUERY_SERVICE_ CONFIG| dwServiceType True Тип свойства Множество значений (ключевых слов), по которым можно найти дополнительную информацию о данном свойстве Указывает на то, что свойство доступно для чтения Таблица 1.8 (окончание)
Таблица 1.9 (окончание) Квалификатор Тип Значение Описание ValueMap CIM_STRING | СIM_FLAG_ARRAY Kernel Driver, File System Driver, Adapter, Recognizer Driver, Own Process, Share Process, Interactive Process Набор допустимых значений для свойства Замечание Напрямую с помощью метода Put_() можно изменять значения только тех свойств, у которых имеется квалификатор write со значением true. Квалификаторы методов Квалификаторы методов могут описывать множество допустимых значений, которые будут возвращаться методом (квалификатор ValueMap), указывать права, которыми необходимо обладать для вызова метода (квалификатор Privileges) и т. п. Для призера в табл. 1.10 приведено описание квалифи- каторов метода create классе win32_Process (напомним, что этот метод используется для запуска в системе нового процесса). Таблица 1.10. Квалификаторы метода create класса win32_Process Квалификатор Тип Значение Описание Constructor CIM_BOOLEAN Implemented CIM_BOOLEAN MappingStrings CIM_STRING CIM FLAG ARRAY True True Win32API| Process and Thread Functions| CreateProcess Указывает на то, что данный метод используется для создания экземпляров класса Указывает на то, что данный метод реализован в провайдере Множество значений (ключевых слов), по которым можно найти дополнительную информацию о данном методе
Таблица 1.10 (окончание) Квалификатор Тип Значение Описание Privileges CIM_STRING CIM_FLAG_ARRAY Static ValueMap CIM_BOOLEAN CIM_STRING CIM_FLAG_ARRAY SeAssign- PrimaryToken- Privilege, Selncrease- QuotaPrivilege True 0, 2, 3, 21, . . Перечисляет права, необходимые для выполнения данного метода Указывает на то, что данный метод не может быть вызван из экземпляра класса Набор возвращаемых данным методом значений Замечание Выполнять можно только те методы, у которых имеется квалификатор Implemented со значением True. События WMI Одной из наиболее мощных возможностей WMI является так называемая подписка на извещения о событиях WMI, т. е. создание собственных обработчиков определенных событий WMI. При этом под событием WMI понимается какое-либо изменение в состоянии логического или физического компонента информационной системы, доступ к которому может быть получен с помощью WMI. Приведем несколько простых примеров событий WMI. □ Снижение объема свободного дискового пространства на сервере до заданного значения. Вместо того, чтобы постоянно проверять заполненность жесткого диска на файловом сервере, можно установить подписку на извещение о событии WMI, которое произойдет, скажем, при уменьшении свободного пространства до 10% от общего объема диска. При этом можно, например, автоматически отправить администратору соответст/ вующее сообщение по электронной почте или запустить определенный сценарий WMI для архивирования информации. □ Появление в журнале событий определенного сообщения. В целях повышения безопасности администратор может зарегистрировать событие, которое будет происходить при занесении в журнал событий записи о. неудачной регистрации пользователя. Реакцией на такое событие может служить отсылка сообщения по электронной почте администратору, что позволит оперативно предотвращать попытки несанкционированного доступа.
□ Запуск или завершение работы определенного приложения. Если на сервере выполняется какое-то важное приложение, то может потребоваться статистика о его работе. Зарегистрировав соответствующее событие WMI, можно автоматически записывать в текстовый файл или в журнал операций информацию о том, когда и кем приложение было запущено или остановлено. Используя же в качестве обработчика этих событий сценарий WMI, можно производить запись статистической информации в таблицы базы данных или в электронную таблицу Microsoft Excel. Таким образом, мы видим, что механизм событий позволяет оперативно информировать администратора о различных проблемах (в том числе потенциальных) и автоматически выполнять определенные действия для решения этих проблем. Роль WMI состоит в организации взаимодействия между провайдерами событий (event providers), которые формируют извещения о наступлении определенного события, и зарегистрированными подписчиками на эти извещения (регистрируются подписчики, которые являются потребителями событий (event consumers), также с помощью WMI). События WMI разделяются на три типа (внутренние, внешние и события таймера), каждому из которых в репозитории CIM соответствует определенный класс-потомок абстрактного класса Event. Внешние события представлены классом ExtrinsicEvent, события таймера — классом TimerEvent, а внутренние — тремя разными классами ( NamespaceOperationEvent, ClassOperationEvent И ^nstanceOperationEvent). На рис. 1.8 показана иерархия классов, соответствующих событиям WMI, для пространства имен cimv2. Рис. 1.8. Классы, соответствующие событиям WMI При наступлении какого-либо события WMI автоматически создает экземпляр того класса, которому соответствует это событие. Внутренние события Внутренние события позволяют контролировать изменения в состоянии тех управляемых ресурсов, которые представлены отдельным классом WMI и
хранятся в CIM, а также изменения в структуре самого репозитория С\М — можно получать извещения о создании, изменении и удалении экземпляров классов, а также самих классов и пространств имен. Для администратора операционной системы наибольший практический интерес представляет, конечно, обработка событий, которые связаны с управляемыми ресурсами (таким событиям соответствуют классы, которые порождены ОТ класса InstanceOperationEvent): □ создание нового экземпляра определенного класса (класс InstanceCreationEvent); □ модификация существующего экземпляра класса (класс InstanceModificationEvent); □ удаление Экземпляра класса (класс InstanceDeletionEvent). Для подписки на извещения о наступлении внутреннего события применяются запросы специального вида на языке WQL. Здесь мы пока не будем подробно рассматривать синтаксис таких запросов, а лишь приведем два простых примера. Скажем, для того чтобы получить в сценарии WSH извещение о запуске нового экземпляра Блокнота (notepad.exe), нужно с помощью метода ExecNotificationQuery класса SWbemServices ВЫПОЛНИТЬ следующий Оператор WQL: SELECT * FROM InstanceCreationEvent WITHIN 2 WHERE Targetlnstance ISA 'Win32_Process' AND Targetlnstance.Name='notepad.exe' Для обработки события, связанного с закрытием Блокнота, можно применить такой оператор: SELECT * FROM InstanceDeletionEvent WITHIN 2 WHERE Targetlnstance ISA 'Win32_Process' AND Targetlnstance.Name='notepad.exe' Более подробно подписка на извещения о внутренних событиях и обработка этих событий описаны в главах 2, 5. Внешние события Если возникает необходимость контроля состояния какого-либо объекта, для которого в CIM не предусмотрено отдельного класса, то используются внешние события. Пример такого внешнего события — изменение значения определенного ключа в реестре (в репозитории CIM нет отдельного класса, соответствующего ключу в реестре, поэтому событие является внешним). Для создания внешнего события, в отличие от внутреннего, необходимо, чтобы данное событие поддерживалось соответствующим провайдером Замечание
WMI. В провайдере должен быть объявлен класс, который являлся бы потомком класса ExtrinsicEvent и описывал нужное событие. Например, В Провайдере системного реестра определен объект RegistryKeyChangeEvent, с помощью которого происходит оповещение потребителей событий об изменениях, которые происходят с ключом реестра. Для подписки на извещения о внешнем событии из сценария WSH нужно с помощью метода Ехес- NotificationQueryAsync класса SWbemServices ВЫПОЛНИТЬ асинхронный WQL-запрос специального вида. Например, для того чтобы следить за изменениями ключа Software\\Microsoft\Windows Script Host\TrustPolicy, с помощью которого можно задавать политику безопасности при работе с WSH, используется такой WQL-запрос: SELECT * FROM RegistryKeyChangeEvent WHERE Hive='HKEY_LOCAL_MACHINE' AND KeyPath= ' Sof twareWMicrosof tWWindows Script HostWTrustPolicy' Более подробно подписка на извещения о внешних событиях и обработка этих событий описаны в главе 5. События таймера В отличие от внутренних и внешних событий WMI, события таймера, которые могут происходить либо один раз в определенное время, либо несколько раз через заданные интервалы времени, настраиваются самим потребителем событий. Извещения о Событиях таймера могут быть получены в любом пространстве имен. Временные и постоянные потребители событий В WMI могут быть зарегистрированы потребители событий двух видов: временные и постоянные. Временные потребители событий — это приложения, в которых производится подписка на нужные события (другими словами, регистрация этих событий в WMI) и которые получают извещения о наступлении этих событий только во время своей активности. После завершения работы временного потребителя событий ни одно из зарегистрированных в нем событий больше не обрабатывается. Нас в качестве временных потребителей событий будут интересовать сценарии WSH. Подписка на события здесь осуществляется, как было описано ранее, с помощью специальных WQL-запросов, которые выполняются Путем ВЫЗОВа МеТОДОВ ExecNotificationQuery (ДЛЯ Внутреннего События) ИЛИ ExecNotificationQueryAsync (ДЛЯ Внешнего события) Класса swbemservices. После такой регистрации в WMI внутреннего события Замечание
Перезагрузка компьютера оставляет постоянно зарегистрированные события в репозитории CIM. Очевидно, что использование постоянных потребителей делает сам процесс мониторинга событий более надежным, т. к. в этом случае нет необходимости запускать вручную временные потребители событий и следить за их работой. В отличие от временных потребителей, процесс постоянной подписки на события состоит из нескольких независимых этапов. Во-первых, в репозитории CIM необходимо зарегистрировать нужное событие. Для этого создается фильтр событий — новый экземпляр класса EventFiiter, в свойстве Query которого записывается определяющий это событие запрос на языке WQL, а в свойстве Name — имя фильтра. Фильтр событий сохраняется в репозитории CIM с помощью метода Puto. Во-вторых, нужно определить действия потребителя при наступлении события и зарегистрировать этого потребителя в репозитории CIM. При этом постоянный потребитель событий должен быть представлен экземпляром потомка класса Eventconsumer. В WMI имеются несколько встроенных классов для создания постоянных потребителей, которые позволяют по- разному реагировать на наступление событий (табл. 1.11). Таблица 1.11. Стандартные классы для создания постоянных потребителей Класс Описание ActiveScriptEventConsumer При получении извещения о событии запускает сценарий WMI SMTPEventConsumer При получении извещения о событии отправляет сообщение по электронной почте, используя SMTP CommandLineEventConsumer При получении извещения о событии запускает приложение в контексте локальной системы Замечание сценарий с помощью метода NextEvento объекта swbemEventsource пере- водится в режим ожидания наступления события. Если же сценарий зарегистрировал в WMI внешнее событие, то для его обработки используется ВСПОМОГатеЛЬНЫЙ Объект SWbemSink. Постоянные потребители событий позволяют зарегистрировать нужное событие непосредственно в репозитории CIM, после чего извещения о наступлении этого события будут формироваться постоянно, до тех пор, пока событие не будет удалено из CIM явным образом.
Таблица 1.11 (окончание) Класс Описание NTEventLogEventConsumer При получении извещения о событии записывает сообщение в журнал событий Windows LogFileEventConsumer При получении извещения о событии записывает строку в текстовый файл ScriptingStandardConsumerSetting Содержит регистрационные данные, являющиеся общими для всех экземпляров класса ActiveScriptEventConsumer Рис. 1.9. Схема связи фильтра событий с постоянным потребителем событий
Например, для того чтобы при возникновении события выполнился определенный сценарий, нужно создать экземпляр объекта ActiveScriptEventConsumer, В СВОЙСТВО ScriptFileName записать путь К Нужному сценарию, В ПОЛе ScriptingEngine — ТИП сценария (VBScript или jscript), в поле Name — имя, под которым будет сохранен данный постоянный потребитель событий. После этого созданный постоянный потребитель (экземпляр Объекта ActiveScriptEventConsumer) сохраняется В репо- зитории CIM с помощью метода Put (). Наконец, последнее, что остается проделать, — это установить связь между созданными фильтром событий и постоянным потребителем (рис. 1.9). Другими словами, нужно указать, какой именно потребитель событий будет принимать извещения о наступлении событий, задаваемых данным фильтром событий. Для этого нужно создать и зарегистрировать в репозитории CIM Экземпляр ассоциативного Класса FilterToConsumerBinding. У ЭТОГО класса имеются свойства Filter, где нужно указать имя нужного фильтра событий (экземпляра объекта EventFiiter), и consumer, где указывается имя постоянного потребителя событий (экземпляра объекта ActiveScriptEventConsumer ИЛИ ДРУГОГО ПОТОМКа класса EventConsumer). Замечание Примеры создания временных и постоянных потребителей WMI приведены в главах 2, 5, 6. Безопасность при работе с WMI В силу своей мощности технология WMI позволяет с помощью специальных утилит или сценариев производить различные потенциально опасные действия (например, остановку служб или перезагрузку компьютера). Причем на удаленной машине это выполнить (или, вернее сказать, попытаться выполнить) так же просто, как и на локальной — достаточно написать имя нужной машины в пути к объекту WMI. Поэтому вопросы безопасности при работе с WMI имеют очень большое значение. В основном, конечно, технология WMI предназначена для администраторов операционной системы и вся система безопасности в WMI построена таким образом, чтобы по умолчанию с помощью утилит или сценариев WMI пользователь мог на определенной машине выполнить только те действия, на которые ему даны разрешения на этой машине (таким образом реализуется безопасность WMI на уровне операционной системы). То есть, если пользователю на уровне операционной системы не дано право перезагружать компьютер, он и с помощью WMI не сможет этого сделать. Дополнительная политика безопасности в WMI реализована на уровне пространств имен и на уровне протокола DCOM (Distributed COM). Перед тем
как более подробно рассмотреть эти типы безопасности WM1, напомним основные общие понятия, связанные с безопасностью в Windows. Безопасность в Windows NT/2000/XP основана на именах пользователей и их паролях. Когда в этих версиях Windows заводится пользователь, то его учетной записи присваивается уникальный идентификатор безопасности (Security IDentifier, SID). На основе SID для пользователя формируется маркер доступа (Access Token), в который также добавляется список групп, членом которых является пользователь, и список привилегий, которыми он обладает (например, остановка служб или выключение компьютера). Этот маркер доступа присваивается и всем процессам, которые запускает пользователь. Далее каждый объект операционной системы, доступ к которому определяет система безопасности (это может быть файл, процесс, служба и т. д.) имеет дескриптор безопасности (Security Descriptor, SD), в котором хранится таблица контроля доступа (Access Control List, ACL) для этого объекта. При обращении пользователя или процесса, запущенного пользователем, к объекту происходит сравнение маркера доступа этого пользователя с таблицей контроля доступа и в зависимости от результатов выдается или отклоняется разрешение на выполнение запрашиваемых действий над объектом. Механизм безопасности WMI на уровне пространств имен соответствует общей модели безопасности Windows NT/2000/XP. Каждое пространство имен может иметь собственный дескриптор безопасности, в котором хранится таблица контроля доступа (ACL). Каждая запись таблицы контроля доступа (Access Control Entry, АСЕ) ^одержит информацию о том, какие права (разрешения) имеет определенный пользователь при выполнении различных операций в этом пространстве имен (список разрешений, используемых при работе с пространством имен, приведен в табл. 1.12). Таблица 1.12. Разрешения безопасности для пространства имен WMI Разрешение Описание Выполнение методов (Execute Methods) Позволяет вызывать методы классов из определенного пространства имен. Будет ли при этом метод выполнен или произойдет отказ, зависит от того, имеет ли пользователь разрешение на выполнение этой операции в операционной системе Полная запись (Full Write) Позволяет создавать и модифицировать подпространства имен, системные классы и экземпляры классов Частичная запись (Partial Write) Позволяет создавать и модифицировать любые статические классы и экземпляры несистемных классов
Таблица 1.12 (окончание) Разрешение Описание Запись поставщика (Provider Write) Включить учетную запись (Enable Account) Включить удаленно (Remote Enable) Прочесть безопасность (Read Security) Изменение правил безопасности (Edit Security) Позволяет записывать в репозиторий CIM классы провайдеров WMI и экземпляры этих классов Предоставляет право чтения пространства имен WMI. Пользователи, имеющие это разрешение, могут запускать на локальном компьютере сценарии, которые читают данные WMI Разрешает пользователям получить доступ к пространству имен WMI на удаленном компьютере. По умолчанию этим разрешением обладают только администраторы, обычные пользователи не могут получать данные WMI с удаленных машин Позволяет читать дескриптор безопасности для пространства имен WMI без возможности его модификации Позволяет изменять дескриптор безопасности для пространства имен WMI Все записи таблицы контроля доступа сохраняются в репозиторий WMI, причем в Windows NT/2000/XP сохраняются действительные АСЕ, а в Windows 9х/Ме ~ псевдо-АСЕ. Разрешения WMI, определенные для конкретного пространства имен, также применяются (наследуются) ко всем подпространствам имен и классам, которые определены в этом пространстве. Замечание Собственные разрешения безопасности для отдельного класса WMI определить нельзя. В Windows NT/2000/XP по умолчанию группа администраторов обладает всеми разрешениями из табл. 1.12, а для остальных пользователей включена учетная запись (Enable Account), разрешено вызывать методы (Execute Methods) и записывать в CIM экземпляры классов провайдеров (Provider Write). На компьютерах с операционной системой Windows 9-x/Me все локальные пользователи имеют полный доступ к WMI. Однако здесь могут быть заданы отдельные разрешения для пользователей, которые будут управлять этим компьютером удаленно. Администратор может изменить разрешения для определенных пользователей с помощью утилиты для настройки параметров WMI, которая подробно описана в разделе "Настройка свойств WM1 (элемент управления WMI)" главы 2.
Для доступа к инфраструктуре WMI на удаленном компьютере используется коммуникационный протокол DCOM (Distributed COM). При этом пользователь, который запускает сценарий или подключается к WMI с помощью специальных утилит, выступает в качестве клиента, а объект WMI, к которому идет обращение, является сервером. Для того чтобы определить, какой маркер доступа будет применяться при работе с WMI на удаленном компьютере, используются стандартные уровни олицетворения протокола DCOM (DCOM Impersonation Levels), которые описаны в табл. 1.13. Таблица 1.13. Уровни олицетворения DCOM Уровень Описание Анонимный доступ (Anonymous) Идентификация (Identify) Олицетворение (Impersonate) Делегирование (Delegate) Объект-сервер не имеет права получить информацию о пользователе или процессе, который обращается к данному объекту (иными словами, объект не может олицетворить клиента). Этот уровень олицетворения в WMI не используется Объект-сервер может запросить маркер доступа, связанный с клиентом, но не может произвести олицетворение. В сценариях WMI этот уровень олицетворения используется редко, т. к. в этом случае нельзя запускать сценарии WMI на удаленных машинах Объект-сервер может пользоваться всеми правами и привилегиями, которыми обладает клиент. В сценариях WMI рекомендуется использовать именно этот уровень олицетворения, при этом сценарий WMI на удаленной машине сможет выполнять все действия, которые разрешено осуществлять пользователю, запустившему этот сценарий Объект-сервер, к которому обращается клиент, может обратиться от имени клиента к другому объекту-серверу. Делегирование позволяет сценарию использовать на удаленной машине маркер доступа запустившего его пользователя, а также использовать этот маркер для доступа к объектам WMI на других рабочих станциях. Применение данного уровня олицетворения связано с потенциальным риском, поэтому делегирование в сценариях WMI следует применять только в случае особой необходимости Выбираемый по умолчанию уровень олицетворения зависит от версии WMI на целевом компьютере. В версиях WMI ниже 1.5 по умолчанию используется уровень Идентификация (Identify), в версии WMI 1.5 и выше — уровень Олицетворение (Impersonate). При необходимости можно изменить уровень олицетворения по умолчанию — для этого необходимо записать наименова-
НИе НУЖНОГО УРОВНЯ (например, Impersonate ИЛИ Delegate) В Следующий ключ реестра: HKEY_LOCAL_MACHINE\Software\Microsoft\Wbem\Scripting\Default Impersonation Level Протокол DCOM также предоставляет возможность запросить для соединения WMI определенный уровень аутентификации (проверки подлинности) и конфиденциальности (табл. 1.14). Таблица 1.14. Уровни проверки подлинности DCOM Уровень Описание Отсутствует (None) По умолчанию (Default) Подключений (Connect) Вызовов (Call) Пакетов (Pkt) Целостности пакетов (Pktlntegrity) Секретности пакетов (PktPrivacy) Проверка подлинности отсутствует Для выбора уровня проверки подлинности используются стандартные настройки безопасности. Рекомендуется использовать именно этот уровень, т. к. здесь к клиенту будет применен уровень проверки подлинности, который задается сервером Клиент проходит проверку подлинности только во время подключения к серверу. После того как соединение установлено, никаких дополнительных проверок не производится Клиент проходит проверку подлинности в начале каждого вызова во время приема запросов сервером. При этом заголовки пакетов подписываются, однако сами данные (содержимое пакетов), передаваемые между клиентом и сервером, не подписываются и не шифруются Проверке подлинности подвергаются все пакеты данных, которые поступают серверу от клиентов. Так же, как и при проверке подлинности на уровне вызовов, заголовки пакетов подписываются, но не шифруются. Сами пакеты не подписываются и не шифруются Все пакеты данных проходят проверку подлинности и целостности, т. е. проверяется, что содержимое пакета не было изменено во время передачи от клиента серверу. При этом данные подписываются, но не шифруются Все пакеты данных проходят проверку подлинности и целостности, при этом данные подписываются и шифруются, что обеспечивает конфиденциальность передаваемых данных Отметим, что DCOM может и не установить запрашиваемый уровень проверки подлинности. Например, при локальной работе с WMI всегда используется уровень секретности пакетов (PktPrivacy). Нужные уровни олицетворения и проверки подлинности можно указать в явном виде в момент соединения с WMI (для интерактивных утилит этот процесс описан в главе 2, для сценариев — в главе 5).
Глава 2 Интерактивная работа cWMI Основная часть данной книги посвящена сценариям WMI, как наиболее мощному и гибкому средству при работе с WM1, однако часто для выполнения каких-либо разовых операций (например, определения типа и версии BIOS на удаленном компьютере) удобнее воспользоваться специальными утилитами, которые позволяют в интерактивном режиме подключаться к пространству имен CIM на локальной или удаленной рабочей станции и получать необходимую информацию о классах и объектах из этого пространства имен. Кроме этого, утилиты WMI значительно упрощают процесс создания и регистрации постоянных потребителей событий WMI. Наконец, при изучении WMI очень полезно с помощью графических утилит просматривать иерархическую структуру классов и связи между различными объектами CIM. В данной главе мы опишем как модули, входящие в стандартную поставку WMI (элемент управления WMI и тестер WMI), так и утилиты из разработанного Microsoft дополнительного пакета WMI Tools. Настройка свойств WMI (элемент управления WMI) Внутренние параметры WMI на локальном или удаленном компьютере можно настраивать с помощью стандартной утилиты — элемента управления WMI (WMI Control). В Windows 9x/Me/NT эта утилита представлена исполняемым файлом wbemcntl.exe, а в Windows 2000/XP — оснасткой wmimgmt.msc консоли управления ММС. Элемент управления WMI предоставляет массу возможностей. □ Подключение к WMI на удаленной машине в качестве другого пользователя. Можно выполнить вход под другим именем пользователя, чтобы изменить настройки управляющего элемента WMI. Например, если учетная запись администратора была определена на нескольких рабочих станциях, то можно подключиться к этим станциям под одним именем.
Определение режима ведения журнала ошибок. Ведение журнала ошибок помогает устранять возможные неполадки WMI; в нем можно регистрировать только возникающие ошибки (этот режим предлагается по умолчанию) или все действия (подробный журнал). Архивирование базы данных WMI (репозитория CIM). В репозитории CIM содержатся объекты, доступные через WMI. Элемент управления WMI позволяет в любое время выполнить архивацию этой базы данных или восстановить ее предыдущую версию. Настройка разрешений безопасности для пространств имен WMI. Можно разрешить или запретить пользователям или группам пользователей выполнять определенные действия над объектами заданного пространства имен. Изменение пространства имен, которое используется по умолчанию в сценариях. Обычно в качестве такого пространства имен выступает Root\ciMV2. Запуск элемента управления WMI Для того чтобы в Windows 2000/XP открыть элемент управления WMI, нужно выполнить команду wmimgmt.msc либо в командной строке, либо с помощью пункта Выполнить (Run) меню Пуск (Start). Замечание В Windows 9л/Ме для открытия элемента управления WMI следует запустить программу wbemcntl.exe. В результате откроется окно консоли Инфраструктура управления Windows (WMI) (Windows management infrastructure) с оснасткой Элемент управления WMI (WMI Control) для локального компьютера (рис. 2.1). Если необходимо подключиться к инфраструктуре WMI не на локальном, а на удаленном компьютере, то нужно в меню Действие (Action) выбрать пункт Подключение к другому компьютеру (Connect to another computer). Затем в диалоговом окне Выбор управляемого компьютера (Change managed computer), необходимо задать имя управляемого компьютера и, в случае необходимости, определить, под каким именем будет производиться соединение с этим компьютером (рис. 2.2). Для входа в режим просмотра и изменения параметров WM1, нужно выбрать пункт Свойства (Properties) в меню Действие (Action). После этого происходит подключение к службе управления WMI и появляется диалоговое окно с несколькими вкладками (рис. 2.3). На вкладке Общие (General), открываемой по умолчанию, приведены сведения о компьютере, к которому выполнено подключение, об операционной системе, а также о версии и расположении файлов WMI. Кнопка Изменить
(Change) на этой вкладке позволяет подключиться к удаленному компьютеру под другим именем (рис. 2.4). Замечание К инфраструктуре WMI на локальном компьютере можно получить доступ только от имени текущего пользователя, т е нельзя сменить имя пользователя для соединения с WMI на локальной машине Рис. 2.1. Оснастка Элемент управления WMI Рис. 2.2. Окно Выбор управляемого компьютера
Рис. 2.3. Свойства элемента управления WMI Рис. 2.4. Изменение учетной записи для подключения к WMI Настройка журнала ошибок WMI Для настройки параметров журнала ошибок WMI нужно в диалоговом окне со свойствами WMI выбрать вкладку Ведение журнала (Logging) (рис. 2.5). В группе Уровень ведения журнала (Logging level) можно выбрать уровень детализации журнала. □ В режиме Отключить (Disabled) никаких записей в журнал не заносится.
В режиме Только ошибки (Errors only) выполняется запись в журнал внутренних ошибок WM1. В режиме Подробный (Verbose) выполняется запись в журнал всех действий и ошибок. Отметим, что подробное ведение журнала может негативно сказаться на быстродействии системы, поэтому режим Подробный (Verbose) следует выбирать только тогда, когда необходимы более детальные сведения о событиях, приведших к ошибкам. Рис. 2.5. Настройка журнала WMI В группе Атрибуты файла журнала (Log file attributes) можно задать максимальный размер в байтах для файла журнала (поле Максимальный размер (Maximum size)) и путь к этому файлу (поле Размещение (Location)). Замечание Когда файл журнала достигает максимального размера, он переименовывается в файл с расширением 1о__, и создается новый файл журнала с расширением log. При достижении вторым файлом заданного размера первый файл удаляется, а второй файл переименовывается.
Архивирование и восстановление репозитория CIM Для работы с резервными копиями репозитория ОМ нужно выбрать вкладку Архивация или восстановление (Backup/Restore), при этом вид диалогового окна зависит от используемой операционной системы. В Windows 9x/Me/NT/2000 в этом окне имеются две группы (Автоматически (Automatic) и Вручную (Manual)) (рис. 2.6). Рис. 2.6. Архивирование/восстановление репозитория CIM в Windows 2000 Установив флажок Архивировать каждые (Automatically back up every), можно задать режим автоматического резервирования базы данных WMI через заданный промежуток времени. Кнопка Восстановить из последнего файла архива (Restore From Last Backup File) позволяет восстановить репозиторий CIM из последнего сделанного архива. Кнопки Выполнить архивацию (Back Up Now) и Восстановить (Restore Now) позволяют соответственно вручную создать резервную копию репозитория С1М в произвольном файле (это может оказаться полезным, если требуется сохранить определенную конфигурацию классов) или восстановить репозиторий из ранее сохраненного файла. Отметим также, что архивировать или
восстанавливать репозиторий CIM можно как на локальном, так и на удаленном компьютерах. В Windows XP на вкладке Архивация или восстановление (Backup/Restore) имеется только группа Вручную (Manual) с кнопками Архивировать (Back Up Now) и Восстановить (Restore Now) (рис. 2.7). Рис. 2.7. Архивирование/восстановление репозитория CIM в Windows XP Управление безопасностью на уровне пространства имен Элемент управления WMI позволяет настроить разрешения безопасности для пространств имен WMI (функционирующие в WMI механизмы безопасности описаны в разделе "Безопасность при работе с WMl" главы /). Для того чтобы задать разрешения безопасности для пользователя или группы пользователей, нужно выбрать вкладку Безопасность (Security) в диалоговом окне свойств WMI (рис. 2.8). Выбрав необходимое пространство имен и нажав кнопку Безопасность (Security), мы откроем диалоговое окно со списками пользователей и разрешений, которые предоставлены этим пользователям при работе с данным пространством имен (рис. 2.9).
Рис. 2.8. Настройка разрешений безопасности для пространств имен Рис. 2.9. Настройка разрешений безопасности для пользователей или групп
Для занесения в список нового пользователя или группы необходимо нажать кнопку Добавить (Add). После этого откроется диалоговое окно Выбор: Пользователи или Группы (Select: Users or Groups) (рис. 2.10). Рис. 2.10. Выбор пользователей или групп пользователей Рис. 2.11. Выбор пользователей или групп из списка
Здесь нужно, используя кнопки Типы объектов (Objects type) и Размещение (Location), выбрать соответственно тип объекта (пользователь или группа) и местоположение этого объекта (например, определенный домен). Затем вводится необходимое имя пользователя или группы (правильность имен можно проверить с помощью кнопки Проверить имена (Check names)) и нажимается кнопка ОК. Кроме этого, нужный объект можно выбрать из списка, который формируется при нажатии кнопки Дополнительно (Advanced) (рис. 2.11). После этого для нового пользователя или группы в списке Разрешения (Permissions) нужно установить флажки необходимых разрешений. Замечание Разрешения безопасности, представленные в списке Разрешения (Permissions), описаны в разделе "Безопасность при работе с WMI" главы 1. Для изменения разрешений, имеющихся у пользователя или группы, нужно выделить имя этого пользователя или группы в списке Группы или пользователи (Groups or users) и установить или сбросить соответствующие флажки в списке Разрешения (Permissions). Для удаления пользователя или группы применяется кнопка Удалить (Delete). Кнопка Дополнительно (Advanced) позволяет настроить особые разрешения или параметры для объектов безопасности. Дополнительные возможности элемента управления WMI Содержимое вкладки Дополнительно (Advanced) диалогового окна со свойствами WMI зависит от версии операционной системы. Вид этой вкладки в Windows 9x/Me приведен на рис. 2.12. Установив флажок Enable Anonymous Connection with share level security, мы тем самым разрешаем подключение к компьютеру неавторизованных пользователей (это может быть необходимо, если на локальном компьютере с Windows 9x/Mt управление доступом к общим ресурсам производится на уровне ресурсов). Переключатель WinMgmt process restart определяет режим запуска процесса Windows Management (табл. 2.1). Таблица 2.1. Режимы запуска процесса Windows Management Положение переключателя Описание WinMgmt process restart Don't restart Windows Management автоматически не запускается
Таблица 2.1 (окончание) Положение переключателя Описание WinMgmt process restart Auto restart if Event Subsystem Windows Management запускается только по needs it требованию подсистемы сообщений Windows Always auto restart Windows Management запускается автоматически при загрузке компьютера Рис. 2.12. Дополнительные параметры элемента управления WMI в Windows 98 С помощью кнопки Change можно изменить используемое по умолчанию пространство имен для сценариев WMI, т. е. то пространство имен, которое применяется тогда, когда конкретное пространство имен в тексте сценария не указано. Смена пространства имен для сценариев возможна как на удаленном, так и на локальном компьютере. В Windows NT/2000/XP на вкладке Дополнительно (Advanced) имеется только кнопка Изменить (Change), с помощью которой можно изменить используемое по умолчанию пространство имен для сценариев WMI (рис. 2.13).
Рис. 2.13. Дополнительные параметры элемента управления WMI в Windows NT/2000/XP Тестер WMI (WBEMTest) Тестер WM1 (wbemtest.exe) — это графическая утилита, с помощью которой можно взаимодействовать с инфраструктурой WMI на локальном или удаленном компьютере. С помощью тестера WMI можно решать следующие задачи: □ подсоединяться к определенному пространству имен С1М; □ создавать и удалять классы и экземпляры классов; □ получать список имеющихся классов и экземпляров классов CIM; □ просматривать и изменять свойства и квалификаторы классов или экземпляров классов; □ выполнять методы классов и экземпляров классов; □ составлять и выполнять запросы на языке WQL; □ выводить код MOF для классов и экземпляров управляемых ресурсов.
Замечание Работа с тестером WMI предполагает хорошее знание структуры CIM и умение составлять запросы на языке WQL. Исполняемый файл wbemtest.exe является стандартным компонентом WMI в любой операционной системе; устанавливается он в каталог %SystemRoot%\ System32\Wbem (в Windows NT/2000/XP) или в %WinDir%\System\Wbem (в Windows 9x/Me). После запуска этого файла появляется диалоговое окно Тестер инструментария управления Windows (Windows Management Instrumentation Tester), с помощью которого можно получить доступ ко всем функциям тестера WMI (рис. 2.14). Рис. 2.14. Тестер WMI Сразу после запуска большинство кнопок этого диалогового окна недоступны — ими можно будет воспользоваться только после подключения к подсистеме WMI. До подключения можно установить флажок Включить все привилегии (Enable all privileges), что позволит средствами WMI выполнять операции, для которых необходимы специальные привилегии в операционных системах Windows NT/2000/XP (например, перезагрузку компьютера). Далее мы рассмотрим основные операции, которые могут потребоваться в тестере WMI администратору операционной системы.
Подключение к пространству имен Для того чтобы пользоваться средствами тестера WMI, необходимо подключиться к нужному пространству имен. Произвести такое подключение позволяет кнопка Подключить (Login), после нажатия на которую появляется диалоговое окно Подключение (Connect) (рис. 2.15). Рис. 2.15. Диалоговое окно подключения к пространству имен в Windows XP Элементы управления этого диалогового окна (число их зависит от операционной системы) определяют параметры подключения к подсистеме WMI. □ Поле Пространство имен (Namespace) содержит название пространства имен, используемого по умолчанию на данном компьютере. Здесь можно указать другое пространство имен на локальном или удаленном компьютере. □ Группа Подключение (Connection) содержит поля, в которых задаются интерфейсы, применяемые при работе с WMI. Поле Используя (Use) определяет, что для получения исходного указателя пространства имен служит интерфейс iwbemLocator. В поле Возвращение (Return) указывается, ЧТО ДЛЯ ДОСТупа К данНЫМ WMI ИСПОЛЬЗуеТСЯ Интерфейс IWbemServices. Поле Завершение (Result) определяет, что обработка данных выполняется в синхронном режиме.
Поля в группе Учетные данные (Credentials) позволяют для входа в подсистему WM1 на удаленном компьютере применять учетные данные, отличные от учетных данных текущего пользователя. Если оставить эти поля пустыми, WMI будет использовать данные, введенные активным пользователем при входе в систему Windows. При соединении с пространством имен на локальном компьютере всегда применяются только учетные данные активного пользователя. Поле Язык (Locale) позволяет указать код локализации, который должен соответствовать формату ms_xxxx, где ххх — обозначение идентификатора языка (Locale Identifier, LCID) в шестнадцатеричной форме. Например, английскому языку соответствует значение ms_4094. Чтобы использовать текущий язык, установленный в системе, нужно оставить это поле пустым. Переключатель Как интерпретировать пустой пароль (How to interpret empty password) позволяет задать режим обработки пустого поля пароля, т. к. в WMI различаются понятия пустого пароля и его отсутствия. В режиме NULL (применяется по умолчанию) вместо пустого пароля будет подставлен текущий пароль Windows. Если нужно войти в подсистему WMI с пустым паролем, то следует установить данный переключатель в положение Пусто (Blank). Переключатель Уровень олицетворения (Impersonation level) позволяет задать уровень олицетворения протокола DCOM. Как правило, для этого переключателя можно оставить режим Олицетворение (Impersonation), предлагаемый по умолчанию (описание этого и других уровней олицетворения DCOM приведено в разделе "Безопасность при работе с WMI" главы Г). С помощью переключателя Уровень проверки подлинности (Authentication level) можно задать уровень проверки подлинности DCOM. Как правило, для этого переключателя можно оставить режим Пакетов (Packet), предлагаемый по умолчанию (описание этого и других уровней проверки подлинности DCOM приведено в разделе "Безопасность при работе с WMI" главы /). Таким образом, самое главное, что нужно сделать для подключения к подсистеме WMI, — это указать в поле Пространство имен (Namespace) диалогового/окна Подключение (Connect) путь к нужному пространству имен WMI. Например, для подключения к пространству имен cimv2 на локальном компьютере, нужно в поле Пространство имен (Namespace) ввести строку Root\ciMV2, а для подключения к этому же пространству имен на удаленной машине с именем Compl — строку \\compi\Root\ciMV2. Для большинства остальных элементов управления диалогового окна Подключение (Connection) чаще всего можно оставить значения, предлагаемые по умолчанию.
После того как будут заполнены все нужные параметры подключения к определенному пространству имен, необходимо нажать кнопку Подключить (Connect). В результате подключения все кнопки в диалоговом окне Тестер инструментария управления Windows (Windows Management Instrumentation Tester) станут доступными, а имя выбранного пространства имен появится в левом верхнем углу этого окна (рис. 2.16). Рис. 2.16. Тестер WMI после подключения к пространству имен CIMV2 на локальном компьютере После подключения к пространству имен также можно изменить параметры вызовов методов WMI и вид данных, которые возвращаются в результате запросов — для этого служат элементы управления группы Способы вызова метода (Metod Invocation Options). В WMI существуют три способа вызова методов. При решении задач, занимающих много времени (например, обработка сложных запросов), лучше использовать асинхронный режим, который позволяет тестеру WMI одновременно выполнять другие действия. Для такого асинхронного выполнения действий нужно установить переключатель Способы вызова метода (Metod Invocation Options) в положение Асинхронно (Asynchronous). В остальных случаях можно использовать режимы Синхронно (Synchronous) или Полусинхронно (Semisynchronous) (последний режим устанавливается по умолчанию). Поле Счетчик пакетов (Batch Count) служит для указания количества элементов, одновременно отображаемых в диалоговом окне Результат запроса (Query Result).
В поле Таймаут (Timeout) можно указать длительность таймаута при вызове методов (в миллисекундах). Если установлен флажок Использовать NextAsync (Use NextAsync), то изменять значение параметра Таймаут (Timeout) нельзя. Смена пространства имен После подключения к определенному пространству имен можно открыть любое его подпространство. Для этого служит кнопка Пространство имен (Open Namespace), после нажатия которой на экран выводится диалоговое окно Получение пути объекта (Get Object Path). Пусть, например, мы предварительно произвели подключение к пространству имен cimv2. Если теперь вызвать окно Получение пути объекта (Get Object Path), ввести в поле Путь объекта (Object Path) значение ms_409 и нажать кнопку ОК, то мы откроем подпространство имен ms_409 пространства CIMV2. Замечание При успешном открытии подпространства имен в главном окне тестера обновляется название открытого пространства Открытие класса или экземпляра класса (объекта) Для того чтобы можно было просматривать или изменять квалификаторы, свойства и методы определенного класса или объекта, необходимо предварительно открыть этот класс или объект. Открыть класс можно с помощью кнопки Открыть класс (Open Class), после нажатия на которую выводится диалоговое окно Получение имени класса (Get Class Name), в нем нужно ввести имя требуемого класса (например, win32_Process) и нажать кнопку ОК (рис. 2.17). Рис. 2.17. Диалоговое окно Получение имени класса Для открытия объекта (т. е. экземпляра класса) следует использовать кнопку Открыть экземпляр (Open Instance), после нажатия на которую открывается
диалоговое окно Получение пути объекта (Get Object Path), в нем нужно указать путь к открываемому объекту и нажать кнопку ОК (рис. 2.18). Рис. 2.18. Диалоговое окно Получение пути объекта Пути К Объектам здесь ДОЛЖНЫ задаваться В ВИДе ClassName.KeyPropertyl=Valuel [, KeyProperty2=Value2...], где ClassName — ИМЯ Класса, а параметры KeyPropertyl И Valuel, KeyProperty2 И Value2, ..., задают СПИСОК КЛЮЧевЫХ пар (свойство-значение), однозначно идентифицирующих объект. Например, чтобы открыть экземпляр класса win32_LogicalDisk, нужно в поле Путь Объекта (Object Path) введите строку Win32_LogicalDisk.DeviceID=,,C: " (см. рис. 2.18). Замечание Кроме непосредственного указания пути, классы и объекты также можно открывать с помощью выбора имени из соответствующего списка, что описано в разделе "Формирование списка классов или объектов" данной главы. После успешного открытия класса или объекта на экран выводится диалоговое окно редактора объектов. Редактирование классов и объектов Диалоговое окно Редактор объекта (Object editor) позволяет просматривать и изменять квалификаторы, свойства и методы выбранного класса или экземпляра класса (рис. 2.19). Как мы видим, в окне Редактор объекта (Object editor) имеются элементы управления, позволяющие работать отдельно с квалификаторами, свойствами и методами, а также несколько кнопок и переключателей общего назначения. Кнопка Закрыть (Close) позволяет выйти из редактора объектов без сохранения изменений. Для сохранения изменений, сделанных в текущем классе или объекте, используется кнопка Сохранить объект (Save Object). Замечание Далеко не все свойства объекта или класса WMI можно изменить, большинство из свойств доступно только для чтения (см разд. "Свойства классов WMI" гл. 1).
Рис. 2.19. Диалоговое окно Редактор объекта для класса Win3 2_Process При сохранении изменений, произведенных в классе, предусмотрены несколько режимов обновления описания этого класса в репозитории CIM. Эти режимы определяются положением переключателя Тип обновления (Update type) (см. табл. 2.2). Таблица 2.2. Режимы обновления классов и объектов в тестере WMI Режим обновления Описание Только создание (Create only) Только обновление (Update only) Любое (Either) Используется только для создания нового класса или объекта. Если данный класс или объект уже существует, то операция сохранения изменений завершается сбоем Используется только для обновления уже существующего класса или объекта. Если данного класса или объекта в репозитории CIM еще нет, то операция сохранения изменений завершается сбоем Если класса или объекта в CIM не существует, то он создается, в противном случае — переписывается
Таблица 2.2 (окончание) Режим обновления Описание Совместимое (Compatible) Безопасное (Safe) Принудительное (Force) В этом режиме класс можно обновить лишь в том случае, если у него отсутствуют экземпляры и производные классы. Если класс имеет экземпляры, то обновление закончится сбоем. Этот режим используется по умолчанию и служит для совместимости с предыдущими версиями WMI Разрешает производить обновление класса даже при наличии у него дочерних классов, при условии, что изменение не вызовет конфликты с этими дочерними классами. Примером такого обновления является добавление в базовый класс нового свойства, ранее не использовавшегося ни в одном дочернем классе. Если класс имеет экземпляры, то обновление в этом режиме закончится сбоем Разрешает производить обновление классов даже при наличии конфликтов с дочерними классами. Например, этот режим позволяет выполнить обновление класса при попытке добавить в него базовый класс-квалификатор, ранее определенный в дочернем классе. В принудительном режиме конфликт такого рода разрешается удалением ква- лификатора в дочернем классе. Если класс имеет экземпляры, то обновление в этом режиме закончится сбоем С помощью кнопки Вывести MOF (Show MOF) можно вывести в отдельное окно описание текущего класса на языке MOF (рис. 2.20). Кнопка Суперкласс (Superclass) выводит на экран новое окно редактора объектов, в котором будет представлено описание класса, являющегося родительским по отношению к текущему классу или объекту. Например, если в текущем окне редактора объектов был открыт класс win32_Process, то после нажатия кнопки Суперкласс (Superclass) в новом окне будет открыт класс CIM_Process, КОТОРЫЙ ЯВЛЯетСЯ рОДИТеЛЬСКИМ ДЛЯ Win32_Process (рИС 2.21). Кнопка Наследованные (Derived), напротив, позволяет вывести для текущего класса или объекта список его дочерних классов. Например, если нажать на эту кнопку в окне с описанием класса cra_Process, то на экран будет выведено окно Результат запроса (Query result), с названием единственного дочернего класса Win32_Process (рИС 2.22). С помощью кнопки Экземпляры (Instances) можно вывести список экземпляров текущего класса. Например, для класса win32_Process эта кнопка позволяет получить список всех запущенных в системе процессов (рис. 2.23).
Рис. 2.20. Описание класса Win32_Process на языке MOF Рис. 2.21. Диалоговое окно Редактор объекта для класса CIM_Process
Рис. 2.22. Список дочерних классов для класса ClM_Process Рис. 2.23. Список экземпляров класса Win32_Process Просмотр и изменение квалификаторов класса или объекта Квалификаторы, которые имеются у класса или объекта, представлены в окне редактора объектов в списке Квалификаторы (Qualifiers). В этот список можно с помощью кнопки Добавить (Add Qualifier) внести новые квалификаторы, которые будут применены ко всему классу. Для удаления имеющегося квалификатора нужно выделить этот квалификатор в списке и нажать кнопку Удалить (Delete Qualifier).
Ясно, что администратору операционной системы вряд ли придется изменять, добавлять или удалять квалификаторы в имеющихся классах и объектах. Для более удобного же просмотра отдельного квалификатора можно выделить его в списке и вывести развернутое описание этого квалификатора в отдельном диалоговом окне Редактор квалификаторов (Qualifier Editor) с помощью кнопки Изменить (Edit). Здесь будут показаны имя, тип и значение квалификатора, а также его атрибуты, позволяющие, скажем, распространять квалификатор на дочерние классы или экземпляры классов (рис. 2.24). Рис. 2.24. Редактор квалификаторов для квалификатора UUID класса Win32_Process Просмотр и изменение свойств класса или объекта Список Свойства (Properties) в окне редактора объекта содержит свойства, имеющиеся в текущем классе или объекте. По умолчанию в этом списке отображаются все свойства, включая системные (имена таких свойств начинаются с символов " " (двойное подчеркивание), например, class или namespace) и свойства, наследованные от класса-предка. Для того чтобы редактор объектов не показывал системные свойства, нужно установить флажок Скрыть системные свойства (Hide System Properties). Если есть необходимость оставить в списке только те свойства, которые были определены непосредственно в текущем классе, а не были наследованы, то следует установить флажок Только локальные (Local Only). Кнопки Добавить (Add) и Удалить (Delete Property) позволяют, соответственно, определить новое свойство в классе или объекте или удалить уже существующее (на практике выполнять эти действия нам не понадобится). С пбмощью кнопки Изменить (Edit) можно вывести на экран диалоговое окно Редактор свойств (Property Editor), которое позволяет увидеть данные, относящиеся к выделенному в списке свойству (рис. 2.25).
Рис. 2.25. Редактор свойств для свойства Caption экземпляра класса Win32_Process Как мы видим, в этом окне указаны имя свойства (поле Имя свойства (Property Name)), имя класса, в котором оно определено (поле Из класса (Class of origin)), тип свойства (поле Тип (Туре)). Свойство может быть одного из доступных в CIM типов данных, которые описаны в табл. 2.3. Таблица 2.3. Типы данных, определенные в CIM Название типа Описание CIM_SINT8 CIM_UINT8 CIM_SINT16 CIM_UINT16 CIM_SINT32 CIM_UINT32 CIM_SINT64 CIM_UINT64 CIM_REAL3 2 CIM_REAL64 CIM BOOLEAN 8-разрядное целое число со знаком 8-разрядное целое число без знака 16-разрядное целое число со знаком 16-разрядное целое число без знака 32-разрядное целое число со знаком 32-разрядное целое число без знака 64-разрядное целое число со знаком 64-разрядное целое число без знака 32-разрядное действительное число 64-разрядное действительное число Логическое значение (True или False)
Таблица 2.3 (окончание) Название типа Описание CIM_STRING CIM_DATETIME CIM_REFERENCE CIM_CHAR16 CIM_OBJECT Текстовая строка Дата и время Ссылка на класс (используется в ассоциативных классах) Символ Объект CIM В поле Значение (Value) отображается значение свойства. Например, на рис. 2.25 значением свойства caption является строка winiogon.exe и переключатель установлен в положение Не NULL (Not NULL). Если же свойство не имеет определенного значения, то переключатель устанавливается в положение NULL. Рис. 2.26. Редактор свойств для ключевого свойства Handle класса Win32_Process Также в диалоговом окне Редактор свойств (Property Editor) имеется список Квалификаторы (Qualifiers), в котором отображаются все квалификаторы, определенные для текущего свойства класса или объекта. Например, свойство Handle в классе win32_Process является ключевым, поэтому этот пере-
ключатель установлен в положение Ключ (Key) (рис. 2.26). Кнопки Добавить (Add Qualifier), Удалить (Delete Qualifier) и Изменить (Edit Qualifier) позволяют в случае необходимости, соответственно, добавлять новые квалифика- торы в список, удалять существующие квалификаторы и изменять выделенный квалификатор. Просмотр и изменение методов класса или объекта В списке Методы (Methods) диалогового окна Редактор объекта (Object editor) представлены все методы, имеющиеся у текущего класса или объекта. Подобно квалификаторам и свойствам, с помощью кнопок Добавить (Add Method) и Удалить (Delete Method) можно, соответственно, добавить в класс или объект определение нового метода или удалить существующий. Выделив нужный метод в списке и нажав кнопку Изменить (Edit method), мы сможем увидеть полное описание этого метода в диалоговом окне Редактор методов (Method Editor) (рис. 2.27). Рис. 2.27. Редактор методов для метода Terminate класса Win32_Process Как мы видим, это окно похоже на соответствующие диалоговые окна редакторов квалификаторов и свойств: здесь имеется информация об имени метода (поле Название метода (Method Name)) и классе, в котором этот метод был определен (поле Из класса (Class of origin)). Кнопки Входные аргументы (Edit Input Arguments) и Выходные аргументы (Edit Output Arguments) позволяют посмотреть, а также в случае необходимости изменить списки входных и выходных параметров метода (рис. 2.28). В списке квалификаторов представлены все квалификаторы, определенные для класса или объекта. Например, у метода Terminate класса Win32_Process ИМеЮТСЯ Квалификаторы ЛОГИЧесКОГО ТИПа Destructor И Implemented СО значениями, равными True (СМ. рИС. 2.27), КОТОрые указы-
вают на то, что этот метод реализован и поддерживается провайдером, а используется он для удаления экземпляров класса. Рис. 2.28. Входные параметры метода Terminate класса Win3 2_Process Просмотр ассоциативных связей для класса или объекта Как отмечалось в первой главе, в схеме CIM определяются специальные ассоциативные классы, с помощью которых производится связь (ассоциация) различных классов и объектов друг с другом. С помощью тестера WMI для конкретного экземпляра класса можно посмотреть, с какими экземплярами других классов он связан и посредством какого ассоциативного файла. Скажем, можно узнать, какие динамические библиотеки (экземпляры класса ciM_DataFiie) использует тот или иной процесс (экземпляр класса win32_Process). Например, запустим стандартный Блокнот Windows (notepad, ехе) и откроем в редакторе объектов экземпляр класса win32_Process, который соответствует этому процессу (рис. 2.29). / Е0ли теперь нажать кнопку Соединители (Associators), то откроется диалоговое окно со списком объектов, которые связаны с текущим экземпляром класса (рис. 2.30).
Рис. 2.29. Редактор объектов для экземпляра класса Win32_Process Рис. 2.30. Объекты, связанные с экземпляром класса Win32_Process Как мы видим, здесь приведены все имена исполняемых файлов и динамических библиотек, которые использует Блокнот при работе. Если необходима более подробная информация о связях объекта, то нужно воспользоваться кнопкой Ссылки (References). После нажатия этой кнопки
выводится окно со списком экземпляров ассоциативных классов, которые связывают текущий объект с экземплярами других классов (рис. 2.31). Рис. 2.31. Экземпляры ассоциативных классов, имеющих ссылку на экземпляр класса Win32_Process Рис. 2.32. Связь процесса с динамической библиотекой посредством ассоциативного класса WMI
Для каждого такого экземпляра ассоциативного класса приводятся имена и значения свойств, посредством которых текущий объект связывается с экземплярами других классов. Так, в свойстве Antecedent экземпляра класса CIM_ProcessExecutable записан объект CIM_DataFile, Соответствующий ДИ- намИЧеСКОЙ библиотеке (например, CIM_DataFile.Name="C: \\WINDOWS\\ system32WSHELL32.DLL"), а В СВОЙСТВе Dependent — объект Win32_Process, Соответствующий запущенному БЛОКНОТУ (win32_Process.Handle=" 1856") (рис. 2.32). Формирование списка классов или объектов В тестере WMI с помощью кнопки Классы (Enum Classes) можно для заданного класса CIM (т. н. суперкласса) сформировать список его дочерних классов. При этом в список дочерних классов можно включать либо только классы, являющиеся непосредственными потомками суперкласса, либо вообще все классы-потомки суперкласса (потомки непосредственных потомков суперкласса и т. д.). Итак, для формирования списка классов нужно в диалоговом окне Тестер инструментария управления Windows (Windows Management Instrumentation Tester) нажать кнопку Классы (Enum Classes), после чего на экран выводится диалоговое окно Сведения о суперклассе (Superclass Info) (рис. 2.33). Рис. 2.33. Диалоговое окно Сведения о суперклассе Здесь нужно ввести имя того суперкласса, потомки которого должны быть представлены в списке. Например, диалоговое окно на рис. 2.33 позволяет ПОЛУЧИТЬ СПИСОК ДОЧерНИХ КЛаССОВ ДЛЯ Класса CIM_Setting. Если нужно просмотреть список классов верхнего уровня текущего пространства имен, то имя суперкласса оставляется пустым, а переключатель устанавливается в положение Только непосредственные (Immediate only). Для просмотра всех классов текущего пространства имен нужно имя суперкласса оставить пустым и установить переключатель в положение Рекурсивно (Recursive).
После нажатия кнопки ОК сформированный список классов выводится в окно Результаты запроса (Query Result) (рис. 2.34). Рис. 2.34. Диалоговое окно Результаты запроса для суперкласса CIM_Setting В полученном списке можно выбрать двойным щелчком нужный класс, после чего откроется описанное ранее окно редактора объектов для этого класса. Список объектов (экземпляров определенного класса) формируется аналогичным образом с помощью кнопки Экземпляры (Enum Instances) в главном окне Тестер инструментария управления Windows (Windows Management Instrumentation Tester). После нажатия этой кнопки на экран выводится диалоговое окно Сведения о классе (Class Info), в котором нужно ввести имя того класса, экземпляры которого должны быть выведены в списке (рис. 2.35). Рис. 2.35. Диалоговое окно Сведения о классе Если переключатель установлен в положение Только непосредственные (Immediate only), то в список будут включены экземпляры только одного
класса (суперкласса). Если же переключатель установлен в положение Рекурсивно (Recursive), то будут выведены экземпляры самого класса, а также экземпляры потомков этого класса. Например, если в качестве класса использовать ciM_Process и установить переключатель в положение Только непосредственные (Immediate only), то список экземпляров окажется пустым (у класса ciM_Process нет экземпляров). При положении переключателя в значении Рекурсивно (Recursive) в список будут помещены все экземпляры класса win32_Process, который является дочерним классом по отношению к ciMProcess (рис. 2.36). Рис. 2.36. Экземпляры класса ClM_Process, полученные в режиме рекурсии В полученном списке двойным щелчком левой кнопки мыши можно выбрать нужный экземпляр (объект), после чего для него выводится окно редактора объектов данного класса. Выполнение методов класса или объекта Для выполнения методов классов или экземпляров классов следует воспользоваться кнопкой Выполнить метод (Execute Method) в главном окне Тестер инструментария управления Windows (Windows Management Instrumentation Tester). После нажатия этой кнопки появляется диалоговое окно Получение пути объекта (Get Object Path), в котором нужно ввести путь к тому классу или объекту, метод которого требуется выполнить (это окно уже использовалось нами ранее при открытии экземпляра класса, см. рис. 2.18). Например, еСЛИ МЫ ХОТИМ ВЫПОЛНИТЬ МеТОД Create Класса Win32_Process для запуска нового процесса (например, стандартного калькулятора Windows), то нужно ввести имя класса win32_Process и нажать кнопку ОК,
в результате чего на экране появится диалоговое окно Выполнить метод (Execute Method) (рис. 2.37). Рис. 2.37. Диалоговое окно Выполнить метод Далее в этом окне следует выбрать нужный метод create из списка Метод (Method) и задать его входные параметры с помощью кнопки Входные параметры (Edit In Parameters). Параметрам метода в WMI соответствуют свойства экземпляра системного класса Parameters; изменить эти свойства позволяет стандартное диалоговое окно редактора объектов (рис. 2.38). Рис. 2.38. Входные параметры метода Create (экземпляр класса Parameters)
Набор имеющихся в объекте Parameters свойств зависит от выполняемого метода. Для запуска нового процесса с помощью метода create достаточно в свойстве commandLine указать путь к запускаемому файлу (в нашем случае это calc.exe), что осуществляется в стандартном окне редактора свойств объекта (рис. 2.39). Рис. 2.39. Ввод значения для свойства CommandLine (Редактор свойств) После задания значения свойства commandLine нужно сохранить сделанные изменения в свойстве и целиком в объекте с помощью кнопок Сохранить (Save Property) и Сохранить объект (Save Object) соответственно. Для запуска метода с установленными входными параметрами в окне Выполнить метод (Execute Method) используется кнопка Выполнить (Execute!), после чего на экран выводится сообщение об удачном или неудачном выполнении метода (рис. 2.40 и 2.41). Рис. 2.40. Сообщение об удачном выполнении метода
Рис. 2.41. Сообщение об ошибке, возникшей при выполнении метода После выполнения метода можно посмотреть его выходные параметры. Для этой цели служит кнопка Выходные параметры (Edit Out Parameters), после нажатия которой на экран вновь выводится диалоговое окно редактора объектов ДЛЯ Экземпляра класса Parameters (рИС. 2.42). Рис. 2.42. Выходные параметры метода Create (экземпляр класса Parameters) Как мы видим, метод create позволяет узнать идентификатор, который был присвоен запущенному процессу (свойство Processid). Если при выполнении метода произошла ошибка, то в свойстве Returnvalue будет записан ненулевой код этой ошибки. Для вызова метода конкретного экземпляра класса (объекта) нужно задать путь к этому экземпляру с помощью значений ключевых свойств. Например,
для того чтобы завершить только что запущенное приложение, нужно вызвать метод Terminate для соответствующего ему экземпляра класса win32_Process. Путь к этому объекту задается с помощью ключевого свойства Handle (рис. 2.43). Рис. 2.43. Путь к экземпляру объекта Win32_Process Для метода Terminate можно не указывать входные параметры, поэтому с целью завершения работы приложения достаточно в окне Выполнить метод (Execute Method) выбрать данный метод из списка Метод (Method) и нажать кнопку Выполнить (Execute!). Выполнение обычных WQL-запросов Напомним, что для доступа к различным объектам WMI используются специальные запросы на языке WQL (WMI Query Language) (описание синтаксиса и операторов WQL приведено в Приложении Г). Для того чтобы выполнить произвольный WQL-запрос в тестере WMI, нужно в главном окне Тестер инструментария управления Windows (Windows Management Instrumentation Tester) нажать кнопку Запрос (Query), ввести текст запроса в появляющееся диалоговое окно Запрос (Query) и нажать кнопку Применить (Apply) (рис. 2.44). Рис. 2.44. Диалоговое окно Запрос для обычного WQL-запроса
Например, если требуется выбрать все логические диски, объем свободного дискового пространства на которых превышает 200 Мбайт, то нужно ввести и выполнить следующий запрос: SELECT * FROM Win32_LogicalDisk WHERE FreeSpace > 200000000 В результате на экран будет выведено диалоговое окно Результат запроса (Query Result), в котором сформируется список экземпляров класса win32_LogicaiDisk, которые обладают нужными свойствами (рис. 2.45). Рис. 2.45. Экземпляры класса Win32_LogicalDisk, выбранные в результате выполнения запроса Рис. 2.46. Класс Win32_LogicalDisk, возвращаемый в результате выполнения запроса
Флажок Восстановить прототип класса (Retrieve class prototype) в окне Запрос (Query) отмечается в том случае, когда в качестве результата запроса должны вернуться не экземпляры, а класс, к которому они принадлежат. Например, если установить этот флажок и выполнить предыдущий запрос, то в окне Результат запроса (Query Result) будет выведен не список экземпляров класса win32_LogicaiDisk, а сам этот класс (рис. 2.46). Выполнение запросов для подписки на уведомления о наступлении событий Тестер WMI может выступать в качестве временного потребителя событий WMI, т. е. во время работы тестера можно зарегистрировать в нем нужное событие и принимать извещения о наступлении этого события. Перед тем как с помощью тестера WMI подписываться на извещения о наступлении событий, нужно определить, в каком режиме (асинхронном или полусинхронном) будет производиться обработка таких извещений, и установить в соответствующее положение переключатель Способы вызова метода (Metod Invocation Options) в главном окне Тестер инструментария управления Windows (Windows Management Instrumentation Tester). Замечание В синхронном режиме извещения о наступлении событий в тестере WMI обрабатываться не могут. В случае использования полусинхронного режима (положение переключателя Полусинхронно (Semisynchronous)) можно изменить длительность таймау- та при обработке событий (поле Таймаут (Timeout)) и количество элементов, которые будут одновременно отображаться в диалоговом окне Результат запроса (Query Result) (поле Счетчик пакетов (Batch Count)). После этого нужно нажать кнопку Запрос уведомления (Notification Query), ввести текст запроса в появляющееся диалоговое окно Запрос (Query) и нажать кнопку Применить (Apply) (рис. 2.47). Рис. 2.47. Запрос для подписки на извещения о наступлении событий
Например, для подписки на извещения о запуске каждого нового процесса нужно ввести и выполнить следующий WQL-запрос: SELECT * FROM InstanceCreationEvent WITHIN 5 WHERE Targetlnstance ISA 'Win32_Process' После этого на экран выводится диалоговое окно Результат запроса (Query Result) с надписью Операция выполняется (Operation in progress), которая указывает на то, что WMI обрабатывает текущий запрос (рис. 2.48). Рис. 2.48. Результат получения извещений о наступлении событий По мере запуска новых процессов в окно Результат запроса (Query Result) будут добавляться новые записи, соответствующие этим процессам. Отметим, что извещения о событиях, удовлетворяющих введенному запросу, будут поступать в тестер WMI постоянно, до тех пор, пока запрос не будет остановлен вручную с помощью кнопки Закрыть (Close). Административные утилиты WMI (WMI Tools) Кроме стандартного тестера WMI для интерактивной работы с WMI очень удобно использовать разработанные Microsoft административные утилиты WMI, в состав которых входят несколько приложений, имеющих сходный интерфейс. □ WMI CIM Studio. Это наиболее универсальное приложение, которое может быть использовано для просмотра и редактирования в репозито- рии CIM классов и их экземпляров. С помощью WMI CIM Studio можно также выполнять методы классов и объектов, просматривать ассоциации между различными классами, выполнять запросы на языке WQL, генерировать и компилировать файлы MOF для классов и объектов. Короче
говоря, утилита WMI CIM Studio обладает практически теми же возможностями, что и тестер WMI (wbemtest.exe), однако имеет гораздо более удобный интуитивный интерфейс. Как и работа с тестером WMI, использование WMI CIM Studio предполагает довольно хорошее знание структуры репозитория CIM и названий нужных классов. □ WMI Object Browser. Эта утилита предназначена для просмотра и редактирования объектов (экземпляров классов) в репозитории CIM, а также для вызовов их методов. Особенностью WMI Object Browser является то, что информация об объектах представлена в виде иерархического дерева, где в качестве корневого объекта может использоваться произвольный экземпляр выбранного нами класса. Само дерево объектов строится с помощью ассоциированных классов, что помогает извлекать информацию об управляемых ресурсах, не обладая глубокими знаниями о структуре репозитория CIM и используемых классах. □ WMI Event Registration Tool. Данная утилита предоставляет графический интерфейс для регистрации и конфигурирования постоянных потребителей событий WMI. Здесь можно создавать или изменять фильтры событий, определять постоянных потребителей и устанавливать связи между ними и фильтрами событий. □ WMI Event Viewer. Это вспомогательное приложение является постоянным потребителем событий, позволяющим сортировать и просматривать подробную информацию о полученных событиях. Если эти утилиты нужно установить в Windows 2000/XP/Server 2003, то инсталляционный файл WMITools.exe можно свободно скачать с сервера Microsoft (http://downIoad.microsoft.eom/download/.NetStandardServer/InstaII/ Vl.l/NT5XP/EN-US/WMITooIs.exe). В случае же Windows 9x/NT 4.0 необходимо установить комплект инструментальных средств разработки SDK WMI, в состав которого также входят все описанные утилиты. Инсталляционный файл wmisdk.exe можно свободно скачать с сервера Microsoft (http://download.microsoft.com/downIoad/platformsdk/ x86wmi/l.l/W9XNT4/EN-US/wmisdk.exe). Административные утилиты WMI реализованы в виде элементов ActiveX, которые встроены в страницы HTML, поэтому для их корректной работы необходимо, чтобы в системе был установлен браузер Microsoft Internet Explorer 5.0/6.0. Кроме этого, пользователь, который производит установку утилит WMI на компьютер, должен обладать правами администратора. Подключение к пространству имен WMI Для запуска любой из трех основных административных утилит WMI (WMI CIM Studio, WMI Object Browser или WMI Event Registration Tool) нужно выбрать соответствующий одноименный пункт в меню Пуск | Программы |
WMI Tools (Start | Programs | WMI Tools). Первым шагом после запуска во всех этих утилитах является подключение к какому-либо пространству имен на локальном или удаленном компьютере с помощью диалогового окна Connect to namespace (рис. 2.49). Рис. 2.49. Ввод пространства имен WMI для подключения По умолчанию в этом окне предлагается подключиться к пространству имен cimv2 на локальном компьютере (root\ciMV2). Путь к нужному пространству имен на локальном или удаленном компьютере можно либо написать вручную, либо выбрать это пространство с помощью кнопки Browse For Namespace, после нажатия которой выводится диалоговое окно Browse For Namespace (рис. 2.50). Рис. 2.50. Диалоговое окно Browse For Namespace для выбора пространства имен Если компьютер, к которому предполагается подключиться, доступен в сети, то его можно найти и выбрать с помощью кнопки Network Neighborhood. После ввода в поле Machine Name имени нужного компьютера, следует выбрать интересующее нас пространство имен из списка. Для этого нужно в поле Starting Namespace написать название корневого пространства имен (обычно это Root) и нажать кнопку Connect. В результате на экран выводится диалоговое окно Login (в заголовке этого окна отображается также название
запущенного приложения), в котором можно указать имя пользователя и пароль для учетной записи, от имени которой происходит подключение к пространству имен (рис. 2.51). Рис. 2.51. Диалоговое окно WMI CIM Studio Login Напомним, что к пространству имен на локальном компьютере может получить доступ только текущий пользователь, поэтому в случае локальной машины флажок Login as current user установлен, а поля Username, Password и Authority недоступны для редактирования. К пространству имен на удаленной машине можно подключаться как от имени текущего пользователя (для этого следует установить флажок Login as current user), так и от имени другого пользователя (в этом случае нужно снять флажок Login as current user и внести в поля Username и Password имя пользователя в виде domain\user и пароль соответственно). Также в окне Login с помощью кнопки Options<< можно настроить дополнительные параметры подключения к инфраструктуре WMI (рис. 2.52). Рис. 2.52. Диалоговое окно WMI CIM Studio Login после нажатия кнопки Options«
Список Impersonation level содержит уровни олицетворения протокола DCOM. Как правило, здесь можно оставить режим Impersonate, предлагаемый по умолчанию (описание этого и других уровней олицетворения DCOM приведено в разделе "Безопасность при работе с WMI" главы 1). Параметр Authentication level позволяет задать уровень проверки подлинности DCOM. Как правило, для этого переключателя можно оставить режим Default, предлагаемый по умолчанию (описание этого и других уровней проверки подлинности DCOM приведено в разделе "Безопасность при работе с WMГ главы 1). Установка флажка Enable all privileges позволит средствами WMI выполнять операции, для которых необходимы специальные привилегии в операционной-системе (например, перезагрузку компьютера). После нажатия кнопки ОК в окне Login и подключения к структуре WMI на нужном компьютере, в окне Browse For Namespace появится иерархический список всех классов из репозитория CIM на этом компьютере (рис. 2.53). Рис. 2.53. Выбор нужного пространства имен из списка Выбрав требуемое пространство имен из списка и нажав кнопку ОК, мы вновь попадаем в диалоговое окно Login (см. рис. 2.51), где нужно ввести необходимую информацию и нажать кнопку ОК. Замечание Независимо от способа подключения пользователь должен иметь доступ к выбранному пространству имен WMI. Перейдем теперь к рассмотрению трех основных администраторских утилит WMI.
WMICIM Studio Утилита WMI CIM Studio является универсальным инструментом при работе со схемой CIM, которая позволяет: □ осуществлять навигацию по иерархическому дереву классов CIM; □ формировать список всех экземпляров определенного класса; □ добавлять новые и удалять существующие классы или экземпляры классов (объекты); □ просматривать и изменять (если это возможно) свойства, методы, квали- фикаторы и ассоциации классов или объектов; □ выполнять методы классов или объектов; □ генерировать для класса или объекта его описание на языке MOF и компилировать имеющийся MOF-файл в репозиторий CIM. Приложение WMI CIM Studio реализовано в виде двух окон, которые открываются в браузере Internet Explorer (рис. 2.54). Левое окно называется проводником классов (Class Explorer), а правое — про- смотрщиком классов (Class Viewer). Выбрав класс в левом окне, можно просмотреть информацию о нем в правом окне. Рис. 2.54. Главное окно утилиты WMI CIM Studio
Проводник классов (Class Explorer) В окне проводника классов выводится иерархическая структура (схема) наследуемых классов в выбранном пространстве имен WMI. Слева от наименований классов расположены значки различных оттенков, которые указывают на тип класса (табл. 2.4). Таблица 2.4. Описание типов объектов Значок Описание Определяет обычный класс Определяет абстрактный класс, у которого в качестве наследников определены обычные классы Определяет абстрактный класс, у которого нет наследников Определяет обычный ассоциативный класс Определяет абстрактный ассоциативный класс, у которого в качестве наследников определены обычные ассоциативные классы Определяет абстрактный ассоциативный класс, у которого нет наследников Некоторые операции (например, генерация исходного текста на языке MOF) в WMI CIM Studio могут выполняться сразу над несколькими классами. Для этого нужно выделить эти классы в списке, установив флажки возле-названий классов (рис. 2.55). Рис. 2.55. Выделение нескольких классов в проводнике Также можно выбрать сразу все классы в списке — для этого нужно нажать правую кнопку мыши и выбрать во всплывающем меню пункт Select all. Для
отмены выбора всех отмеченных классов используется пункт Unselect all этого меню. Кроме иерархического списка классов в окне проводника имеются четыре кнопки, которые описаны в табл. 2.5. Таблица 2.5. Кнопки в проводнике классов Кнопка Название Описание Browse for Позволяет просмотреть и выбрать пространство Namespace имен для подключения на локальном или удаленном компьютере Search for Class Позволяет провести поиск класса в текущем пространстве имен Add class Добавляет новый класс в репозиторий CIM Delete class Удаляет класс из репозитория CIM Просмотрщик классов (Class Viewer) Окно просмотрщика классов предназначено для вывода детальной информации о классе, выбранном в левом окне проводника классов, или о конкретном экземпляре этого класса. Вкладка Properties позволяет увидеть свойства, имеющиеся у выбранного класса (рис. 2.56). Рис. 2.56. Свойства класса Win32_Process (вкладка Properties)
Методы, имеющиеся у выбранного класса, можно посмотреть на вкладке Methods (рис. 2.57). Рис. 2.57. Методы класса Win32_Process (вкладка Methods) Рис. 2.58. Ассоциативные связи класса win32_Process с другими классами (вкладка Associations)
Наконец, вкладка Associations позволяет увидеть в графическом виде ассоциативные связи выбранного класса с другими классами WMI (рис. 2.58). Также в окне просмотрщика классов имеются несколько кнопок, которые описаны в табл. 2.6. Таблица 2.6. Кнопки в просмотрщике классов Кнопка Название Описание Create instance Delete instance Back Forward Save Instances Views WQL Query Help for Class Создает новый экземпляр выбранного класса Удаляет выбранный экземпляр класса Просмотр предыдущей страницы Просмотр следующей страницы Сохранение измененной информации в репозитории CIM Выводит в виде таблицы список всех экземпляров выбранного класса Позволяет изменить список отображаемых свойств класса. Здесь можно выбрать, следует ли показывать системные и наследуемые свойства класса Открывает редактор WQL-запросов, в котором можно создавать, выполнять, сохранять и удалять запросы на языке WQL Выводит справочную информацию о выбранном классе или о классе выбранного экземпляра Рассмотрим теперь подробнее некоторые функции WMI CIM Studio, которые могут пригодиться администратору операционной системы в повседневной работе. Поиск класса Имеющиеся в WMI CIM Studio средства поиска позволяют быстро найти класс по его названию, в том числе и неполному. Это бывает очень удобно в тех случаях, когда вы не знаете точного расположения нужного класса в информационной схеме или не помните точного названия этого класса. Для того чтобы найти нужный класс в текущем пространстве имен, необходимо в окне проводника классов нажать кнопку Search for Class, после чего на экран выведется диалоговое окно Search for Class (рис. 2.59).
Рис. 2.59. Диалоговое окно Search for Class для поиска классов WMI Рис. 2.60. Результаты поиска слова Process в именах классов Параметры поиска задаются в группе Search Options. Поиск может осуществляться по имени класса (флажок Search class names), по описанию класса (флажок Search class descriptions) и по имени свойства класса (флажок Search property names).
Замечание При поиске по имени свойства учитываются только имена локальных (т. е. не наследуемых и не системных) свойств класса. Текст для поиска может быть указан полностью или частично. Процесс поиска начинается при нажатии кнопки Go, результаты будут выведены в список Search results. Отметим, что поиск не зависит от используемого регистра символов и производится по вхождению части слова. Например, если в качестве текста для поиска мы зададим слово Process, а искать его будем только в названиях классов, то в список Search results будут помещены все классы, в название которых входит слово Process (рис. 2.60). Если выбрать из списка найденных классов нужный класс и нажать кнопку ОК, то этот класс будет выбран в проводнике классов. Просмотр экземпляров класса Для каждого класса в выбранном пространстве имен WMI можно с помощью кнопки Instances в окне просмотрщика классов сформировать таблицу всех его экземпляров. Например, для просмотра всех запущенных в системе процессов нужно в проводнике классов выделить класс win32_process и нажать кнопку Instances. В результате в правом окне просмотрщика классов будет выведен список всех экземпляров класса win32_Process с их общими свойствами (если у выделенного класса нет экземпляров, то в таблице экземпляров появится сообщение No Instances Available), кнопка Instances при этом продолжает находиться в нажатом положении (рис. 2.61). Рис. 2.61. Таблица экземпляров для класса Win32_Process
Если теперь дважды щелкнуть левой кнопки мыши на каком-либо экземпляре, то мы получим диалоговое окно с детальной информацией об этом экземпляре (рис. 2.62). После этого кнопка Instances автоматически переходит в ненажатое положение (таким образом, кнопка Instances позволяет переключаться в правом окне между таблицей всех экземпляров класса и про- смотрщиком классов для выбранного объекта). Рис. 2.62. Информация об экземпляре класса Win32_Process Замечание Для получения детальной информации об экземпляре класса можно также щелкнуть правой кнопкой мыши на этом объекте и выбрать пункт Go to Object в контекстном меню. Просмотр и изменение квалификаторов класса или объекта Для того чтобы получить доступ к квалификаторам класса или объекта, нужно сначала получить описание этого класса или экземпляра в правом окне просмотрщика классов. Затем, находясь на вкладке Properties или Methods, следует щелкнуть правой кнопкой мыши и выбрать во всплывающем меню пункт Object Qualifiers. В результате этого на экран будет выведено диалоговое окно Qualifiers for class, содержащее список всех квалификаторов класса или объекта (рис. 2.63).
Рис. 2.63. Квалификаторы класса Win32_Process Как мы видим, в этом списке для каждого квалификатора будут выведены его имя, тип и значение, а также дополнительные атрибуты, позволяющие, скажем, распространять квалификатор на дочерние классы или экземпляры классов. В случае необходимости квалификаторы в этом окне можно редактировать, нажав затем кнопку ОК для сохранения сделанных изменений. Просмотр и изменение свойств класса или объекта Для того чтобы получить доступ к свойствам класса или объекта, нужно получить описание этого класса или экземпляра в правом окне просмотрщика классов и выбрать там вкладку Properties. На экран будет выведена таблица, содержащая имя поля, его тип и значение (рис. 2.64). Значки, которые нарисованы слева от имени свойства, предоставляют дополнительную информацию об этих свойствах (табл. 2.7). Таблица 2.7. Типы свойств классов Символ Описание Указывает на то, что свойство является ключевым, т. е. используется при задании пути к экземпляру класса
Таблица 2.7 (окончание) Символ Описание Определяет системное свойство, имя которого всегда начинается с двух подчеркиваний. Системные свойства нельзя создавать, изменять или удалять Определяет локальное свойство класса, т. е. свойство, которое было определено непосредственно в этом классе Определяет свойство, которое было наследовано от класса-предка Нарисованная ручка на символе свойства означает, что значение этого свойства должно быть доступно для редактирования Рис. 2.64. Список всех свойств экземпляра класса win32__Process Для изменения значения свойства нужно щелкнуть мышью в столбце Value этого свойства, ввести новое значение и нажать кнопку Save для сохранения сделанных изменений в репозитории CIM. Замечание Не всегда свойство, на котором нарисована ручка, можно редактировать. Для того чтобы наверняка узнать, доступно ли свойство для редактирования, нужно проверить, имеется ли у этого свойства квалификатор write. Если такой ква- лификатор для свойства определен и его значение равно True, то значение свойства можно изменять.
Просмотр и изменение квалификаторов свойства Для работы с квалификаторами нужно щелкнуть правой кнопкой мыши на требуемом свойстве и выбрать пункт Property Qualifiers во всплывающем меню. После этого на экран будет выведено диалоговое окно Qualifiers for property со списком всех квалификаторов, которые заданы для этого свойства (рис. 2.65). Рис. 2.65. Список квалификаторов для свойства Handle класса Win32_Process Сортировка и фильтрация свойств Маленький треугольник в заголовке столбца показывает, что значения из этого столбца используются для сортировки выводимых строк, а также указывает на порядок этой сортировки (по возрастанию или убыванию значений). Для изменения столбца для сортировки нужно щелкнуть мышью по нужному заголовку. По умолчанию при просмотре свойств класса или экземпляра на экран выводятся все его свойства (системные, наследуемые и локальные). Имеется возможность скрыть системные и наследуемые свойства — для этого необходимо нажать кнопку Views и выбрать пункт Property Filters в появляющемся меню. В результате на экран выводится диалоговое окно Select Properties (рис. 2.66).
Рис. 2.66. Диалоговое окно Select Properties Рис. 2.67. Список только локальных свойств класса Win32_Process Для того чтобы убрать из списка системные или наследуемые свойства, нужно в этом окне снять флажок Show system properties или Show inherited properties (рис. 2.67). Просмотр и изменение методов класса или объекта Для работы с методами класса или объекта нужно получить описание этого класса или экземпляра в правом окне просмотрщика классов и выбрать там >9£ладку Methods, в результате чего на экран будет выведен список всех его методов (рис. 2.68).
Рис. 2.68. Список методов класса win32_Process Просмотр и изменение параметров метода Щелкнув правой кнопкой мыши на нужном методе и выбрав пункт Edit Method Parameters во всплывающем меню, мы вызовем диалоговое окно со списком входных и выходных параметров этого метода (рис. 2.69). Для каждого параметра здесь приведены имя, тип (его можно выбирать из выпадающего списка) и собственно значение. Значок, находящийся в первой колонке слева, определяет вид параметра: если стрелка направлена вправо, то параметр является входным, если влево — выходным. Двусторонняя стрелка означает, что параметр является как входным, так и выходным. В поле Return Value выводятся тип возвращаемого методом значения и само это значение. Каждый параметр метода может иметь собственные квалификаторы. Для их просмотра или изменения необходимо щелкнуть правой кнопкой мыши на этом параметре и выбрать во всплывающем меню пункт Parameter Qualifiers. В результате на экран будет выведено диалоговое окно Qualifiers for method parameter, где в списке будут представлены имя квалификатора, его тип, дополнительные параметры и значение, которое определено для этого квалификатора (рис. 2.70).
Рис. 2.69. Список входных и выходных параметров для метода Create класса Win32_Process Рис. 2.70. Список квалификаторов для параметра CommandLine метода Create
Просмотр и изменение квалификаторов метода Для работы с квалификаторами нужно щелкнуть правой кнопкой мыши над требуемым методом и выбрать пункт Method Qualifiers во всплывающем меню, в результате чего на экран будет выведено диалоговое окно Qualifiers for method со списком всех квалификаторов, которые заданы для этого метода (рис. 2.71). Рис. 2.71. Список квалификаторов для метода Create класса win32_Process Просмотр ассоциативных связей для класса или объекта Напомним, что различные классы и объекты в схеме CIM могут быть связаны (ассоциированы) друг с другом посредством специальных ассоциативных классов. Утилита WMI CIM Studio позволяет для выбранного класса или экземпляра класса увидеть в удобном графическом представлении все связанные с ним классы или экземпляры, которые находятся в текущем пространстве имен WMI. Для этого нужно получить описание требуемого класса или объекта в правом окне просмотрщика классов и выбрать там вкладку Associations, в результате чего на экран будет выведена диаграмма, которая показывает, какие классы или экземпляры и посредством каких ассоциативных классов связаны с текущим классом или объектом. Например, класс Win32_Process СВЯЗан С Классами Win32_ComputerSystem, Win32_LogonSession И Win32_NamedJobObject (рис. 2.72).
Рис. 2.72. Список классов, ассоциированных с классом Win32_Process Как мы видим, в левой части диаграммы изображен символ объекта, который представляет текущий класс (в нашем случае это win32_Process). Каждая ветка, идущая от текущего класса, представляет ассоциацию (соединение) этого класса с другим классом. Символы в правой части диаграммы соответствуют классам, ассоциированным с текущим. Если навести указатель мыши на символ ассоциативного класса в середине определенной ветки, то выведется название этого ассоциативного класса. Для нашего примера мы получаем, что win32_Process связан С Win32_ComputerSystem посредством класса Win32_SystemProcesses, С Win32_LogonSession — посредством Класса Win32_SessionProcess И С Win32_NamedJobObject — посредством класса Win32_NamedJobObjectProcess. Если навести указатель мыши на соединительные линии с каждой стороны от символа ассоциативного класса, то можно увидеть, с помощью каких свойств ассоциативного класса производится связь двух классов между собой (иначе говоря, можно узнать роль каждого класса в ассоциативной СВЯЗИ). Например, В ассоциативном классе Win32_NamedJobObjectProcess ССЫЛКа на класс Win32_NamedJobObject хранится В ПОЛе Collection, а на класс win32_Process — в поле Member. Таким образом, в ассоциированной Паре Win32_Process - Win32_NamedJobObject ДЛЯ класса Win32_NamedJobObject определена роль collection (коллекция), а для класса win32_Process — роль Member (экземпляр коллекции).
С помощью ассоциативной диаграммы можно в окне просмотрщика классов быстро переходить к тем объектам, которые представлены на этой диаграмме — для этого достаточно дважды щелкнуть мышью на символе соответствующего класса. После этого в просмотрщике событий будет открыта вкладка Associations для этого выбранного объекта. Если посмотреть ассоциативную диаграмму для конкретного экземпляра класса, то можно увидеть, какие экземпляры других классов с ним связаны. Например, запустим стандартный Блокнот Windows (notepad.exe), откроем в WMI CIM Studio экземпляр класса win32_Process, который ему соответствует, и перейдем на вкладку Associations в просмотрщике (рис. 2.73). Рис. 2.73. Список классов, ассоциированных с экземпляром класса win32_Process Как мы видим, здесь можно, например, узнать, какие динамические библиотеки (DLL-файлы) использует Блокнот для своей работы (связь процесса с динамическими библиотеками осуществляется с помощью ассоциативного класса CIM_ProcessExecutable). Выполнение методов класса Как уже упоминалось ранее, список методов, объявленных в текущем классе или экземпляре класса, находится на вкладке Methods просмотрщика классов. Отметим, что метод может объявляться в классе и присутствовать в этом списке, но не иметь реализации в провайдере класса (естественно, что запускать такой метод нет никакого смысла). Поэтому, перед тем как выполнять какой-либо метод, нужно убедиться, что он реализован в провай-
дере. Признаком того, что метод имеет реализацию, служит наличие у него квалификатора implemented со значением True. Кроме этого, следует учитывать, что существенная часть методов выполняется только в экземплярах классов, а непосредственно в классе может быть выполнен лишь тот метод, у которого определен квалификатор static со значением True (при этом в экземплярах класса такой метод запустить нельзя). В качестве примера выполним метод create класса win32_process для создания нового экземпляра этого класса, т. е. с целью запуска нового процесса Windows (в нашем случае Блокнота). Для этого мы сначала открываем описание класса win32_Process в окне просмотрщика классов и переходим на вкладку Methods (см. рис. 2.68). Метод create имеет квалификаторы Implemented И Static CO значением True (СМ. рис. 2.71), ПОЭТОМУ ЭТОТ МеТОД можно выполнить из класса (все другие методы, имеющиеся в списке, могут быть выполнены только из экземпляров класса). Щелкнем теперь правой кнопкой мыши на методе create и выберем во всплывающем меню пункт Execute Method, в результате чего на экране появится диалоговое окно со списком входных (стрелка вправо) и выходных (стрелка влево) параметров метода create (рис. 2.74). Рис. 2.74. Входные и выходные параметры метода Create класса Win32_Process до запуска
Здесь обязательным для заполнения является параметр commandLine (команда, используемая для запуска нового процесса). В нашем примере мы в столбце Value строки commandLine заносим значение Notepad.exe и нажимаем кнопку Execute для запуска метода с введенными параметрами. После этого должно открыться новое окно Блокнота, а в выходной параметр Processid занестись значение идентификатора запущенного процесса (рис. 2.75). Parameters of Win3? Process->Create Рис. 2.75. Входные и выходные параметры метода Create класса Win32_Process после выполнения Как мы видим, в нашем случае вновь запущенному процессу присвоен идентификатор 2280. Теперь окно со списком параметров метода можно закрыть с помощью кнопки Close. Для завершения работы только что запущенного Блокнота нужно выполнить метод Terminate в экземпляре класса win32_Process, который соответствует этому процессу. Откроем список всех экземпляров класса win32_process, найдем в нем процесс, в свойстве Handle которого записан идентификатор 2280, и перейдем к этому объекту (на вкладке Methods здесь будут представлены те же методы, что и в самом классе win32_Process). Щелкнув правой кнопкой мыши над методом Terminate и выбрав во всплывающем меню пункт Execute Method, мы выведем на экран диалоговое окно с единственным параметром Reason метода Terminate (рис. 2.76). Нажав кнопку Execute, мы закроем окно Блокнота.
Рис. 2.76. Параметр метода Terminate экземпляра класса Win32_Process Выполнение WQL-запросов С помощью WMI CIM Studio можно составлять и выполнять различные запросы на языке WQL, причем в отличие от тестера WMI, введенные запросы можно запоминать и пользоваться ими постоянно, не вводя каждый раз длинные выражения. Для работы с WQL-запросами необходимо нажать кнопку WQL Query в просмотрщике классов, в результате чего откроется диалоговое окно Query (рис. 2.77). В этом окне можно вводить текст запросов (поле Query), давать имена этим запросам (поле Name), запоминать их в списке (кнопка Save Query) и выполнять (кнопка Execute). Сохраненные запросы остаются в списке и после выхода из WMI CIM Studio, удалить их можно с помощью кнопки Remove Query. Например, еСЛИ Нам НУЖНО ВЫбратЬ Экземпляр Класса Win32_LogicalDisk, который соответствует логическому диску С, то можно ввести в поле Query следующий запрос: SELECT * FROM Win32_LogicalDisk WHERE DeviceID='С:' Запомним теперь его в списке сохраненных запросов под именем show Disk (рис. 2.78).
Рис. 2.77. Диалоговое окно Query для работы с WQL-запросами Рис. 2.78. Сохраненный запрос Show Disk
Теперь для выполнения этого запроса нужно нажать кнопку Execute (рис. 2.79). Рис. 2.79. Результат выполнения запроса Show Disk Генерация MOF-файлов для классов или объектов В WMI CIM Studio встроен мастер генерации MOF-файлов (MOF Generator Wizard), который позволяет сгенерировать файл, содержащий описание на языке MOF любого класса или экземпляра класса из имеющихся в репози- тории CIM. С помощью этого мастера удобно, например, переносить определения каких-нибудь специфических классов из репозитория одной машины на другой компьютер. Рассмотрим для примера, каким образом можно получить MOF-файл с описанием класса win32_Process. Для этого сначала нужно выбрать класс win32_Process в проводнике классов, установив флажок возле его имени, и нажать кнопку MOF Generator для вызова мастера генерации MOF (рис. 2.80). После нажатия кнопки Далее (Next) открывается диалоговое окно со списком классов, которые были отмечены для генерации кода MOF (в нашем случае это один класс win32_Process). Также в этом окне можно отметить конкретные экземпляры обрабатываемого класса, для которых будет сгенерировано описание — с этой целью необходимо установить флажки у нужных экземпляров (рис. 2.81). Если в MOF-файл требуется поместить описание только для экземпляров класса, то нужно снять флажок Include class definition. Мы собираемся генерировать описание только непосредственно для класса, поэтому не будем устанавливать никаких дополнительных флажков и нажмем кнопку Далее (Next). В следующем окне запрашивается имя создаваемого MOF-файла (поле MOF File Name) и каталог, в котором он будет находиться (поле Directory for the MOF file). Также здесь можно установить флажок Unicode, если выходной MOF-файл должен быть в кодировке Unicode (рис. 2.82).
Рис. 2.80. Мастер генерации MOF-файлов Рис. 2.81. Выбор классов и экземпляров для включения в MOF-файл
Рис. 2.82. Установка месторасположения и кодировки MOF-файла Рис. 2.83. Сообщение о генерации MOF-файла Нажав кнопку Готово (Finish), мы получим сообщение об успешной генерации MOF-файла (рис. 2.83). В листинге 2.1 приведен файл, который был получен в результате проведенной генерации описания класса win32_Process. //••••••••••••••••••••••••********^ //* File: NewMOF.mof Листинг 2.1. Файл Eviewer.mof /у*****************************************************
/у***************************************** //* This MOF was generated from the "\\.\ROOT\CIMV2" //* namespace on machine "HOME". //* To compile this MOF on another machine you should edit this pragma, //•it*************************** #pragma namespace("\\\\.\\ROOT\\CIMV2") //* Class: Win32_Process //* Derived from: CIM_Process [dynamic: Tolnstance, provider("СIMWin32"): Tolnstance, SupportsCreate, CreateBy("Create"), SupportsDelete, DeleteBy("Deletelnstance"), Locale(1033) : Tolnstance, UUID("{8502C4DC-5FBB-11D2-AAC1-006008C78BC7}") : Tolnstance] class Win32_Process : CIM_Process { [Units("100ns"): ToSubClass, Override("KerneIModeTime")] uint64 KernelModeTime = NULL; [read: ToSubClass, Override("Priority"): ToSubClass, Mappingstrings{"Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|BasePriority"}: ToSubClass] uint32 Priority = NULL; [Units("100ns"): ToSubClass, Override("UserModeTime")] uint64 UserModeTime = NULL; [read: ToSubClass, Privileges{"SeDebugPrivilege"}: ToSubClass, MappingStrings{"Win32API|Tool Help Structures|MODULEENTRY32|szExePath"}: ToSubClass] string ExecutablePath; [read: ToSubClass, Units("Kilobytes"): ToSubClass, Privileges{"SeDebugPrivilege"}: ToSubClass, MappingStrings{"Win32|WINNT.H|QUOTA_LIMITS|MaximumWorkingSetSize"}: ToSubClass] uint32 MaximumWorkingSetSize; [read: ToSubClass, Units("Kilobytes"): ToSubClass, Privileges{"SeDebugPrivilege"}: ToSubClass, MappingStrings{"Win32|WINNT.H|QUOTA_LIMITS|MinimumWorkingSetSize"}: ToSubClass] uint32 MinimumWorkingSetSize; [read: ToSubClass, MappingStrings{"Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|PageFaultCount"}: ToSubClass] uint32 PageFaults; [read: ToSubClass, Units("Kilobytes"): ToSubClass, MappingStrings{"Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|PagefileUsage"}: ToSubClass] uint32 PageF i1eUs age;
[read: ToSubClass, Units("Kilobytes"): ToSubClass, MappingStrings{"Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|PeakPagefileUsage"}: ToSubClass] uint32 PeakPageFileUsage; [read: ToSubClass, Units("Kilobytes"): ToSubClass, Mappingstrings{"Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|PeakWorkingSetSize"}: ToSubClass] uint32 PeakWorkingSetSize; [read: ToSubClass, Mappingstrings{"Win32API|Process and Thread Structures | PROCESS_INFORMATION|dwProcessId "}: ToSubClass] uint32 Processld; [read: ToSubClass, MappingStrings{"Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|QuotaNonPagedPoolUsage"}: ToSubClass] uint32 QuotaNonPagedPoolUsage; [read: ToSubClass, MappingStrings{"Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|QuotaPagedPoolUsage"}: ToSubClass] uint32 QuotaPagedPoolUsage; [read: ToSubClass, MappingStrings{"Win32API|Process Status | SYSTEM_PROCESS_INFORMATION | QuotaPeakNonPagedPoolUsage" } : ToSubClass] uint32 QuotaPeakNonPagedPoolUsage; [read: ToSubClass, MappingStrings{"Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|QuotaPeakPagedPoolUsage"}: ToSubClass] uint32 QuotaPeakPagedPoolUsage; [read: ToSubClass, MappingStrings{"Win32API|Process and Thread Functions|GetProcessVersion"}: ToSubClass] string WindowsVersion; [read: ToSubClass, MappingStrings{"Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|NumberOfThreads"}: ToSubClass] uint32 ThreadCount; [read: ToSubClass, MappingStrings{"Win32API|Process Status|SYSTEM_PROCESS_INFORMATIONIHandleCount"}: ToSubClass] uint32 HandleCount; [read: ToSubClass, MappingStrings{"Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|InheritedFromUniqueProcessId"}: ToSubClass] uint32 ParentProcessId; [read: ToSubClass, MappingStrings{"Win32API|Process Status| SYSTEM_PROCESS_INFORMATION|SessionId"}: ToSubClass] uint32 Sessionld; [read: ToSubClass, MappingStrings{"Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|PrivatePageCount"}: ToSubClass] uint64 PrivatePageCount; [read: ToSubClass, Units("Bytes"): ToSubClass, MappingStrings {"Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|PeakVirtualSize"}: ToSubClass] uint64 PeakVirtualSize; [read: ToSubClass, Units("Bytes"): ToSubClass, MappingStrings {"Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|VirtualSize"}: ToSubClass] uint64 VirtualSize; [read: ToSubClass, MappingStrings{"Win32API|Process and Thread Structures|SYSTEM_PROCESS_INFORMATION|ReadOperationCount"}: ToSubClass] uint64 ReadOperationCount;
[read: ToSubClass, MappingStrings{"Win32API|Process and Thread Structures|SYSTEM_PROCESS_INFORMATION|WriteOperationCount"}: ToSubClass] uint64 WriteOperationCount; [read: ToSubClass, MappingStrings{"Win32API|Process and Thread Structures|SYSTEM_PROCESS_INFORMATION|OtherOperationCount"}: ToSubClass] uint64 OtherOperationCount; [read: ToSubClass, Units("Bytes"): ToSubClass, MappingStrings{"Win32API|Process and Thread Structures |SYSTEM_PROCESS_INFORMATION|ReadTransferCount"}: ToSubClass] uint64 ReadTrans ferCount; [read: ToSubClass, Units("Bytes"): ToSubClass, MappingStrings{"Win32API|Process and Thread Structures |SYSTEM_PROCESS_INFORMATION|WriteTransferCount"}: ToSubClass] uint64 WriteTransferCount,• [read: ToSubClass, Units("Bytes"): ToSubClass, MappingStrings{"Win32API|Process and Thread Structures |SYSTEM_PROCESS_INFORMATION|OtherTransferCount"}: ToSubClass] uint64 OtherTrans ferCount; [read: ToSubClass] string CommandLine; [Constructor, Static, Implemented, Privileges{"SeAssignPrimaryTokenPrivilege", "SelncreaseQuotaPrivilege"}: ToSubClass, ValueMap{"0", "2", "3", "8", "9", "21", ".."}: ToSubClass, MappingStrings{"Win32API|Process and Thread Functions|CreateProcess"}: ToSubClass] uint32 Create([In, MappingStrings{"Win32API|Process and Thread Functions|lpCommandLine "}: ToSubClass] string CommandLine, [In, MappingStrings{"Win32API|Process and Thread Functions|CreateProcess|lpCurrentDirectory "}: ToSubClass] string CurrentDirectory, [In, MappingStrings{"WMI|win32_ProcessStartup"}: ToSubClass] Win32_ProcessStartup ProcessStartupInformation, [Out, MappingStrings{"Win32API|Process and Thread Functions|CreateProcess|lpProcessInformation|dwProcessId"}: ToSubClass] uint32 Processld); [Destructor, Implemented, ValueMap{"0", "2", "3", "8", "9", "21", ".."}: ToSubClass, MappingStrings{"Win32API|Process and Thread Functions|TerminateProcess"}: ToSubClass] uint32 Terminate([In, MappingStrings{"Win32API|Process and Thread Functions| TerminateProcess|uExitCode "}: ToSubClass] uint32 Reason); [Implemented, ValueMap{"0", "2", "3", "8", "9", "21", ".."}: ToSubClass, MappingStrings{"WMI"}: ToSubClass] uint32 GetOwner([Out, MappingStrings{"WMI"}: ToSubClass] string User, [Out, MappingStrings {"WMI"}: ToSubClass] string Domain); [Implemented, ValueMap{"0", "2", "3", "8", "9", "21", ".."}: ToSubClass, MappingStrings{"WMI"}: ToSubClass] uint32 GetOwnerSid([Out, MappingStrings{"WMI"}: ToSubClass] string Sid); [Implemented, ValueMap{"0", "2", "3", "8", "9", "21", ".."}: ToSubClass, MappingStrings{"Win32API|Process and Thread Functions| SetPriorityClass"}: ToSubClass] uint32 SetPriority([in, MappingStrings{"Win32API|Process and Thread Functions|SetPriorityClass| dwPriorityClass"}: ToSubClass,
ValueMap{"0x00000040", "0x00004000", "0x00000020", "0x00008000", "0x00000080", "0x00000100"}: ToSubClass] sint32 Priority); [ValueMap{"0", "2", "3", "8", "9", "21", ".."}: ToSubClass, Inplemented] uint32 AttachDebugger () ; }; //* EOF NewMOF.mof Компиляция MOF-файлов Имеющийся в WMI CIM Studio мастер компиляции MOF-файлов (MOF Compiler Wizard) позволяет импортировать любые определения классов и экземпляров из файлов MOF в репозиторий CIM на локальном или удаленном компьютере, а также проводить проверку синтаксиса и создавать бинарные MOF-файлы. Для администратора операционной системы компилирование MOF-файла может понадобиться, например, при регистрации в репозиторий CIM стандартных потребителей событий WMI. Для запуска мастера компиляции MOF-файлов используется значок MOF Compiler Если дважды щелкнуть мышью на этом значке, то на экран выведется первый экран мастера (рис. 2.84). Рис. 2.84. Мастер компиляции MOF-файлов
Здесь нужно выбрать, какую именно операцию должен выполнить мастер: компилировать описание классов или экземпляров из MOF-файла (Compile a .MOF file), проверить правильность синтаксиса MOF-файла (Check the syntax of a .MOF file) или создать из текстового MOF-файла бинарный (Create a binary .MOF file). Мы для примера выполним компиляцию файла scrcons.mof с описанием стандартного потребителя событий ActiveScriptEventConsumer В пространство имен cimv2 удаленного компьютера с именем Shikin. Для этого установим переключатель в положение Compile a .MOF file и нажмем кнопку Далее (Next). В следующем окне мастера нужно выбрать MOF-файл для компиляции (поле Path and file name for .MOF file) и указать, в какое пространство имен следует занести информацию из этого файла (поле Namespace) (рис. 2.85). Рис. 2.85. Выбор MOF-файлов и пространства имен для компиляции Для нашего примера мы с помощью кнопки Browse выбираем файл scrcons.mof из каталога %SystemRoot%\System32\Wbem, а в качестве пространства имен указываем \\Shikin\Root\CIMV2. С помощью кнопки User- name можно указать в диалоговом окне WMI MOF Compiler Wizard User Credentials учетные данные пользователя, от имени которого будет произво-
диться доступ к пространству имен WMI на удаленном компьютере (рис. 2.86). Рис. 2.86. Ввод учетных данных для доступа к пространству имен WMI на удаленном компьютере После внесения всей необходимой информации нажимаем кнопку Далее (Next), после чего на экран выводится последнее диалоговое окно мастера, в котором нужно указать, какие действия должны выполняться при занесении компилируемых классов или экземпляров в репозиторий CIM (рис. 2.87). Рис. 2.87. Параметры обновления классов или экземпляров в репозиторий CIM Положение Create new classes and change existing classes переключателя Classes позволяет при компиляции создавать новые классы и изменять уже
существующие, Create new classes — только создавать новые классы, Change existing classes — только изменять существующие классы. Переключатель Instances позволяет производить аналогичные настройки для экземпляров классов. После нажатия кнопки Готово (Finish) определения классов и экземпляров занесутся в указанное пространство имен и на экран выведется сообщение об удачном завершении операции. WMI Object Browser Утилита WMI Object Browser позволяет осуществлять навигацию по иерархическому дереву объектов WMI, просматривать и редактировать (если это возможно) свойства, методы, квалификаторы и ассоциации экземпляров классов, а также выполнять методы этих экземпляров. Главное отличие WMI Object Browser от WMI CIM Studio состоит в том, что в WMI CIM Studio мы пользуемся списком классов CIM в выбранном пространстве имен WMI, а в WMI Object Browser на экран выводится дерево объектов, причем в качестве корневого объекта здесь может использоваться произвольный экземпляр выбранного нами класса, а само дерево объектов строится с помощью ассоциативных классов (рис. 2.88). Рис. 2.88. Утилита WMI Object Browser
Можно сказать, что утилита WMI Object Browser разработана, в большей мере, для применения системными администраторами, которые могут не иметь детального представления о назначении конкретных классов WMI и о структуре CIM вообще. Здесь вся информация (схема), которая содержится в репозитории CIM, представлена в более понятном и наглядном виде, чем в WMI CIM Studio. Например, по умолчанию корневым объектом в пространстве имен cimv2 на локальном или удаленном компьютере является Экземпляр класса Win32_ComputerSystem, у КОТОрОГО Значение СВОЙСТВа Name совпадает с именем этого компьютера. Поэтому в корне дерева стоит объект с именем компьютера, а ниже в иерархическом порядке располагаются все его зависимые объекты (логические и физические компоненты этого компьютера) (см. рис. 2.88). Таким образом, даже человеку, который не владеет глубокими знаниями о схеме классов WMI, в WMI Object Browser наглядно видно представление компьютера в качестве дерева его составных частей, причем каждую часть здесь можно детально изучить и произвести с ней необходимые манипуляции, не прибегая к помощи никаких дополнительных программных средств. Напомним, что для запуска WMI Object Browser, как и других административных утилит WMI, нужно выбрать одноименный пункт в меню Пуск | Программы | WMI Tools (Start | Programs | WMI Tools), после чего производится подключение к нужному пространству имен на локальном или удаленном компьютере (см. разд. "Подключение к пространству имен WMI" данной главы). Внешне утилита WMI Object Browser очень похожа на WMI CIM Studio, здесь также имеются два окна, которые открываются в браузере Internet Explorer (см. рис. 2.88). Левое окно называется проводником объектов (Object Explorer), а правое — просмотрщиком объектов (Object Viewer). Выбрав объект в левом окне, можно просмотреть информацию о нем в правом окне. Проводник объектов (Object Explorer) В окне проводника объектов показано иерархическое дерево (граф), состоящее из экземпляров классов определенного пространства имен WMI (по умолчанию это пространство имен Root\ciMV2 локального компьютера) и узлов-контейнеров (обычных или ассоциативных) этого же пространства имен. Иерархия между объектами строится с помощью ассоциативных классов, определенных в CIM. Слева от наименований элементов дерева в проводнике объектов выводятся значки, которые указывают на тип этих элементов (табл. 2.8).
Таблица 2.8. Типы объектов и узлов-контейнеров в проводнике объектов Символ Описание Обычный объект, которому соответствует экземпляр класса WMI Обычный узел-контейнер, которому соответствует обычный класс WMI Ассоциативный узел-контейнер, которому соответствует ассоциативный класс WMI Отображаемое дерево объектов всегда начинается с конкретного экземпляра в выбранном пространстве имен (далее, в процессе работы, любой объект из пространства имен может быть выбран в качестве корневого элемента дерева). По умолчанию в пространстве Root\ciMV2 корневым элементом является объект Win32_ComputerSystem.Name=" CompName", где CompName— ИМЯ компьютера (в рассматриваемых нами примерах компьютер имеет имя SHIKIN). Ниже корневого элемента представлен список всех связанных с ним ассоциативных узлов-контейнеров, т. е. список ассоциативных классов, в которых определена ссылка на этот объект (если, конечно, такие классы имеются в CIM) (рис. 2.89). Рис. 2.89. Список узлов-контейнеров (ассоциативных классов), связанных с корневым элементом
Как мы видим, имена этих узлов-контейнеров имеют вид association.role, где association — это собственно имя ассоциативного класса, a role указывает на роль объектов (например, Partcomponent или setting), которые связаны посредством ассоциативного класса с корневым элементом (напомним, что роль объекта определяется именем поля в ассоциативном классе, в котором хранится ссылка на этот объект). Например, одним из ассоциативных узлов-контейнеров, связанных с корневым элементом win32_ ComputerSystem.Name="SHIKIN", является Win32_SystemProcesses . Part Component. В свою очередь, на один уровень ниже ассоциативного узла-контейнера могут находиться либо объекты, которые являются экземплярами разных классов WMI (по одному объекту для каждого класса), либо обычные узлы- контейнеры (классы WMI), содержащие несколько объектов-экземпляров одного класса. Например, внутри ассоциативного узла-контейнера Win32_SystemProcesses. PartComponent расположен обычный узел- контейнер win32_Process, содержащий объекты, соответствующие запущенным в операционной системе процессам (рис. 2.90). Рис. 2.90. Объекты, содержащиеся внутри узла-контейнера Win32_Process Далее ниже каждого объекта-процесса вновь находятся ассоциативные узлы- контейнеры CIM_ProcessExecutable.Antecedent И Win32_SessionProcess.Antecedent, соответствующие ассоциативным классам, посредством которых экземпляры класса win32_Process связываются с экземплярами других классов, и т. д. (рис. 2.91).
Рис. 2.91. Узлы-контейнеры и объекты, находящиеся ниже экземпляра класса Win32_Process Рис. 2.92. Полный путь к экземпляру класса Win32_Process
Для каждого объекта или узла-контейнера, отображаемого в проводнике объектов, можно узнать полный путь, который идентифицирует его в инфраструктуре WMI. Для этого нужно просто расположить указатель мыши на нужном объекте, после чего появится всплывающее окно с требуемым путем (рис. 2.92). Установка корневого экземпляра класса Как уже отмечалось ранее, корневым элементом дерева, отображаемого в проводнике объектов, можно назначить любой существующий экземпляр класса WMI, после чего все дерево будет построено заново. Сделать это можно двумя способами. Во-первых, если нужный экземпляр класса уже открыт в проводнике объектов, то можно щелкнуть над ним правой кнопкой мыши и выбрать во всплывающем меню пункт Make root. Например, проделав эту операцию с экземпляром класса win32_Process, мы в проводнике объектов получим дерево с новым корневым элементом (рис. 2.93). Рис. 2.93. Дерево, в котором корневым элементом является экземпляр класса Win32_Process В этом случае после перезапуска WMI Object Browser корневым элементом вновь станет экземпляр объекта win32_computerSystem. Если же нужно, чтобы тот или иной объект был корневым элементом дерева по умолчанию, т. е. все дерево объектов при каждом запуске утилиты строилось бы ниже
этого экземпляра класса, то вместо пункта Make Root во всплывающем меню следует выбрать пункт Make Inititial Tree Root. Во-вторых, можно воспользоваться кнопкой Browse for Instance после нажатия которой выводится диалоговое окно для поиска нужного объекта (рис. 2.94). Рис. 2.94. Диалоговое окно Browse for Instance для поиска объекта По умолчанию в этом окне в панели Available Classes отображается список обычных классов из текущего пространства имен, у которых имеются экземпляры. Для просмотра всех обычных классов в текущем пространстве имен нужно выбрать переключатель Show all classes, а для добавления в список ассоциативных классов — установить флажок Show associations. Классы, которые не могут иметь экземпляров (абстрактные классы), отображаются в списке классов жирным шрифтом. Предположим, что нам требуется найти конкретный экземпляр класса win32_Process. Для этого нужно сначала в панели Available classes выбрать этот класс и нажать кнопку Add. Выбранный класс отобразится в панели Browse for objects in (рис. 2.95). Если класс помещен в панель Browse for objects in ошибочно, то его можно оттуда удалить с помощью кнопки Remove. После того как все классы для
Рис. 2.95. Выбор для поиска экземпляра класса Win32_Process Рис. 2.96. Список экземпляров выбранных классов
поиска занесены в панель Browse for objects in (в нашем примере здесь находится один класс win32_Process), нужно нажать кнопку ОК. В результате откроется диалоговое окно Browse for Instance, в котором отображаются все экземпляры выбранных классов (выводится имя класса и значения ключевых полей) (рис. 2.96). Здесь нужно выбрать один объект и нажать кнопку ОК. После этого в проводнике объектов сформируется дерево, где в качестве корневого объекта будет использоваться выбранный экземпляр класса. Отметим, что выбор экземпляра класса, который будет использоваться в качестве корневого объекта, необходим также при первоначальном построении дерева для пространства имен, отличного от пространства имен по умолчанию (сменить пространство имен позволяет кнопка Browse for Namespace |ggj). Просмотрщик объектов (Object Viewer) Просмотрщик объектов в WMI Object Browser практически полностью аналогичен просмотрщику классов в WMI CIM Studio, который был описан ранее, поэтому здесь мы не будем останавливаться на его рассмотрении. Рис. 2.97. Список экземпляров класса Win32_Process в просмотрщике объектов
Рис. 2.98. Информация о конкретном экземпляре класса Win32_Process в просмотрщике объектов Отметим только, что при выборе в проводнике объектов узла-контейнера в просмотрщике объектов отображается список экземпляров того класса, которому соответствует этот узел (рис. 2.97), а при выборе в проводнике объектов обычного объекта в просмотрщике объектов выводится информация о свойствах, методах и ассоциациях этого объекта (рис. 2.98). Пример: просмотр информации о жестком диске Как уже отмечалось ранее, утилита WMI Object Browser ориентирована больше на системных администраторов, позволяя им с помощью ассоциаций находить нужную информацию об управляемых компонентах компьютерной системы, в то время как WMI CIM Studio больше подходит разработчикам приложений, которые точно знают, какой именно класс CIM нужен для решения той или иной задачи. Поэтому мы рассмотрим один простой практический пример, иллюстрирующий поиск с помощью WMI Object Browser имеющихся в WMI сведений без точного знания названий классов, в которых эти сведения представлены.
Предположим, что нам требуется просмотреть основную информацию о жестком диске, установленном в компьютере с именем Popov (название модели винчестера, его объем, количество головок, цилиндров, дорожек, секторов и т. д.). Для этого мы запускаем WMI Object Browser и соединяемся с пространством имен Root\ciMV2 на компьютере Popov. В проводнике объектов сформируется Дерево С Корневым элементом Win32_ComputerSystem.Name=MPOPOV\ Так как жесткий диск — это системное устройство, то мы здесь сначала открываем ассоциативный узел-КОНТеЙнер Win32_SystemDevices.PartComponent (рис. 2.99). Рис. 2.99. Содержимое ассоциативного узла-контейнера Win32_SystemDevices.PartComponent Как мы видим, в раскрывшемся списке отображаются все устройства компьютера. Для нашего примера мы открываем узел-контейнер win32_DiskDrive (рис. 2.100). В открывшемся списке представлены все экземпляры класса win32_DiskDrive, каждый из которых соответствует одному жесткому диску. Чтобы посмотреть подробную информацию об одном диске в просмотрщике объектов, нужно выбрать соответствующий объект мышью (рис. 2.101). Итак, мы видим, что интересующая нас информация хранится в свойствах экземпляра класса win32_DiskDrive (табл. 2.9).
Рис. 2.100. Содержимое узла-контейнера Win32_DiskDrive Рис. 2.101. Информация о жестком диске (экземпляр класса Win32_DiskDrive)
Таблица 2.9. Некоторые свойства класса win32_DiskDrive Свойство Значение Описание BytesPerSector Index InterfaceType Model Partitions SectorsPerTrack Size TotalCylinders TotalHeads TotalSectors TotalTracks Tracks PerCy1inder 512 1 IDE WDC WD2 00BB-00DG 3 63 30014046720 3649 255 58621185 930495 255 Число байт в секторе для дискового накопителя Номер физического диска для данного компьютера Тип интерфейса дискового накопителя JA0 Имя модели дискового накопителя, присвоенное изготовителем Число разделов, распознанных операционной системой, на данном физическом носителе Число секторов на одной дорожке для данного дискового накопителя Размер дискового накопителя в байтах Общее число цилиндров на дисковом накопителе Общее число головок на дисковом накопителе Общее число секторов на дисковом накопителе Общее число дорожек на дисковом накопителе Число дорожек на цилиндр для дискового накопителя WMI Event Registration Утилита WMI Event Registration предоставляет удобный интерфейс для создания, регистрации и настройки постоянных потребителей событий WM1. С помощью этого приложения доступно несколько операций. □ Просмотр и изменение свойств зарегистрированных в WMI постоянных потребителей событий, фильтров для этих событий, а также событий таймера. □ Добавление и удаление фильтров событий (экземпляров класса EventFilter).
□ Добавление и удаление потребителей событий (экземпляров потомков класса EventConsumer). □ Добавление и удаление событий таймера (экземпляров потомков класса Timer Instruct ion). □ Регистрация потребителей для событий путем связывания друг с другом потребителей событий и фильтров с помощью ассоциативного класса FilterToConsumerBinding. Для запуска WMI Object Browser, как и других административных утилит WMI, нужно выбрать одноименный пункт в меню Пуск | Программы | WMI Tools (Start | Programs | WMI Tools) и выполнить подключение к нужному пространству имен WMI на локальном или удаленном компьютере (см. разд. "Подключение к пространству имен WMI" данной главы). После этого открывается главное окно приложения (рис. 2.102). Рис. 2.102. Главное окно утилиты WMI Event Registration В левой панели этого окна отображаются классы и объекты, связанные с событиями, а в правой •— связи, которые определены между потребителями и фильтрами событий. Выпадающий список в верхнем левом углу позволяет задать тип объектов, которые будут выводиться в левой панели: это
могут быть либо потребители событий (пункт Consumers), либо фильтры событий (пункт Filters), либо таймеры (пункт Timers). Также в WMI Event Registration имеется несколько кнопок, внешний вид и назначение которых приведены в табл. 2.10. Таблица 2.10. Кнопки в WMI Event Registration Кнопка Название Описание Browse for Позволяет соединяться с пространством имен WMI Namespace на локальном или удаленном компьютере New Instance Позволяет создавать новые экземпляры потребителей событий, фильтров событий или таймеров Edit Instance Позволяет модифицировать некоторые свойства Properties выбранных экземпляров Delete Instance Удаляет выбранный экземпляр Register Устанавливает связь между фильтром и потребителем конкретного события View Instance Позволяет просмотреть свойства выбранного экзем- Properties пляра В правой панели главного окна показываются связи, которые устанавливаются между потребителями и фильтрами событий. При этом если в левой панели выведен список потребителей событий, то в правой панели будут отображены имеющиеся в репозитории CIM фильтры, и наоборот, если в левой панели находится список фильтров, то в правой будет список потребителей событий WMI. Просмотр и изменение свойств класса или объекта В утилите WMI Event Registration можно просматривать (но не модифицировать) свойства классов, представленных в левой панели. Например, чтобы увидеть свойства класса EventFiiter, экземпляры которого соответствуют фильтрам событий, нужно выбрать пункт Filters в выпадающем списке, в результате чего в левой панели появится название этого класса. Выделив теперь мышью класс EventFiiter, можно нажать кнопку View class properties \^\ или щелкнуть правой кнопкой мыши на этом классе и выбрать пункт View class properties во всплывающем меню, в результате чего откроется диалоговое окно View class properties с описанием свойств класса EventFiiter (рис. 2.103).
Рис. 2.103. Свойства класса EventFilter Замечание Естественно, просмотреть и изменить свойства классов можно и с помощью WMI CIM Studio. Все классы, используемые утилитой WMI Event Registration, ЯВЛЯЮТСЯ ПОТОМКаМИ класса IndicationRelated, КОТОРЫЙ, В СВОЮ ОЧврвДЬ, ЯВЛЯеТСЯ ПОТОМКОМ Класса SystemClass. Для просмотра и изменения свойств конкретного экземпляра класса нужно выделить этот экземпляр в соответствующем дереве объектов в левой панели и нажать кнопку Edit instance properties \^\ или выбрать пункт Edit instance properties в контекстном меню, связанном с этим экземпляром. В результате на экран выводится диалоговое окно Edit instance properties со списком наименований и значений свойств текущего объекта, в котором можно модифицировать эти значения и сохранить сделанные изменения с помощью кнопки ОК. Создание событий таймера События таймера могут быть абсолютного или интервального типа: событие абсолютного таймера происходит точно в заданные дату и время, а события интервального таймера происходят через определенные промежутки времени.
События таймера создаются как экземпляры классов AbsoluteTimerlnstruction (ДЛЯ абсолютного ТИПа) И IntervalTimerlnstruction (ДЛЯ интервального ТИПа). Создание событий таймера абсолютного типа Для создания нового события таймера абсолютного типа нужно сначала, выбрав пункт Timers в выпадающем списке, вывести в левой панели дерево классов С КОрневЫМ Элементом Timerlnstruction (рИС. 2.104). Рис. 2.104. Дерево классов для работы с таймерами Рис. 2.105. Свойства создаваемого события таймера абсолютного типа Здесь Следует выбрать Класс AbsoluteTimerlnstruction И нажать КНОПКу New Instance I или щелкнуть правой кнопкой мыши на этом классе
и выбрать во всплывающем меню пункт New Instance. В результате откроются диалоговое окно Edit new instance properties для задания свойств нового события (рис. 2.105). Нам необходимо задать требуемые дату и время возникновения события. Эти данные будут храниться в свойстве EventDateTime, для их ввода нужно щелкнуть мышью в столбце Value соответствующей строки. После этого откроется диалоговое окно Time, в котором следует ввести для события дату, время и временную зону (рис. 2.106). Рис. 2.106. Задание времени возникновения события Замечание По умолчанию значением полей в окне Time является текущее системное время компьютера. Кроме этого, в диалоговом окне Edit new instance properties нужно в поле TimeriD ввести имя создаваемого таймера (в нашем случае это AbsoiuteTimer). После нажатия кнопки ОК созданное событие таймера (новый Экземпляр класса AbsoluteTimerlnstruction) Сохраняется В репОЗИ- тории CIM и отображается в левой панели (рис. 2.Ю7). Рис. 2.107. Новое событие таймера AbsoiuteTimer Создание событий таймера интервального типа Начальные действия при создании нового события таймера интервального типа остаются теми же, что и при создании события таймера абсолютного
типа. Сначала нужно, выбрав пункт Timers в выпадающем списке, вывести В Левой ПанеЛИ Дерево КЛаССОВ С КОрневЫМ Элементом Timerlnstruction (СМ. рис. 2.104). Затем Следует выбрать класс IntervalTimerlnstruction и нажать кнопку New Instance |й| или щелкнуть правой кнопкой мыши на этом классе и выбрать во всплывающем меню пункт New Instance. В результате откроется диалоговое окно Edit new instance properties для задания свойств нового события (рис. 2.108). Рис. 2.108. Свойства создаваемого события таймера интервального типа Рис. 2.109. Новое событие таймера IntervalTimer Здесь необходимо задать интервал времени, через который будет возникать создаваемое событие. Этот интервал (в миллисекундах) хранится в свойстве intervaiBetweenEvents. Вторым обязательным для заполнения полем является
TimeriD, куда нужно ввести имя создаваемого таймера (в нашем случае это intervaiTimer). После нажатия кнопки ОК созданное событие таймера (новый Экземпляр класса IntervalTimerlnstruction) сохраняется В репОЗИ- тории CIM и отображается в левой панели (рис. 2.109). Создание фильтров событий Фильтры событий определяют критерии, по которым происходит оповещение потребителей о возникновении этих событий (в терминологии CIM фиЛЬТр Событий •— ЭТО Экземпляр СИСТеМНОГО Класса EventFilter). Для создания нового фильтра событий нужно, выбрав пункт Filters в выпадающем списке, вывести в левой панели дерево объектов с корневым элементом EventFilter. Затем следует создать новый экземпляр этого класса, нажав кнопку New Instance ||j| или выбрав пункт New Instance в меню, которое появляется после щелчка правой кнопкой мыши на классе EventFilter. В результате откроется диалоговое окно Edit new instance properties (рис. 2.110). Рис. 2.110. Свойства создаваемого фильтра событий
Обязательными для заполнения здесь являются свойства Name (имя фильтра), Query (запрос, ИСПОЛЬЗуемЫЙ ДЛЯ фильтрации СОбЫТИЙ) И Query Language (язык, на котором составлен запрос). Замечание В поле Query Language всегда записывается слово WQL. Допустим, что нам требуется создать фильтр для события, которое возникает при запуске Блокнота Windows (notepad.exe). Назовем этот фильтр start Notepad Filter (Name="Start Notepad Filter"), а В Поле Query введем Следующий WQL-запрос: SELECT * FROM InstanceCreationEvent WITHIN 5 WHERE Targetlnstance ISA "Win32_Process" AND Targetlnstance.Name="notepad.exe" Диалоговое окно Edit instance properties с заполненными свойствами для нашего примера приведено на рис. 2.111. Рис. 2.111. Диалоговое окно Edit instance properties для фильтра событий Start Notepad Filter После нажатия кнопки OK созданный экземпляр класса EventFiiter сохраняется в репозитории CIM.
Аналогичным образом создадим еще два фильтра с именами AbsoluteTimerFilter И IntervalTimerFilter ДЛЯ Событий таймера AbsoluteTimer И IntervalTimer, которые были ОПИСанЫ ранее. СВЯЗЬ ЭТИХ фильтров с событиями таймера производится путем записанных в поле Query соответствующих WQL-запросов: SELECT * FROM TimerEvent WHERE TimerId="AbsoluteTimer" ДЛЯ AbsoluteTimerFilter И SELECT * FROM TimerEvent WHERE TimerId="IntervalTimer" ДЛЯ IntervalTimerFilter. Создание постоянного потребителя событий Напомним, что постоянный потребитель событий должен быть представлен Экземпляром ПОТОМКа абстраКТНОГО СИСТеМНОГО Класса EventConsumer, причем в составе WM1 имеются несколько стандартных классов для создания постоянных потребителей событий (см. табл. 1.11). Однако по умолчанию эти стандартные классы не устанавливаются в репо- зиторий CIM. После инсталяции WMI Tools в пространство имен cimv2 записываются ТОЛЬКО классы EventViewerConsumer И CmdTriggerConsumer, предназначенные для функционирования утилиты WMI Event Viewer, которая является постоянным потребителей событий WMI. Для использования же стандартных классов постоянных потребителей необходимо сначала скомпилировать соответствующие MOF-файлы с описанием этих классов, которые в Windows 2000/XP находятся в каталоге %SystemRoot%\System32\ Wbem (табл. 2.11). Таблица 2.11. MOF-файлы стандартных классов постоянных потребителей Класс Имя MOF-файла с описанием класса ActiveScriptEventConsumer Scrcons.mof ScriptingStandardConsumerSetting Scrcons.mof LogFileEventConsumer Wbemcons.mof NTEvent Log Event Consumer Wbemcons.mof SMTP Event Consumer Smtpcons.mof CommandLineEventConsumer Wbemcons.mof Файл Eviewer.mof с описанием класса EventViewerConsumer находится в том каталоге, куда установлены утилиты WMI Tools. Замечание
Скомпилировать MOF-файлы из табл. 2. И можно либо с помощью WMI CIM Studio (см. разд. "Компиляция MOF-файлов" текущей главы), либо с помощью стандартной утилиты Mofcomp.exe. В последнем случае нужно выполнить следующую команду: mofcomp -N:Root\CIMV2 %SYSTEMROOT%\System32\Wbem\<имя_файла>.mof Ключ -N: с параметром Root\ciMV2 означает, что описанные в MOF-файле классы будут сохранены в пространство имен cimv2. Например, ЧТОбы ПОМеСТИТЬ В реПОЗИТОрИЙ CIM Класс ActiveScriptEvent- consumer, нужно запустить команду mofcomp -N:root\cimv2 %SYSTEMROOT%\system32\wbem\Scrcons.mof После этого на экран выводится сообщение об успешной компиляции файла (рис. 2.112). Рис. 2.112. Результат компиляции файла Scrcons.mof Скомпилируем подобным образом также файл Wbemcons.mof и создадим потребителей событий, которые мы в дальнейшем свяжем с описанными ранее фильтрами Start Notepad Filter И IntervalTimerFilter. Создание потребителя класса LogFileEventConsumer Скажем, мы хотим, чтобы при каждом запуске Блокнота Windows (note- pad.exe) в текстовый файл D:\StartNotepad.log записывалась строка "Опять Блокнот запустили!". Для этого необходимо в качестве потребителя события С фиЛЬТрОМ Start Notepad Filter СОЗДаТЬ ЭКЗеМПЛЯр Класса LogFileEventConsumer.
Рис. 2.113. Список классов стандартных потребителей событий WMI Рис. 2.114. Свойства нового потребителя событий (экземпляра класса LogFileEventConsumer)
Новый потребитель событий создается следующим образом. Сначала выводим в левой панели дерево классов стандартных потребителей событий с корневым элементом Eventconsumer, выбрав пункт Consumers в выпадающем списке (рис. 2.113). Выберем теперь из стандартных потребителей событий класс LogFileEventConsumer И СОЗДаДИМ НОВЫЙ Экземпляр ЭТОГО класса. Для ЭТОГО нужно нажать кнопку New Instance I I или выбрать пункт New Instance в меню, которое появляется после щелчка правой кнопкой мыши на классе LogFileEventConsumer. В результате откроется диалоговое окно View class properties (рис. 2.114). Для потребителя событий этого типа необходимо заполнить значениями СВОЙСТВа Name, FileName И Text. □ В ПОЛе Name Введем ИМЯ потребителя Событий, например, Start Notepad Consumer. □ В поле Filename запишем полный путь к файлу, в который требуется записывать текстовые сообщения (D:\StartNotepad.log). □ В ПОЛе Text Введем текст сообщения (Опять Блокнот запустили!). Создание потребителя класса CommandLineEventConsumer НапОМНИМ, ЧТО фиЛЬТр IntervalTimerFilter COBMeCTHO С таймером IntervalTimer определяет событие, которое происходит регулярно через определенный интервал времени. Мы в качестве потребителя этого события определим Экземпляр класса CommandLineEventConsumer, ЧТО ПОЗВОЛИТ за- пускать новые процессы (в нашем случае это вновь будет notepad.exe) через равные промежутки времени. ДЛЯ ЭТОГО необходимо Выбрать класс CommandLineEventConsumer В СПИСКе стандартных потребителей событий и создать новый экземпляр этого класса, нажав кнопку New Instance 1] J или выбрав пункт New Instance в меню, которое появляется после щелчка правой кнопкой мыши на классе CommandLineEventConsumer. В результате откроется диалоговое окно Edit new instance properties (рис. 2.115). Для потребителя событий этого типа необходимо заполнить значениями СВОЙСТВа Name, CommandLineTemplate И Runlnteractively. □ В поле Name введем имя потребителя событий, например, IntervalTimerFilter Consumer. □ В ПОЛе CommandLineTemplate запишем ИМЯ исполняемого файла, КОТОрЫЙ будет Запускаться При наступлении событий (notepad.exe). □ В поле Runlnteractively выберем значение True для того, чтобы процесс notepad.exe запускался в интерактивном режиме.
Рис. 2.115. Свойства нового потребителя событий (экземпляра класса CommandLineEventConsumer) Установка связи между фильтром и потребителем событий После ТОГО Как МЫ СОЗДали ПО ОТДеЛЬНОСТИ фильтры (Start Notepad Filter, AbsoluteTimerFilter, IntervalTimerFilter) И потребителей собы- ТИЙ (Start Notepad Consumer, IntervalTimerFilter Consumer), необходимо связать их между собой, т. е. указать, какой именно потребитель событий будет принимать извещения о наступлении событий, задаваемых тем или иным фильтром событий. Итак, СОЗДаДИМ СВЯЗЬ Между фиЛЬТрОМ СОбыТИЙ Start Notepad Filter И потребителем событий Start Notepad Consumer. Для ЭТОГО выберем В леВОМ ркне в списке зарегистрированных потребителей событий экземпляр LogFileEventConsumer.Name=nStart Notepad Consumer" класса LogFileEventConsumer, после чего в правом окне появится список всех имеющихся в репозитории CIM фиЛЬТрОВ СОбыТИЙ (экземпляров СИСТеМНОГО класса EventFilter) (рис. 2.116). Теперь в правой панели выбираем нужный нам фильтр start Notepad Filter и либо нажимаем кнопку Register Д либо выбираем пункт Register
во всплывающем меню, которое появляется после щелчка правой кнопкой мыши на данном фильтре. После этого между потребителем start Notepad Consumer И фильтром Start Notepad Filter ВОЗНИКает ПОСТОЯННаЯ СВЯЗЬ (индикатором этого служит зеленый флажок, который появляется в столбце Reg у того фильтра, который связан с текущим потребителем событий) и каждый раз после запуска процесса с именем notepad.exe в файл D:\Startnotepad.log будет записываться строка "Опять Блокнот запустили!". Рис. 2.116. Установка связи потребителя событий Start Notepad Consumer с фильтрами событий Для того чтобы разорвать установленную связь между потребителем и фильтром событий, нужно выделить данный фильтр в правом окне и повторно нажать кнопку Register или выбрать пункт Unregister во всплывающем меню, которое появляется после щелчка правой кнопкой мыши на фильтре событий. Замечание Одного потребителя можно связать с несколькими фильтрами событий. В этом случае к потребителю событий WMI будут попадать все события, которые определяются связанными с ним фильтрами.
Рис. 2.117. Установка связи потребителя событий IntervalTimerFilter Consumer с фильтрами событий Рис. 2.118. Установка связи фильтра IntervalTimerFilter Consumer с потребителями событий
СВЯЗЬ Между фиЛЬТрОМ Событий IntervalTimerFilter И Потребителем СОбы- ТИЙ IntervalTimerFilter Consumer устанавливается аналогичным образом (рис. 2.117). Теперь каждую минуту в системе будет производиться запуск Блокнота Windows (программы notepad.exe). Отметим, что потребителей с фильтрами событий можно также связывать путем вывода для каждого фильтра списка доступных потребителей (рис. 2.118). WMI Event Viewer Утилита WMI Event Viewer — это постоянный потребитель, позволяющий следить за возникновением событий, фильтры для которых связаны с потребителями событий Класса EventFilterConsumer. При ВОЗНИКНОВеНИИ ТЭ- кого события происходит автоматический запуск WMI Event Viewer (если утилита уже не была предварительно запущена) и в ее окне выводится строка с информацией о событии (важность, дата и время возникновения, класс, источник события и краткое описание события) (рис. 2.119). Рис. 2.119. Информация о событиях в WMI Event Viewer Хотя никаких дополнительных действий при возникновении событий данная утилита выполнить не может, ее удобно применять для оперативного отслеживания возникновения зарегистрированных в CIM событий WMI (при этом непосредственная обработка возникающего события может осуществляться постоянным потребителем событий другого типа, например, ActiveScriptEventConsumer).
По умолчанию после установки WMI Event Viewer может обрабатывать только те события, фильтры для которых зарегистрированы в пространстве имен CIMV2. Если есть необходимость использовать WMI Event Viewer в другом пространстве имен, то необходимо скомпилировать файл Eviewer.mof, В КОТОРОМ СОДерЖИТСЯ Описание класса EventFilterConsumer, в нужное пространство имен. Однако для этого следует предварительно найти в этом файле строку #pragma namespace("\\root\\cimv2") и изменить здесь cimv2 на другое пространство имен (например, wmi). Содержимое файла Eviewer.mof приведено в листинге 2.2. Листинг 2.2. Файл Eviewer.mof // Copyright (с) 1997-1999 Microsoft Corporation #pragma namespace("\\root\\cimv2") #pragma autorecover // register me as a Physical Event Consumer Provider. instance of Win32Provider as $P { Name = "EventViewerConsumer"; Clsid = "{DD2DB150-8D3A-lldl-ADBF-00AA00B8E05A}"; }; instance of EventConsumerProviderRegistration { Provider = $P; ConsumerClassNames = {"EventViewerConsumer"}; }; // this is my logical consumer class. [Locale(0x049), UUID("{8502C596-5FBB-11D2-AAC1-006008C78BC7}")] class EventViewerConsumer : EventConsumer { [key] string Name = ""; [read, ValueMap {"0", "1", "2"}, Values {"Error", "Warning", "Information"}] uint8 Severity =0; // 0-based, [read] string Description = ""; };
Интерфейс утилиты Внутри окна WMI Event Viewer находится таблица возникших событий с пятью столбцами, описание которых представлено в таблице 2.12. Таблица 2.12. Таблица событий в WMI Event Viewer Столбец Описание Sev Time Received Event Class Server Description В этом столбце отображается тип произошедшего события, который определяется по значению числового свойства Severity экземпляра класса EventViewerConsumer, соответствующего этому событию. Если Severity равно нулю, то в этом поле ставится значок Ошибка (3, если единице, то значок Внимание j\, если больше единицы, то значок Информация ^ Дата и время, когда потребитель получил событие Класс полученного события (например InstanceCreationEvent при создании экземпляра класса или InstanceDeletionEvent при удалении экземпляра класса) Имя компьютера, на котором произошло событие Краткое описание события. Здесь отображается значение свойства Description соответствующего экземпляра класса EventViewerConsumer, которое предварительно было установлено в утилите WMI Event Registration (тем самым можно задать различные описания для разных фильтров событий) По умолчанию события, отображаемые в WMI Event Viewer, располагаются в порядке убывания порядкового номера в списке полученных событий. При необходимости информацию можно сортировать по любому столбцу, для этого достаточно щелкнуть мышью по заголовку нужного столбца. В таблице событий не может содержаться более I 000 строк; при необходимости таблицу можно полностью очистить с помощью кнопки Clear All Если же происходит превышение максимального числа строк, то самые старые записи о событиях начинают удаляться и замещаться новыми. Рассмотрим теперь процесс настройки и отслеживания событий, информация о которых должна появляться в WMI Event Viewer. Создание и регистрация потребителя класса EventViewerConsumer Первое, что необходимо сделать, — это создать и зарегистрировать с помощью утилиты WMI Event Registration нового постоянного потребителя событий Класса EventViewerConsumer (ОТМСТИМ, ЧТО запусТИТЬ утилиту WMI
Event Registration можно непосредственно из окна WMI Event Viewer с помощью кнопки Register for Event |^|). Для этого в WMI Event Registration сначала выводим в левой панели дерево классов стандартных потребителей событий с корневым элементом Eventconsumer, выбрав пункт Consumers в выпадающем списке (рис. 2.120). Рис. 2.120. Список классов стандартных потребителей событий WMI Выберем теперь из стандартных потребителей событий класс EventViewerConsumer ИСОЗДаДИМ НОВЫЙ ЭКЗеМПЛЯр ЭТОГО Класса С ПОМОЩЬЮ кнопки New Instance [j 0 или пункта New Instance в меню, которое появляется ПОСЛе Щелчка Правой КНОПКОЙ МЫШИ на классе EventViewerConsumer. В результате на экран выведется диалоговое окно Edit new instance properties (рис. 2.121). Здесь МЫ ЗаПОЛНИМ Значениями СВОЙСТВа Name, Severity И Description. □ В ПОЛе Name Введем ИМЯ Потребителя событий, Например, My EventViewer Consumer. □ В поле severity введем число 1. Напомним, что это свойство определяет значок, который выводится в столбце Sev в утилите WMI Event Viewer (если severity равно 1, то отобразится значок Внимание !\). □ В поле Description запишем краткое описание события (событие для потребителя My Event Viewer Consumer). После нажатия кнопки OK в списке объектов появится еще один экземпляр класса EventViewerConsumer С именем My EventViewer Consumer. Выделив этот объект, мы в правой панели получим список всех имеющихся фильтров событий (рис. 2.122).
Рис. 2.121. Свойства нового потребителя событий (экземпляра класса EventViewerConsumer) Рис. 2.122. Выбор фильтра событий для потребителя My EventViewer Consumer
Установим СВЯЗЬ нашего Потребителя событий My EventViewer Consumer с созданным ранее фильтром start Notepad Filter, который позволяет реагировать на запуск Блокнота Windows (notepad.exe). Для этого выделим данный фильтр в правой панели и нажмем кнопку Register г Л Теперь при каждом запуске Блокнота в утилите WMI Event Viewer должна появляться новая строка с информацией об этом событии. Просмотр информации о возникающих событиях Для того чтобы убедиться, что зарегистрированный нами постоянный потребитель класса Eventviewerconsumer функционирует корректно, мы закроем утилиты WMI Event Registration и WMI Event Viewer и запустим Блокнот Windows (notepad.exe). Через несколько секунд (напомним, что в фильтре start Notepad Filter с помощью ключевого слова within установлен интервал опроса 5 секунд) на экране должно появиться окно утилиты WMI Event Viewer с новой записью о произошедшем событии (рис. 2.123). Рис. 2.123. Окно WMI Event Viewer с записью о возникновении события Для того чтобы узнать более подробную информацию о событии, нужно выделить соответствующую строку в таблице и нажать кнопку View Properties lEg*! или просто дважды щелкнуть мышью на этой строке. В результате откроется диалоговое окно Event Properties, в котором представлены свойства соответствующего события (рис. 2.124). Самая интересная информация здесь содержится в свойстве Targetinstance. В этом свойстве хранится объект, который вызвал данное событие. Напомним, что в нашем случае фильтр события определялся следующим WQL-запросом: SELECT * FROM InstanceCreationEvent WITHIN 5 WHERE Targetinstance ISA ,,Win32_Process" AND Targetinstance .Name= "notepad, exe"
Рис. 2.124. Свойства возникшего события Рис. 2.125. Свойства объекта, вызвавшего событие Поэтому в свойстве Targetinstance у нас хранится экземпляр класса win32_Process, который создался при запуске Блокнота. Для просмотра свойств данного экземпляра нужно нажать кнопку Object, которая расположена в столбце Value свойства Targetinstance, после чего откроется диа- логовое окно Embedded Object (рис. 2.125). Таким образом, мы видим, что утилита WMI Event Viewer действительно является удобным инструментом для мониторинга тех или иных событий и получения полной информации о самих событиях и об объектах, которые вызвали эти события.
Глава 3 Доступ к WMI из командной строки (WMIC) В Windows ХР и Windows Server 2003 к подсистеме WMI можно обращаться непосредственно из командной строки без помощи графических утилит и составления сложных сценариев. Для этого используется программа WMIC (WMI Command-line), которая поддерживает навигацию по информационной схеме WMI локального или удаленного компьютера, позволяя выполнять WQL-запросы к классам и объектам WMI. При этом вместо сложных названий классов WMI используются простые псевдонимы, причем можно создавать собственные псевдонимы, что делает информационную схему WMIC расширяемой. По умолчанию WMIC поддерживает около 80 псевдонимов, с помощью которых можно выполнить 150 методов и получить значения множества свойств. Важной особенностью WMIC является то, что вывод команд может быть организован в различные форматы: на экран, в текстовый файл, в XML- и HTML-документы, в MOF-файл, в текстовый файл с разделителями или в любой другой формат, определяемый пользователем с помощью таблиц стилей XSL (extensible Stylesheet Language). Одна команда WMIC может быть применена сразу к нескольким удаленным компьютерам с любой 32-разрядной версией Windows, при этом наличие WMIC на удаленной машине не требуется, необходима только установка ядра WMI и соответствующая настройка прав доступа к WMI. Кроме этого, команды WMI могут использоваться в пакетных файлах Windows, что позволяет простыми средствами автоматизировать работу с WMI на локальных или удаленных компьютерах. В качестве недостатка WMIC можно отметить отсутствие встроенной полноценной поддержки и обработки событий WMI. Запуск WMIC. Использование встроенной справки С WMIC можно работать в двух режимах: интерактивном и пакетном. В интерактивном режиме с клавиатуры вводится последовательность команд
WMIC, которые сразу же выполняются. Кроме этого, в интерактивном режиме удобнее работать со встроенной помощью WMIC. Пакетный режим позволяет запускать предварительно подготовленный командный (пакетный) файл с командами WM1C или выполнять из командной строки операционной системы единственную команду WMIC. Для запуска WMIC в интерактивном режиме необходимо выполнить команду wmic в стандартном интерпретаторе команд cmd.exe или в диалоговом окне Выполнить (Run) в меню Пуск (Start). После этого на экран выводится стандартное приглашение WMIC, wmic:root\cii> (рис. 3.1). Рис. 3.1. Стандартное приглашение WMIC Рис. З.2. Список процессов, запущенных в системе
Замечание При самом первом запуске WMIC командное приглашение может вывестись с некоторой задержкой, т. к. в этом случае происходит автоматическая установка WMIC на компьютер. После этого можно вводить с клавиатуры команды WMIC (регистр символов значения не имеет), которые запускаются после нажатия клавиши <Enter>. Например, если набрать в командной строке WMIC слово process и нажать <Enter>, то на экран выведется список всех процессов, запущенных в данный момент в системе (рис. 3.2). Если же ввести в командной строке WMIC слово os, то мы увидим на экране свойства операционной системы, установленной на компьютере (рис. 3.3). Рис. 3.3. Свойства операционной системы Естественно, это лишь самые простые примеры использования командной строки WMIC. Для того чтобы узнать о дополнительных возможностях WMIC, можно воспользоваться встроенной помощью, которая вызывается с помощью ключей /? или -?. Например, набрав один из этих ключей после слова process и нажав клавишу <Enter>, мы выведем справку, из которой, скажем, видно, что команда process call позволяет выполнять некоторые действия над процессами (рис. 3.4). Выполнив теперь команду process call /?, мы получим краткое описание методов, которые могут быть вызваны при работе с процессами (рис. 3.5).
Рис. 3.4. Встроенная справка по команде PROCESS Рис. З.5. Краткая справка по методам, используемым при работе с процессами Для получения более подробной помощи по этим методам нужно выполнить Команду PROCESS CALL / ? : FULL (рИС. 3.6). Ключи /? и -? можно ввести и сразу после приглашения WMIC. В этом случае будет выведена общая информация о глобальных ключах, доступных псевдонимах и командах WMIC (рис. 3.7-3.9).
Рис. З.6. Расширенная справка по методам, используемым при работе с процессами Рис. 3.7. Общая встроенная справка по WMIC (глобальные ключи)
Рис. 3.8. Общая встроенная справка по WMIC (псевдонимы) Рис. 3.9. Общая встроенная справка по WMIC (команды) Пакетный режим работы, как отмечалось ранее, подразумевает запуск команд WMIC непосредственно из командной строки Windows или из пакетного файла. Для этого перед нужной командой пишется слово wmic. При выполнении такой конструкции запускается WMIC, выполняется требуемая команда, после чего управление вновь передается командной строке Windows.
Рис. 3.10. Запуск команды WMIC в пакетном режиме Например, для того чтобы вывести в пакетном режиме на экран свойства операционной системы, нужно в командной строке Windows выполнить команду wmic os (рис. ЗЛО). Архитектура WMIC Главными составными частями WMIC являются псевдонимы (aliases), средство синтаксического анализа и разбора вводимых команд (parser) и средства трансформации выходной информации в нужный формат. Псевдонимы (aliases) в WMIC — это определения классов WMI, которые упрощают обращение к этим классам и их свойствам. Например, классу win32_Process соответствует псевдоним process, а классу win32_ operatingsystem — псевдоним os. Таким образом, можно сказать, что псевдонимы выступают в качестве дружественных посредников между объектной моделью WMI и администратором операционной системы. Стандартные псевдонимы определены для большинства часто используемых классов WMI, в случае необходимости можно создавать собственные псевдонимы или изменять существующие. Хранятся псевдонимы в виде экземпляров класса MSFT_ciiAiias из пространства имен Rootxcii. На рис. З.П показан список этих экземпляров, сформированный с помощью утилиты WMI CIM Studio. Пространство имен Rootxcii называется ролью (role), в нем находятся и Другие КЛаССЫ, Связанные С WMIC (MSFT_CliVerb, MSFT_CliFormat, MSFT_CliParam, MSFT_CliProperty, MSFT_CliConnection, MSFT_CliTranslateTable и т. д.). Вообще говоря, WMIC позволяет определить несколько ролей и производить переключение между ними, т. е. в CIM может быть помещено несколько независимых пространств имен, содержащих описания псевдонимов WMIC. Над псевдонимами можно производить различные операции, которые определяются операторами, вводимыми в командной строке WMIC после имени псевдонима. Обработчик (парсер) для синтаксического разбора, интерпретации и выполнения операций с псевдонимами представлен исполняемым файлом wmic.exe, который находится в каталоге %SystemRoot%\System32\Wbem.
Рис. 3.11. Экземпляры класса MSFT_CliAlias (псевдонимы WMIC) Рис. 3.12. Схема работы WMIC
На рис. 3.12 представлена общая схема работы WMIC. Итак, WMIC функционирует следующим образом. Обработчик wmic.exe получает введенную команду через стандартный входной поток stdin. Парсер выполняет синтаксический разбор команды, выделяет псевдоним (если таковой имеется) и извлекает определение этого псевдонима для активной роли (напомним, что роли по умолчанию соответствует пространство имен Rootxcii). Кроме псевдонима в командной строке WMIC могут стоять операторы, задающие действие, которое нужно выполнить над псевдонимом. Обработка команды WMIC сводится, в конечном итоге, к выполнению последовательности вызовов соответствующих API-функций WMI в пространстве имен на локальном или удаленном компьютере. Данные, которые возвращаются WMI в результате выполнения этих API- функций, автоматически преобразуются в формат XML. После этого данные форматируются тем или иным способом в соответствии с таблицей стилей XSL (extensible Stylesheet Language), которая связана с псевдонимом по умолчанию или явно задана с помощью соответствующих параметров оператора. Отформатированная информация возвращается пользователю через стандартный выходной поток stdout. Интерактивная работа с WMIC В данном разделе подробно описаны все элементы командной строки WMIC и приведены примеры команд, которые могут быть полезны администраторам Windows в их повседневной деятельности. Синтаксис командного языка WMIC Команды, выполняемые в интерактивном режиме работы WMIC, должны иметь определенную структуру. В командной строке могут присутствовать глобальные параметры, псевдонимы, операторы (verbs) и команды, причем все эти компоненты должны записываться в строго заданном порядке. Вообще говоря, синтаксис командного языка WMIC может быть представлен в нормальной форме Бэкуса-Наура (Backus-Naur Form, BNF), которая была разработана для описания языка Алгол-60 и затем использовалась для многих других языков программирования. При записи грамматики в форме Бэкуса-Наура используются несколько типов объектов. □ Основные (терминальные) символы. К ним относят, в частности, ключевые слова. □ Металингвистические переменные (нетерминальные символы). Их значениями являются цепочки основных символов описываемого языка. Металингвистические переменные изображаются словами, заключенными в угловые скобки ("<", ">").
D Металингвистические связки изображаются специальными символами ("::=", "|") и используются для определения и связи друг с другом металингвистических переменных. Мы не будем здесь давать подробных правил построения и анализа формы Бэкуса-Наура, а лишь приведем для иллюстрации простой пример описания правила записи целого числа в этой форме: <целое> ::- <целое без знака> \ +<целое без знака> \ -<целое без знака> <целое без знака> :: = <цифра> \ <целое без знака> <цифра> <цифра> ::=0|1|2|3|4|5|б|7|8|9 В табл. 3.1 приведена форма Бэкуса-Наура командной строки WMIC. Параметр Таблица 3.1. Форма Бэкуса-Наура командного языка WMIC Значение <Команда WMI> ::= [<список глобальных параметров>] <команда> <список гло- ::= <глобальные параметры> \ <глобальные параметры> бальных пара- <список глобальных параметров> метров> <глобальные ::= (/NAMESPACE | /ROLE ) [\<пространство имен WMI>] \ параметры> /NODE[:< список идентификаторов компьютеров>] \ /IWPLEVEL,[:< уровень олицетворения>] \ /AUTHLEVEL[:< уровень проверки подлинно сти>] \ /LOCALE[: идентификатор языка>] \ /PRIVILEGES[:<cbohctbo>] I /TRACE[:< в ариант>] \ /RECORD[: <имя файла>] \ I INTERACTIVE[:<BapndHT>] I /FAILFAST[:<BapnaHT>] I /Х]ЗЕТ{[:<идентификатор пользователя>] \ /PASSWORD[:<илeятифик•aтop пароля>] \ /ОиТРит[:<устройство вывода>] \ /АРРЕЫБ[:<имя файла>] \ /AGGREGATE[:<BapnaHT>] /?[:<тип справки>] <список идеи- ::= <идентификатор компьютера> \ <идентификатор тификаторов компьютера> <список идентификаторов компыоте- компыотеров> ров> <свойство> ::= ENABLED | DISABLED <вариант> ::= ON | OFF <устройство ::= STDOUT | CLIPBOARD | <имя файла> вывода>
Таблица 3.1 (продолжение) Параметр Значение <команда> ::= \<псевдониМ> [ <объект WMI>\ \ [<псевдониМ>\ <путь>) [<оператор действ14я>] | EXIT | CLASS [<выражение пути класса>] [<олератор действия^ <путь WHERE> ::= [PATH (<выражение пути> | <выражение пути класса> )] [ WHERE «эператор WHERE>] <псевдоним> ::= !! имя для псевдонима. Уникальное имя в пространстве имен, в котором определен псевдоним. В качестве имен псевдонимов нельзя использовать зарезервированные СЛОВа CLASS, PATH, WHERE, RESTORE И EXIT <объект WMI> ::= <родительский объект> <параметры псевдонима> <родительский объект> \ <параметры псевдонима> <выражение ::= !! Выражение пути WMI, включая оператор key пути> <оператор ::= !! Оператор where языка запросов WQL в необязательных where> круглых скобках <выражение !! Выражение пути WMI без использования оператора key пути класса> <параметры ::= !! один или несколько пробелов, разделенные литералами, псевдонима> которые будут использоваться для подстановки в переменную PWhere псевдонима <оператор ::= (<действие> [<параметры действия>] \ действия> <стандартное действие>)[<переключатели действия>] <действие> ::= <имя свойства> \ <идентификатор> \ <имя метода> <переключате- ::= /INTERACTIVE | /NOINTERACTIVE ли действия> <параметр ::= <фактический параметр> \ действия> <фактический параметр> , <параметр действия> <стандартное ::= <действие GET> I действие> <действие LIST> I <действие ASS0O | <действие CALL> | <действие CREATE-SET> | <действие DELETE> <идентифика- ::= Оаголовок идентификатора> [<окончание иденти- тор> фикатора>] оаголовок ::= <буква> идентификатора>
Таблица 3.1 (продолжение) Параметр Значение <окончание ::= <идентификатор> [<буква> \ <цифра>] идентификатора> <действие GET> ::= GET [<список свойств^^переключателиСЕ^] <список ::= <имя свойства> \ свойств> <имя свойства> , <список свойств> <действие ::= ЫЗТ[<формат списка>\<переключатели списка>] LIST> <действие ::= ASSOC [< специфика тор формата>] ASS0O <действие ::= CALL <имя метода> [<список фактических парамет- CALL> ров>] < список ::= <фактический параметр> \ фактических <фактический параметр> , <список фактических параметров> параметров> <действие ::= SET <список значений>\ CREATE <список значений> CREATE-SET> <список ::= <имя свойства> - <значение свойства> \ значений> <имя свойства> - <значение свойства> <список значений> <действие '.'.— DELETE DELETE> <переключате- ::= /VALUE | ли GET> /ALL I / TRANSLATE: <имя таблиць!> \ /ЪЧШС1[\<интервал>] \ /REPEAT[:<счетчик>] \ /FORMAT[:<специфика тор формата>] \ /DESCRIPTION[:<fcодовая страница>] <интервал> ::= !! число, обозначающее частоту, с которой должны возвращаться значения <счетчик> ;:= N число, обозначающее число возвратов значений <спецификатор ::= :<имя Х5Ь-файла> \ формата> :TABLE | :MOF <формат ::= brief I списка> INSTANCE | SYSTEM I STATUS I FULL I пользовательский формат>
Таблица 3.1 (окончание) Параметр Значение <переключате- /TRANSLATE | ли списка> I EVERY:<интервал>\ /FORMAT[:<специфика тор формата>] <тип справки> ::= : BRIEF | :FULL На практике чаще всего командная строка WMIC строится следующим образом: [<глобальные параметры>] <псевдоним> [WHERE <оператор WHERE>] [<оператор действия>] Приведем несколько простых примеров. Запустим WMIC и введем следующую команду: SERVICE LIST Здесь service является псевдонимом, a list — оператором действия, применяемым к этому псевдониму. В результате мы получим список всех служб, зарегистрированных на локальной машине (рис. 3.13). Рис. 3.13. Сведения о всех службах, зарегистрированных в системе
Для того чтобы вывести сведения о конкретной службе (например, о службе оповещения), нужно использовать ключевое слово where: SERVICE WHERE Name="Alerter" LIST Результат выполнения этой команды представлен на рис. 3.14. Рис. 3.14. Сведения о конкретной службе Если необходимо получить информацию о службе оповещения на удаленном компьютере \\Serverl, применяется глобальный параметр /node: /NODE:"Server1" SERVICE WHERE Name="Alerter" LIST Рассмотрим теперь более подробно каждый из компонентов командной строки WMIC. Команды WMIC WMIC поддерживает пять стандартных команд: context, class, path, quit и exit. Команда CONTEXT Команда context позволяет увидеть значения всех глобальных параметров, которые используются в среде WMIC по умолчанию (рис. 3.15). Рис. 3.15. Информация о значениях глобальных параметров
Сами глобальные параметры и их возможные значения будут подробно рассмотрены далее. Команда CLASS С помощью команды class можно получить доступ к классу WMI напрямую, без использования псевдонима WMIC. Для этого в командной строке WMIC сразу после команды class должен быть указан точный путь к этому классу WMI. Таким образом, команда class позволяет извлечь определение какого-либо класса WMI или создать его новые экземпляры. Например, для того чтобы увидеть все свойства и методы класса win32_Process, можно выполнить следующую команду: CLASS Win32_Process Рис. 3.16. Описание свойств и методов класса Win32_Process, полученное с помощью WMIC
Результат будет выведен на экран в формате HTML. Нам удобнее сначала перенаправить выводящуюся информацию во внешний HTML-файл (например, C:\outclass.htm), а затем открыть данный файл с помощью браузера Internet Explorer. Для этого в командной строке WMIC следует использовать глобальный параметр /output, с помощью которого производится перенаправление вывода команд во внешний файл: /OUTPUT: C:\outclass.htm Выполнив теперь команду CLASS Win32_Process мы в файле C:\outclass.htm получим описание свойств и методов класса Win32_Process (рис. 3.16). Команда PATH Команда path применяется для прямого доступа к одному или нескольким экземплярам классов WMI, без указания псевдонимов WMIC. Команда path особенно полезна, если для нужного класса WMI не существует псевдонима WMIC. Например, рассмотрим команду, в которой используется псевдоним process для вывода на экран некоторых сведений о запущенном Проводнике Windows: PROCESS WHERE (Name="explorer.exe") GET Caption, CommandLine, Handle Так как псевдоним process соответствует классу win32_Process, тот эта команда равносильна следующей: PATH Win32_Process WHERE (Name="explorer.exe") GET Caption, CoramandLine, Handle Отметим также, что отбор конкретных экземпляров класса при использовании команды path может производиться не только с помощью ключевого слова where, но и путем задания полного пути к объекту через значения его ключевых свойств. Например, следующая команда равносильна двум предыдущим: PATH Win32_Process.Name="explorer.exe" GET Caption, CoramandLine, Handle Команды QUIT и EXIT Команды quit и exit позволяют выйти из WMIC и вернуться в предыдущую оболочку (например, к командному приглашению Windows XP). Глобальные параметры (ключи), настройки WMIC В среде WMIC определены несколько глобальных параметров (ключей), которые по умолчанию применяются для всех вводимых в командной строке WMIC выражений. Как уже отмечалось ранее, для просмотра глобальных
параметров используется команда context (см. рис. 3.15). Для изменения значений этих параметров используется следующий синтаксис: / Параме тр: Зна чение Далее подробно описаны самые важные глобальные параметры WMIC. Параметр /NAMESPACE Параметр /namespace задает пространство имен, которое будет использоваться в качестве ссылки в псевдонимах (по умолчанию таким пространством является Root\ciMV2). Значением этого параметра может быть имя любого пространства имен WMI. Например, для того чтобы указать, что псевдонимы нужно брать из корневого пространства имен WMI, в командной строке WMIC вводится следующее выражение: /NAMESPACE:\\Root Параметр /ROLE Значением этого параметра (роли) является пространство имен WMI, в котором хранятся описания псевдонимов WMIC. Имя этого пространства указывается в приглашении командной строки WMIC. Напомним, что по умолчанию WMIC имеет только одну роль (\\Rroot\cii), поэтому переключение роли (т. е. изменение значения параметра /role) может понадобиться только в том случае, если администратором или каким-либо инструментом управления были созданы дополнительные роли. При смене роли соответствующим образом изменяется приглашение командной строки WMIC. Например, на рис. 3.17 показан вид командной строки WMIC после выбора роли \\Root. Рис. 3.17. Приглашение WMIC после выбора роли WRoot Параметр /NODE В параметр /node записываются разделяемые запятыми имена компьютеров, к которым будет обращаться WMIC при поиске классов WMI, соответствующих вводимым в командной строке псевдонимам. Например: /NODE:SERVER1,SERVER2
По умолчанию значением параметра /node является имя локального компьютера. Имена компьютеров для параметра /node можно также брать из предварительно подготовленного текстового файла. В этом файле имена машин должны быть разделены либо занятыми, либо символами возврата каретки. Например, пусть на диске С имеется текстовый файл nodes.txt следующего содержания: Serverl,Server2 Server3 Тогда после выполнения команды /NODE:@c:\nodes.txt значением параметра /node станет список из трех имен компьютеров (рис. 3.18). Рис. 3.18. Ввод в параметр /NODE списка компьютеров из текстового файла Параметры /IMPLEVEL и /AUTHLEVEL Параметры /implevel и /authlevel задают соответственно стандартные уровень олицетворения (Anonymous, Identify, Impersonate И Delegate) И уровень Проверки ПОДЛИННОСТИ (Default, None, Connect, Call, Pkt, pktintegrity и Pktprivacy) протокола DCOM при подключении к гюдсис- теме WMI на удаленном компьютере. Напомним, что описание уровней олицетворения и проверки подлинности DCOM приведено в разделе "Безопасность при работе с WMI" главы 1. По умолчанию значением параметра /implevel является Anonymous, а параметра /AUTHLEVEL ~ Pkt.
Параметр /LOCALE В параметре /locale хранится идентификатор языка (в формате MSXXX), который использовался по умолчанию при установке WMIC на компьютере. Параметр /PRIVILEGES Напомним, что для выполнения средствами WMI операций, для которых необходимы специальные привилегии в операционных системах Windows NT/2000/XP (например, перезагрузка компьютера), необходимо установить режим использования всех привилегий при работе с WMI. Глобальный параметр /privileges отвечает за этот режим при использовании WMIC. По умолчанию в целях безопасности запрещено использовать все привилегии, значением параметра /privileges при этом является disable. Для того чтобы разрешить использовать все привилегии, нужно параметру /privileges присвоить значение enable: /PRIVILEGES:ENABLE Параметр /TRACE Параметр /trace позволяет включить или отключить режим отображения результатов (успехов или сбоев) выполнения команд WMIC. По умолчанию этот режим отключен, значением /trace при этом является off. Для включения режима отображения результатов выполнения команд (режима трассировки) нужно параметру /trace присвоить значение on: /TRACE:ON В качестве примера на рис. 3.19 показана информация, которая выводится при обработке псевдонима process при включенном режиме трассировки. Параметр /RECORD С помощью параметра /record можно сохранять во внешнем XML-файле историю запускаемых в текущей сессии WMIC команд и результаты их выполнения. Для включения режима записи команд нужно указать в качестве значения параметра /record имя выходного XML-файла, например: /RECORD:С:\outwmic.xml Выполним теперь пару команд WMIC (например, context и cpu list brief) и посмотрим в браузере Internet Explorer на содержимое выходного файла outwmic.xml (рис. 3.20).
Рис. 3.19. Результат обработки псевдонима PROCESS при включенном режиме трассировки Рис. 3.20. Содержимое выходного XML-файла при включенном режиме записи команд
Как мы видим, каждой выполненной команде соответствует элемент <record>, который имеет несколько атрибутов (табл. 3.2). Таблица 3.2. Атрибуты элемента <record> Атрибут Описание SEQUENCENUM ISSUEDFROM STARTTIME Порядковый номер выполняемой команды в сеансе WMIC Имя компьютера, на котором запускалась команда Дата и время запуска команды Внутри каждого из элементов <record> находятся элементы <request> и <output>, в которых хранятся соответственно данные о самой команде и о результате ее выполнения (рис. 3.21). Рис. 3.21. Данные о запущенной команде и результате ее выполнения
Внутри тегов <commandline> и </commandline> записан текст команды (в нашем случае это context и cpu list brief). У элемента <output> имеются атрибуты targetnode, значением которого является имя компьютера, на котором осуществлялся вывод информации, полученной в результате выполнения команды, и iteration, куда записывается номер итерации команды. Сами выходные данные команды помещаются внутрь секции <>[cdata[, которая, в свою очередь, находится внутри элемента <output>. Таким образом, глобальный параметр /record позволяет создавать очень удобный журнал, в котором фиксируются все команды, выполняющиеся в среде WMIC. Если же необходимо прекратить запись в этот журнал, то следует в качестве значения параметра /record указать пустую строку: /RECORD: Параметры /OUTPUT и /APPEND Как уже отмечалось при описании архитектуры WMIC, по умолчанию все команды выводят информацию в стандартный выходной поток stdout, т. е. на экран. Параметр /output позволяет перенаправить вывод команд во внешний текстовый файл (/output :имя_ файл а) или в буфер Windows (/OUTPUT:CLIPBOARD). Отметим, что в отличие от параметра /record, при перенаправлении вывода во внешний файл с помощью /output в этот файл будет добавляться только результат выполнения команд, сами же команды записываться не будут. После перенаправления вывода в текстовый файл или буфер Windows на экран выходные данные команд выводиться не будут (рис. 3.22). Рис. 3.22. Результат работы WMIC после перенаправления вывода во внешний файл Часто бывает удобнее дублировать вывод на экран и в текстовый файл или буфер Windows. Для этого используется параметр /append, в качестве значения которого указывается имя внешнего текстового файла (например, /append:С: \out.txt), в который будет дублироваться выводимая командами информация (значением параметра /output при этом должно быть stdout). Для примера на рис. 3.23 показано, что при таком режиме работы WMIC
результаты выполнения команды context будут выводиться и на экран и во внешний файл (см. листинг 3.1). Рис. 3.23. Результат работы WMIC в режиме дублирования вывода на экран и в текстовый файл Листинг 3.1. Текстовый файл OUT.TXT NAMESPACE ROLE NODE(S) IMPLEVEL AUTHLEVEL LOCALE PRIVILEGES TRACE RECORD INTERACTIVE FAILFAST OUTPUT APPEND USER AGGREGATE root\cimv2 root\cli SHIKIN IMPERSONATE DEFAULT ms_419 ENABLE OFF N/A OFF OFF STDOUT C:\OUT.TXT N/A ON Параметр /INTERACTIVE Параметр /interactive влияет на режим работы операторов и методов, которые производят какие-либо действия над классами или экземплярами классов WMI. Если значение /interactive равно on, to при запуске таких
операторов или методов будет выдаваться дополнительный запрос. Например, включим режим запроса подтверждений командой /INTERACTIVE:ON и попробуем запустить новый процесс (калькулятор Windows) путем ввода следующей команды: PROCESS CALL Create calc.exe На экран будет выдан следующий запрос: Выполнить (Win32_Process)->Create() [Y(да)/N(нет)]? По умолчанию значение параметра /interactive равно off, при этом действия выполняются без дополнительного запроса. Параметры /USER и /PASSWORD Параметры /user и /password позволяют задать соответственно имя пользователя и пароль, которые будут использоваться во время доступа к компьютерам, имена которых заданы переключателем /node или указаны в псевдонимах. Имя пользователя здесь указывается в формате домен\пользователь. Например, для того чтобы получить доступ к подсистеме WMI на компьютере \\Serverl от имени пользователя Popov, зарегистрированного в домене Domain 1, следует в командной строке WMIC ввести следующие переключатели: /NODE:Serverl /USER:Popov /PASSWORD:"ser+-l" Здесь мы явно указываем пароль, который содержит специальные символы ("+" и "—"), поэтому этот пароль заключен в двойные кавычки. Если не указывать параметр /password, а только задать значение параметра /user, to пароль будет запрошен с клавиатуры, причем вводится он с помощью не- отображаемых символов. Для локального компьютера можно задать только параметр /password, сменить текущего пользователя с помощью параметра /user нельзя. В случае необходимости можно задавать пустой пароль или имя пользователя: /PASSWORD: "" /USER:"". Псевдонимы WMIC Как уже говорилось ранее, псевдонимы используются в качестве посредников для получения доступа к инфраструктуре WMI из командной строки WMIC. Псевдонимы могут применяться для переименования классов WMI, а также свойств и методов этих классов, что позволяет обращаться к различным объектам WMI с помощью коротких и легко запоминающихся имен. Псевдонимы имеются для большинства часто используемых классов WMI. Для того чтобы просмотреть список имеющихся псевдонимов, нужно вызвать в командной строке WMIC встроенную справку путем ввода команды /? (см. рис. 3.8).
Для вывода информации о конкретном псевдониме, нужно вызвать встроенную справку по этому псевдониму. Например (рис. 3.24): PROCESS /? UL Рис. 3.24. Встроенная справка для псевдонима PROCESS В табл. 3.3 приведено краткое описание стандартных объектов WMIC и показано, какой WQL-запрос выполняется для создании того или иного псевдонима. Таблица 3.3. Стандартные псевдонимьММЮ Псевдоним Описание WQL-запрос для построения псевдонима ALIAS BASEBOARD Доступ к псевдонимам, зарегистрированным на локальном компьютере Управление платой системной SELECT * FROM Msft_ CliAlias SELECT * FROM Win32_ BaseBoard BIOS BOOTCONFIG CDROM COMPUTERSYSTEM CPU CSPRODUCT Управление базовой системой ввода-вывода (BIOS) Управление конфигурацией загрузки Управление устройствами чтения компакт-дисков Управление компьютером Управление ЦП Сведения о системе из SMBIOS SELECT Win32_BIOS FROM SELECT * FROM Win32_ BootConfiguration SELECT * FROM Win32_ CDROMDrive SELECT * FROM Win32, ComputerSys tem SELECT * FROM WIN32_PROCESSOR SELECT * FROM Win32_ ComputerSystemProduct
Таблица 3.3 (продолжение) Псевдоним Описание WQL-запрос для построения псевдонима DATAFILE DCOMAPP DESKTOP DESKTOPMONITOR DEVICEMEMORYADDRESS DISKDRIVE DISKQUOTA DMACHANNEL ENVIRONMENT FSDIR GROUP IDECONTROLLER IRQ JOB LOADORDER LOGICALDISK Управление файлами данных Управление приложениями DCOM Управление рабочим столом Управление системой мониторинга рабочего стола Управление адресами памяти устройства Управление физическими дисками Использование дискового пространства для томов NTFS Управление каналами прямого доступа к памяти (DMA) Управление настройками системной среды Управление оглавлением файловой системы Управление учетными записями групп Управление ЮЕ- контроллерами Управление линиями запроса на прерывание (IRQ) Доступ к заданиям, назначенным планировщиком Управление порядком загрузки групп системных служб при старте операционной системы Управление локальными накопителями SELECT * FROM CIM_ DataFile SELECT * FROM WIN32_ DCOMApplication SELECT * FROM WIN32, DESKTOP SELECT * FROM WIN32_ DESKTOPMONITOR SELECT * FROM Win32. DeviceMemoryAddress SELECT * FROM Win32_ DiskDrive SELECT * FROM Win32_ DiskQuota SELECT * FROM Win32. DMAChannel SELECT * FROM Win32. Environment SELECT * FROM Win32. Directory SELECT * FROM Win32. Group SELECT * FROM Win32. IDEController SELECT * FROM Win3 2. IRQResource SELECT * FROM Win32. ScheduledJob SELECT * FROM Win32. LoadOrderGroup SELECT * FROM Win32. LogicalDisk
Таблица 3.3 (продолжение) Псевдоним Описание WQL-запрос для построения псевдонима LOGON МЕМСАСНЕ MEMLOGICAL MEMPHYSICAL NETCLIENT NETLOGIN NETPROTOCOL NETUSE NIC NICCONFIG NTDOMAIN NTEVENT NTEVENTLOG ONBOARDDEVICE OS PAGEFILE Сеансы LOGON Управление кэш-памятью Управление системной памятью (настройка и доступность) Управление физической памятью компьютера Управление сетевыми клиентами Управление данными входа в систему конкретных пользователей Управление протоколами (и их сетевыми характеристиками) Управление активными сетевыми соединениями Управление платами сетевого интерфейса (NIC) Управление сетевыми платами Управление доменами NT Записи в журнале событий NT Управление файлом журнала событий NT Управление встроенными общими контроллерами на системной плате Управление установленными операционными системами Управление файлом свопинга (swoping) виртуальной памяти SELECT * FROM Win32. LogonSession SELECT * FROM WIN3 2. CACHEMEMORY SELECT * FROM Win32. LogicalMemoryConfiguration SELECT * FROM Win3 2. Phys icalMemoryArray SELECT * FROM WIN32. NetworkClient SELECT * FROM Win32. NetworkLoginProfile SELECT * FROM Win32. NetworkProtocol SELECT * FROM Win32. NetworkConnection SELECT * FROM Win32. NetworkAdapter SELECT * FROM Win32. NetworkAdapterConfiguration SELECT * FROM Win32. NTDomain SELECT * FROM Win32. NTLogEvent SELECT * FROM Win32. NTEventlogFile SELECT * FROM Win32. OnBoardDevice SELECT * FROM Win32. OperatingSystem SELECT * FROM Win32. PageFileUsage
Таблица 3.3 (продолжение) Псевдоним Описание WQL-запрос для построения псевдонима PAGEFILESET PARTITION PORT PORTCONNECTOR PRINTER PRINTERCONFIG PRINTJOB PROCESS PRODUCT QFE QUOTASETTING RECOVEROS REGISTRY SCSICONTROLLER SERVER SERVICE SHARE Управление параметрами файла подкачки Управление разбитыми на разделы областями физического диска Управление портами ввода/вывода Управление физическими портами соединения Управление печатающими устройствами Управление конфигурацией печатающих устройств Управление заданиями печати Управление процессами Управление задачами пакета установки Разработка поправок (Quick-Fix Engineering) Установка данных о дисковых квотах для тома Данные, которые будут взяты из ОЗУ при сбое ОС Управление реестром системы Управление SCSI- контроллерами Управление сведениями о сервере Управление служебными приложениями Управление общими ресурсами SELECT * FROM Win32. PageFileSetting SELECT * FROM Win32. DiskPartition SELECT * FROM Win32. PortResource SELECT * FROM Win32. PortConnector SELECT * FROM Win32. Printer SELECT * FROM Win32. PrinterConfiguration SELECT * FROM Win32. PrintJob SELECT * FROM Win32. Process SELECT * FROM Win32. Product SELECT * FROM Win32. QuickFixEngineering SELECT * FROM Win32. QuotaSetting SELECT * FROM Win32. OSRecoveryConfiguration SELECT * FROM Win3 2. Registry SELECT * FROM Win32. SCSIController SELECT * FROM Win32. Per fRawDa ta_Per fNet_ Server SELECT * FROM Win32. Service SELECT * FROM Win3 2. Share
Таблица 3.3 (продолжение) Псевдоним Описание WQL-запрос для построения псевдонима SOFTWAREELEMENT SOFTWAREFEATURE SOUNDDEV STARTUP SYSACCOUNT SYSDRIVER SYSTEMENCLOSURE SYSTEMSLOT TAPEDRIVE TEMPERATURE TIMEZONE UPS USERACCOUNT VOLTAGE Управление установленными в системе компонентами программного продукта Управление подсистемами ПО SoftwareElement Управление звуковыми устройствами Управление командами, запускающимися автоматически при входе пользователей в систему Управление системной учетной записью Управление системным драйвером базовой службы Управление физической средой системы Управление точками физических соединений, включая порты, разъемы и периферию, а также специальными точками соединения Управление ленточными накопителями Управление датчиком температуры Управление данными о часовых поясах Управление источниками бесперебойного питания Управление записями учетными Управление данными электронного измерителя напряжения SELECT * FROM Win32. SoftwareElement SELECT * FROM Win3 2. SoftwareFeature SELECT * FROM WIN3 2. SoundDevice SELECT * FROM Win32. StartupCommand SELECT * FROM Win32. SystemAccount SELECT * FROM Win32. SystemDriver SELECT * FROM Win32. SystemEnclosure SELECT * FROM Win32. SystemSlot SELECT * FROM Win32. TapeDrive SELECT * FROM Win3 2. TemperatureProbe SELECT * FROM Win3 2. TimeZone SELECT * FROM Win32. UninterruptiblePower Supply SELECT * FROM Win32. UserAccount SELECT * FROM Win3 2. VoltageProbe
Псевдоним VOLUMEQUOTASETTING WMISET Описание Сопоставление дисковых квот конкретному тому Управление параметрами работы службы WMI Таблица 3.3 (окончание) WQL-запрос для построения псевдонима SELECT * FROM Win32_ VolumeQuotaSetting SELECT * FROM Win32_ WMISetting При желании можно создавать псевдонимы для других классов (пример создания собственных псевдонимов приведен в разделе "Расширение схемы WMIC" данной главы). Если в командной строке WMIC ввести имя псевдонима и нажать клавишу <Enter>, то будет выполнен WQL-запрос из табл. 3.3, который используется при создании этого псевдонима, т. е. будут выведены свойства всех экземпляров некоторого класса. Если же нам нужны сведения лишь о некоторых экземплярах этого класса, то следует применять условие where, которое ставится сразу после имени псевдонима и должно содержать допустимое AVQL- выражение. Например: PROCESS WHERE (Name="notepad.exe") Здесь будет выведена информация о процессах с именем notepad.exe (Блокнот Windows). После имени псевдонима и условия where может указываться оператор WMIC (например, get, list или set), который задает действие, выполняемое над псевдонимом (описание операторов WMIC и соответствующие примеры их использования приведены далее). Кроме этого, в псевдонимах определяются выходные форматы, которые могут включать значения свойств или предоставлять необходимые шаблоны для оформления данных. Например, в формате brief перечисляются только значения свойств, существенных для идентификации объекта, доступ к которому осуществляется через этот псевдоним. Имена таких форматов вывода указываются в командной строке WMIC после оператора list, с помощью которого выводятся значения свойств псевдонима, указанных в данном формате. Например: PROCESS LIST BRIEF Имена форматов вывода называются модификаторами оператора list (cm. также разд. "Оператор list" данной главы). При описании архитектуры WMIC уже отмечалось, что фактически псевдонимы WMIC — это экземпляры класса MSFT_ciiAiias, находящегося в оп- Замечание
ределенном пространстве имен WMI (роли WMIC); по умолчанию WMIC имеет единственную роль Rootxcii. Рассмотрим внутреннюю структуру псевдонимов WMIC на примере псевдонима process. Для этого запустим описанную в главе 2 утилиту WMI CIM Studio, подключимся к пространству имен Root\cii и выберем в правом окне просмотрщика классов экземпляр класса MSFT_ciiAiias, у которого В свойстве FriendlyName записано Process (рис. 3.25). Рис. 3.25. Объект WMI, определяющий псевдоним PROCESS Как мы видим, ключевым свойством является FriendlyName, в котором хра- нится название псевдонима. Описание других важных свойств класса MSFT_ciiAiias приведено в табл. 3.4. Свойство Таблица 3.4. Некоторые свойства класса MSFT_ciiAiias Описание Connection Содержит объект MSFT_cliConnection, в свойствах которого хранится путь к пространству имен WMI, в котором будет выполняться запрос для формирования псевдонима, сведения об учетной записи, от имени которой будет производиться подключение к этому пространству имен, и т. д. Description Краткое описание псевдонима
Таблица ЗА (окончание) Свойство Описание Formats Содержит массив объектов MSFT_cliFormat, в каждом из которых хранится описание формата вывода (имя формата, список свойств псевдонима, которые должны выводиться оператором list при использовании данного формата, и т. д.) FriendlyName Имя псевдонима PWhere Выражение where для WQL-запроса, хранимого в свойстве Target. Может содержать подстановочные символы # Target Строка, содержащая запрос на языке WQL, который будет выполняться по умолчанию при обращении к псевдониму Verbs Содержит массив объектов MSFT_CliVerb, которые описывают имеющиеся у псевдонима методы Поясним смысл свойства PWhere на примере того же псевдонима process. Свойства Target и pwhere этого псевдонима вместе определяют следующий WQL-запрос: SELECT * FROM Win32_Process WHERE ProcessID=*#' Если мы в командной строке WMIC введем следующую команду PROCESS 4040 то фактически будет выполнен такой запрос: SELECT * FROM Win32_Process WHERE ProcessID='4040' Другими словами, если сразу после имени псевдонима в командной строке WMIC указывается список параметров, то этот список вставляется вместо ПОДСТанОВОЧНОГО СИМВОЛа # В СВОЙСТВе PWhere. Операторы (действия) WMIC В этом разделе будут описаны стандартные операторы (действия) Assoc, CALL, CREATE, SET, DELETE, GET И LIST, КОТОрые ПОДДерЖИВаЮТСЯ боЛЬШИН- ством псевдонимов WMIC. Псевдонимы могут также поддерживать другие действия. Чтобы получить сведения об операторах, доступных для некоторого псевдонима, нужно вывести встроенную справку для этого псевдонима, Т. е. ВЫПОЛНИТЬ Команду ВИДа <псевдоним> /?. Оператор ASSOC Оператор Assoc позволяет увидеть, какие классы или экземпляры классов связаны с объектом WMI, путь к которому был задан с помощью псевдонима или команд path и class.
Если оператор assoc применяется к классу WMI, то по умолчанию результат выполнения команды (список классов WMI, связанных с данным классом) будет выводиться в формате HTML. Например, введем в командной строке WMIC следующее выражение: /OUTPUT:C:\l.htm CLASS Win32_Process ASSOC В файле l.htm после этого будет сформировано описание классов WMI, которые связаны С классом Win32_Process (win32_Computer System, Win32_LogonSession И Win32_NamedJobObject) (рис. 3.26). Рис. 3.26. Описание классов WMI, которые связаны с классом Win32_Process Отметим, что с помощью оператора assoc нельзя увидеть, посредством каких ассоциативных классов связаны друг с другом два класса. Для этого, в случае необходимости, лучше использовать утилиты WMI Tools или тестер WMI, которые были описаны в главе 2. При применении оператора assoc к одному или нескольким экземплярам класса WMI на экран выводятся пути к объектам WMI, которые связаны с этими экземплярами. Например, если в системе запущен Блокнот (notepad.exe), то с помощью команды PROCESS WHERE (name="notepad.exe") ASSOC
или PATH Win32_Process WHERE (name="notepad.exe") ASSOC можно увидеть, например, какие динамические библиотеки (экземпляры класса ciM_DataFiie) используются при его работе (рис. 3.27). Рис. 3.27. Экземпляры классов WMI, которые связаны с процессом notepad.exe Оператор CALL С помощью оператора call можно выполнить метод класса или экземпляра класса WMI (путь к этому классу или экземпляру может быть задан либо с помощью псевдонима WMIC, либо с помощью команд class и path). Для того чтобы узнать, какие методы доступны в псевдониме, а также какие параметры должны указываться при вызове определенного метода, нужно воспользоваться встроенной справкой WMIC. Рассмотрим этот процесс более подробно. Предположим, что нам нужно запустить из среды WMIC стандартный калькулятор Windows (calc.exe). Так как для этого необходимо создать новый процесс, то сначала мы посмотрим, какие методы можно вызвать с помощью псевдонима process (или с помощью класса win32_process). Для этого в командной строке WMIC введем одно из следующих выражений: PROCESS CALL /? CLASS Win32_Process CALL /? В результате на экран выведется список доступных методов с описанием входных (in) и выходных (out) параметров для каждого метода (рис. 3.28).
Рис. 3.28. Список методов, доступных в классе Win32_Process Напомним, что для запуска метода необходимо, чтобы этот метод был реализован в провайдере соответствующего класса WMI. Индикатором такой реализации служит состояние метода implemented (см. рис. 3.28). При необходимости для каждого метода можно вывести его краткое описание (рис. 3.29). Для этого нужно использовать полный формат помощи: PROCESS CALL /?:FULL Итак, мы видим, что новый процесс создается с помощью метода create. Обязательным параметром commandLine при этом является командная строка, содержащая путь к запускаемому исполняемому файлу. В нашем случае необходимо выполнить следующую команду: PROCESS CALL Create calc.exe Замечание Если в методе необходимо указывать несколько параметров, то эти параметры разделяются запятыми. В результате запустится калькулятор Windows и на экран выведутся выходные параметры метода create (идентификатор ProcessiD нового процесса и код возврата Returnvalue, нулевое значение которого говорит об успешном выполнении метода) (рис. 3.30).
Рис. 3.29. Полный формат встроенной справки для методов, доступных через псевдоним PROCESS Рис. 3.30. Выходные параметры метода Create Для того чтобы закрыть запущенный калькулятор, нужно вызвать метод Terminate! PROCESS WHERE Name="calc.exe" CALL Terminate
Оператор CREATE Оператор create позволяет создать новый экземпляр класса WMI и задать значения свойств этого экземпляра (новый класс с помощью create создать нельзя). Класс WMI, экземпляр которого должен быть создан, задается с помощью псевдонима WMIC или команды class; после оператора create указываются пары свойство-значение, которые разделяются запятыми (в качестве разделителя свойства и значения в паре используется знак равенства). В качестве примера рассмотрим, каким образом оператор create используется для создания новых переменных среды. Всем переменным среды, определенным В СИСТеме, Соответствуют Экземпляры класса Win32_Environment. В свою очередь, этому классу соответствует псевдоним environment (рис. 3.31). Рис. 3.31. Список всех переменных среды, ПОЛученнЫЙ С ПОМОЩЬЮ ПСевДОНИМа ENVIRONMENT Для того чтобы узнать, какие свойства должны быть определены при создании нового экземпляра с помощью псевдонима environment, нужно вызвать встроенную справку (рис. 3.32): ENVIRONMENT CREATE /?
Рис. 3.32. Параметры, необходимые для создания новой переменной среды Итак, нам потребуется задать имя переменной (параметр Name), ее значение (параметр variabievalue) и имя пользователя (параметр userName), которому будет доступна эта переменная. Например, для создания переменной wari со значением wari905 для пользователя Popov из домена Domain 1, нужно выполнить следующую команду: ENVIRONMENT CREATE Name="Warl", VARIABLEVALUE="Warl905", UserName= 11 Doma i n 1 \ Popo v" Если же необходимо создать системную переменную, которая будет доступна всем пользователям, то необходимо в качестве значения параметра userName указывать <system>, например: ENVIRONMENT CREATE Name="War2", VARIABLEVALUE="Warl905", UserName^ "<SYSTEM>" Оператор SET С помощью оператора set можно изменить значения свойств у одного или нескольких экземпляров класса WMI, которые могут быть заданы с помощью псевдонима WMIC или команды class. Напомним, что изменять значения можно далеко не у всех свойств. Чтобы узнать, какие свойства доступны для изменения у определенного псевдонима, нужно для этого псевдонима вывести встроенную справку по оператору set. Например: ENVIRONMENT SET /? Как мы видим, у псевдонима environment для изменения доступны только СВОЙСТВа Name И VariableValue (рис. 3.33).
Рис. 3.33. Свойства псевдонима ENVIRONMENT, доступные для изменения Для того чтобы с помощью оператора set изменить значения свойств, нужно, как и в операторе create, указать разделенные запятыми пары вида Свойство^"значение". Например, чтобы изменить имя системной переменной War2 на war3, а ее значение на war, следует выполнить следующую команду: ENVIRONMENT WHERE Name="War2" SET Name="War3", VariableValue="War" Оператор DELETE Оператор delete производит удаление текущего экземпляра класса WMI или целого набора таких экземпляров (также delete может использоваться для удаления класса WMI). Например, для удаления созданной нами переменной среды wari нужно выполнить следующую команду: ENVIRONMENT WHERE Name="Warl" DELETE Если при этом с помощью глобального параметра /interactive был включен интерактивный режим выполнения команд (/interactive:on), to перед удалением переменной будет задан дополнительный вопрос. Кроме этого, вне зависимости от значения глобального параметра /interactive, дополнительный вопрос об удалении может быть выведен с помощью параметра /interactive самого оператора delete: ENVIRONMENT WHERE Name="War2" DELETE /INTERACTIVE Параметр /nointeractive, напротив, позволяет выполнить удаление без дополнительного подтверждения: ENVIRONMENT WHERE Name="War2" DELETE /NOINTERACTIVE Оператор GET Оператор get позволяет получить значения определенных свойств экземпляров классов WMI, которые могут задаваться с помощью псевдонимов WMIC или команды path.
Если же, используя команду class, применить оператор get к классу WMI, то мы получим описание этого класса. Например, после выполнения команды /OUTPUTrC:\l.htm CLASS Win32_Process GET в файле l.htm сформируется описание класса win32_Process (рис. 3.34). Рис. 3.34. Описание класса Win32_Process, полученное с помощью оператора GET Для того чтобы узнать, какие свойства имеются у определенного псевдонима, нужно воспользоваться встроенной справкой по оператору get. Например, на рис. 3.35 показан список доступных свойств псевдонима environment. Как мы видим, при таком вызове справки тип свойства и метод доступа к нему корректно указывается не для всех свойств. Если же вызвать аналогичную справку ДЛЯ Команды PATH Win32_Environment, TO ТИП СВОЙСТВа И метод доступа к нему будут описаны для всех свойств (рис. 3.36).
Рис. 3.35. Описание свойств псевдонима environment Рис. 3.36. Описание свойств экземпляров класса Win32_Environment
Для того чтобы вывести на экран несколько свойств экземпляров класса, нужно указать имена этих свойств, разделенные запятыми, после оператора get (рис. 3.37). Например: PROCESS GET Name, Handle Рис. 3.37. Значения свойств Name и Handle всех экземпляров псевдонима PROCESS Если ввести оператор get без указания списка свойств, то будут выведены все свойства псевдонима. Кроме свойств псевдонимов после оператора get можно указывать дополнительные параметры. Параметры /VALUE u/ALL Параметр /value позволяет выводить каждое свойство и его значение в отдельной строке. Например, на рис. 3.38 представлен результат выполнения следующей команды: PROCESS GET Name, Handle /VALUE Альтернативой параметру /value является используемый по умолчанию параметр /all, с помощью которого выходные данные отображаются в виде таблицы (см. рис. 3.37).
Рис. 3.38. Результат выполнения оператора GET с ключом /value Параметры /TRANSLATEи /FORMAT Как уже отмечалось, одной из особенностей архитектуры WMIC является то, что XML-формат выходных данных может быть довольно легко изменен с помощью соответствующих таблиц стилей XSL. В операторе get для этой цели служит параметр /format, в качестве значения которого указывается либо стандартное или определенное пользователем ключевое слово, задающее формат выходной информации, либо имя XSL-файла, с помощью которого будет происходить обработка выходных XML-данных. Стандартным ключевым словам (значениям параметра /format) соответствуют XSL- файлы, которые расположены в каталоге %SystemRoot%\System32\Wbem; данное соответствие устанавливается в файле xsl-mapping.xml, который находится в том же каталоге (листинг 3.2). Листинг 3.2. Стандартный файл xsl-mapping.xml <XSLMAPPINGS> <XSLFORMAT KEYWORD="TABLE">WmiCliTableFormat.xsl</XSLFORMAT> <XSLFORMAT KEYWORD="VALUE">WmiCliValueFormat.xsl</XSLFORMAT> <XSLFORMAT KEYWORD="MOF">WmiCliMofFormat.xsl</XSLFORMAT>
<XSLFORMAT KEYWORD= "LIST">WmiCliValueFormat.xsl</XSLFORMAT> <XSLFORMAT KEYWORD="TVLIST">TextValueList.xsl</XSLFORMAT> </XSLMAPPINGS> В файл xsl-mapping.xml можно добавлять собственные ключевые слова, связывая их со своими XSL-файлами (более подробно процесс создания новых XSL-файлов для трансформации вывода WMIC рассмотрен в разделе "Расширение схемы WMIC" данной главы). Стандартные форматы вывода оператора get описаны в табл. 3.5; примеры использования этих форматов приведены далее в разделе "Форматы вывода данных WMIC" данной главы. Таблица 3.5. Стандартные форматы вывода оператора get Значение параметра /FORMAT Описание csv Значения свойств экземпляра класса выводятся в одну строку и отделяются друг от друга запятыми hform Информация выводится в виде совокупности HTML-таблиц для каждого из экземпляров класса. В первом столбце этих таблиц записывается имя свойства, а во втором — значение этого свойства htable Информация выводится в виде одной HTML-таблицы, в которой каждая строка соответствует одному экземпляру класса. В заголовках столбцов этой таблицы записываются названия выводимых свойств, а в самих столбцах — значения этих свойств list Формат вывода аналогичен случаю get /value — каждое свойство и его значение выводятся в отдельной строке mof Выходные данные преобразуются в MOF-формат rawxml Формируются XML-элементы, содержащие подробную информацию о выполняемой команде и результатах ее обработки table Формат вывода аналогичен случаю get /all— данные выводятся в табличном виде value To же самое, что list xml Выходные данные с дополнительной информацией о выполняемой команде преобразуются в XML-формат По умолчанию оператор get с любыми дополнительными параметрами вместо символов < и > выводит их HTML-обозначения (⁢ и > соответственно). Если необходимо выводить именно символы < и > (например, при
формировании выходного XML-файла), то нужно вместе с оператором get использовать параметр /translate со значением basicxml. Например: ENVIRONMENT GET /FORMAT:RAWXML /TRANSLATE:BASICXML Здесь параметр /translate:basicxml указывает на то, что выходной поток символов будет преобразован в соответствии с таблицей basicxml, в которой указывается, что символы ⁢ должны быть заменены на <, а символы > — На >. Отметим, что на вид выводимых данных влияет порядок следования ключей /translate и /format: □ если ключ /translate предшествует ключу /format, to форматирование результатов будет выполнено после преобразования; □ если ключ /translate следует за ключом /format, to форматирование результатов будет выполнено до преобразования. Параметры /EVERYи /REPEAT Параметры /every и /repeat обеспечивают периодическое неоднократное выполнение введенного в командной строке WMIC выражения. В качестве значения параметра /every указывается интервал времени в секундах, через Рис. 3.39. Периодическое выполнение оператора GET с ключом /EVERY
который оператор get будет вновь запрашивать информацию и выводить ее на экран. Например, после запуска следующей команды PROCESS GET Name,Handle /EVERY:5 на экран каждые пять секунд будет выводиться информация о запущенных в системе процессах (рис. 3.39). Прервать такое периодическое выполнение оператора get можно путем нажатия любой клавиши. Если нам необходимо запустить команду лишь несколько раз, то вместе с параметром /every нужно применить параметр /repeat, в качестве значения которого указывается требуемое количество запусков. Например, следующая команда будет выполнена три раза с интервалом в пять секунд: PROCESS GET Name,Handle /EVERY:5 /REPEAT:3 Оператор LIST Оператор list, как и get, позволяет вывести значения свойств экземпляров классов WMI, которые могут задаваться с помощью псевдонимов WMIC или команды path. Этот оператор выполняется для псевдонимов по умолчанию, т. е. если в командной строке WMIC вводится один псевдоним без оператора, то к этому псевдониму применяется оператор list. В отличие от оператора get, с помощью list нельзя вывести данные для произвольных свойств экземпляров класса WMI. В операторе list можно лишь выбрать один из имеющихся наборов свойств, которые задаются модификаторами. Общий синтаксис оператора list таков: LIST [<модификатор>] [<параметры>] Отметим, что наборы модификаторов для различных псевдонимов могут отличаться друг от друга. Однако есть несколько стандартных модификаторов, которые имеются почти у всех псевдонимов (табл. 3.6). Таблица 3.6. Стандартные модификаторы оператора list Модификатор Описание BRIEF Выводятся основные свойства псевдонима FULL Выводятся все свойства псевдонима (используется по умолчанию) INSTANCE На экран будут выводиться только пути экземпляров класса (значение свойства path) STATUS Отображается состояние объектов SYSTEM Выводятся системные свойства псевдонима
Для того чтобы узнать, какие именно модификаторы доступны для определенного псевдонима и какие свойства входят в эти модификаторы, нужно воспользоваться встроенной справкой для оператора list, например PROCESS LIST /? Рис. 3.40. Модификаторы, доступные для псевдонима PROCESS Как мы видим, у оператора list имеются три дополнительных модификатора: □ 10 (свойства Name, Processld, ReadOperationCount, ReadTransferCount, WriteOperationCount, WriteTransferCount); □ MEMORY (свойства Handle, MaximumWorkingSetSize, Name, MinimumWorkingSetSize, PageFaults, PageFileUsage, PeakPageFileUsage, PeakVirtualSize, PeakWorkingSetSize, PrivatePageCount, QuotaNonPagedPoolUsage, WorkingSetSize, QuotaPagedPoolUsage, QuotaPeakNonPagedPoolUsage, QuotaPeakPagedPoolUsage, VirtualSize); □ STATISTICS (свойства HandleCount, Name, KernelModeTime, MaximumWorkingSetSize, MinimumWorkingSetSize, OtherOperationCount, OtherTransferCount, PageFaults, PageFileUsage, PeakPageFileUsage, PeakVirtualSize, PeakWorkingSetSize, PrivatePageCount, Processld, QuotaNonPagedPoolUsage, QuotaPeakNonPagedPoolUsage, VirtualSize, QuotaPagedPoolUsage, QuotaPeakPagedPoolUsage, ReadOperationCount, ReadTransferCount, ThreadCount, UserModeTime, WorkingSetSize, WriteOperationCount, WriteTransferCount).
Для сравнения посмотрим, какие модификаторы доступны для псевдонима ENVIRONMENT (рИС. 3.41). Рис. 3.41. Модификаторы, доступные для псевдонима environment Как мы видим, у environment имеется единственный дополнительный модификатор WRITEABLE, ВКЛЮЧаЮЩИЙ В себя свойства Name И VariableValue. Замечание В модификаторе writeable всегда указываются свойства, доступные для изменения. После модификатора в операторе list могут указываться параметры /FORMAT, /TRANSLATE, /EVERY И /REPEAT, КОТОрые ИМеЮТ ТОТ Же СМЫСЛ, ЧТО И в рассмотренном ранее операторе get. Форматы вывода данных WMIC Как уже отмечалось ранее, WMIC обеспечивает очень гибкий механизм представления выходной информации с помощью таблиц стилей XSL. Далее в разделе "Расширение схемы WMIC" мы покажем, как можно создавать собственные XSL-таблицы для преобразования выходной информации, а пока рассмотрим стандартные для WMIC форматы вывода. Вывод в буфер Windows Иногда бывает удобно перенаправить вывод команд WMIC в буфер Windows, например, для последующей вставки результатов выполнения
команды в документ Microsoft Word. Для этого нужно в командной строке WMIC глобальному параметру /output присвоить значение clipboard: /OUTPUT:CLIPBOARD После этого в буфере будет сохраняться информация, выведенная последней выполненной командой WMIC. Вывод в XML-файл Сохранять в XML-файле информацию о запускаемых командах WMIC и выводимых ими результатах можно двумя способами: с помощью глобального параметра /record или с помощью формата вывода rawxml. Если в XML-файле не нужно будет производить детальный разбор выводимых командами данных, то проще задать выходной файл с помощью параметра /record, например: /RECORD:С:\ou t_wmi с.xml После этого каждой вводимой команде WMIC в этом файле будет соответствовать элемент <record>, внутри которого будут записаны элементы <request> с информацией о команде и <output> с результатом выполнения команды в блоке < ! [cdata[ (рис. 3.42). £) Готово «J Мои к Рис. 3.42. Пример выходного XML-файла, заданного с помощью параметра /RECORD Для того чтобы отменить такой вывод в XML-файл, нужно либо закрыть сеанс WMIC, либо присвоить параметру /record пустое значение: /RECORD:""
Если же требуется полностью структурировать выводимую командами list или get информацию, то можно воспользоваться форматом вывода rawxml и перенаправить вывод во внешний файл с помощью параметра /output, например: /OUTPUT:C:\out_xml.xml CPU LIST BRIEF /FORMAT:RAWXML Корневым элементом в файле out_xml.xml будет элемент <command>, в атрибутах которого записан порядковый номер выполняемой команды в сеансе WMIC (sequencenum), имя компьютера, на котором была запушена команда (issuedfrom), время начала выполнения команды (starttime) и количество повторов команды (everycount): <COMMAND SEQUENCENUM="3 6M ISSUEDFROM="SHIKIN" STARTTIME= ,,06-24-2003T20:56:16,, EVERYCOUNT = " 0 " > Элемент <request> является контейнером, внутри которого находятся элементы, содержащие информацию о запущенной команде и значениях параметров WMIC, которые были установлены во время запуска команды. Элемент <commandline> содержит полный текст запускаемой программы: <COMMANDLINE> /OUTPUT:С:\out_xml.xml CPU LIST BRIEF /FORMAT:RAWXML </COMMANDLINE> В контейнере <commandlinecomponents> находятся элементы, полученные в результате разбора командной строки. Элемент <nodelist> содержит список компьютеров (элементы <node>), на которых запускалась команда: <NODELIST> <NODE>SHIKIN</NODE> </NODELIST> В элементе <friendlyname> хранится имя используемого псевдонима WMIC, в <target> — текст WQL-запроса, который соответствует псевдониму, в <aliastarget> — название класса WMI, к которому происходит обращение: <FRIENDLYNAME>CPU</FRIENDLYNAME> <TARGET>Select * from WIN32_PROCESSOR</TARGET> <ALIASTARGET>WIN32_PROCESSOR</ALIASTARGET> Элемент <namespace> содержит путь к используемому пространству имен CIM, в элементе <resultantquery> записан текст WQL-запроса, который был выполнен при запуске команды (в нашем примере этот запрос построен с учетом модификатора brief): <NAMESPACE>ROOT\CIMV2</NAMESPACE> <RESULTANTQUERY> SELECT Caption, DevicelD, Manufacturer, MaxClockSpeed, Name, SocketDesignation FROM WIN3 2_PROCESSOR </RESULTANTQUERY>
В элементе <formats> приведен список XSL-файлов, которые используются для форматирования результатов выполнения команды: <FORMATS> <FORMAT> <NAME>RAWXML.xsl</NAME> </FORMAT> </FORMATS> В элементе <properties> находятся описания всех свойств класса WMI, которые фигурируют в выполняемом запросе. Каждому такому свойству соответствует элемент <property>: <PROPERTIES> <PROPERTY> <NAME>Caption</NAME> <DERIVATION>Caption</DERIVATION </PROPERTY> </PROPERTIES> Значения всех глобальных параметров WMIC, каждому из которых соответствует свой XML-элемент, собраны внутри контейнера <context>: <CONTEXT> <NAMESPACE>root\cimv2</NAMESPACE> <ROLE>root\cli</ROLE> <IMPLEVEL>IMPERSONATE</IMPLEVEL> <AUTHLEVEL>DEFAULT</AUTHLEVEL> <LOCALE>ms_419 </LOCALE> <PRIVILEGES>ENABLE</PRIVILEGES> <TRACE>OFF</TRACE> <RECORD>N/A</RECORD> <INTERACTIVE>OFF</INTERACTIVE> <FAILFAST>OFF</FAILFAST> <OUTPUT>C:\out_xml.xml</OUTPUT> <APPEND>STDOUT</APPEND> <USER>N/A</USER> <AGGREGATE>ON</AGGREGATE> </CONTEXT> Результаты выполнения запущенной команды находятся внутри элемента <С1М> в контейнере <results> (значением атрибута node является имя компьютера, на котором команда выполнялась): <RESULTS NODE=,,SHIKIN,*>
<CIM> </CIM> </RESULTS> Внутри контейнера <cim> находятся элементы <instance>, соответствующие экземплярам класса WMI, выбранным в результате выполнения WQL- запроса. Каждый элемент <instance> содержит элементы <property>, соответствующие свойствам экземпляра класса WMI (имя свойства записано в атрибуте name, тип свойства — в атрибуте type). Внутри элемента <property> находится элемент <value>, значение которого совпадает со значением соответствующего свойства экземпляра класса WMI: <INSTANCE CLASSNAME="Win32_Processor"> <PROPERTY NAME="Caption" TYPE="string"> <VALUE>x86 Family 6 Model 3 Stepping 1</VALUE> </PROPERTY> <PROPERTY NAME=MDeviceID" TYPE="string"> <VALUE>CPUO</VALUE> </PROPERTY> <PROPERTY NAME="Manufacturer" TYPE="string"> <VALUE>AuthenticAMD</VALUE> </PROPERTY> <PROPERTY NAME="MaxClockSpeed" TYPE="uint32"> <VALUE>747</VALUE> </PROPERTY> <PROPERTY NAME="Narne" TYPE="string"> <VALUE>AMD Duron (trn) Processor</VALUE> </PROPERTY> <PROPERTY NAME="SocketDesignation" TYPE="string"> <VALUE>Slot A</VALUE> </PROPERTY> </INSTANCE> Полностью содержимое файла out_xml.xml приведено в листинге 3.3. Листинг 3.3. Содержимое XML-файла с результатом выполнения команды WMIC <COMMAND SEQUENCENUM="36" ISSUEDFROM="SHIKIN" STARTTIME= "06-24-2003T20:56:16" EVERYCOUNT="0"> <REQUEST>
<COMMANDLINE>/OUTPUT:C:\out_xml.xml CPU LIST BRIEF . /FORMAT:RAWXML</COMMANDLINE> <COMMANDLINECOMPONENTS> <NODELIST> <NODE>SHIKIN</NODE> </NODELIST> <FRIENDLYNAME>CPU</FRIENDLYNAME> <TARGET>Select * from WIN32_PROCESSOR</TARGET> <ALIASTARGET>WIN32_PROCESSOR</ALIASTARGET> <PWHERE>Where DeviceID= * #'</PWHERE> <NAMESPACE>ROOT\CIMV2</NAMESPACE> <0ЕЗСК1РТЮЫ>Управление ЦП. </DESCRIPTION> <RESULTANTQUERY>SELECT Caption, DevicelD, Manufacturer, MaxClockSpeed, Name, SocketDesignation FROM WIN32_PROCESSOR</RESULTANTQUERY> <FORMATS> <FORMAT> <NAME>RAWXML.xsl</NAME> </FORMAT> </FORMATS> <PROPERTIES> <PROPERTY> <NAME>Caption</NAME> <DERIVATION>Caption</DERIVATION </PROPERTY> <PROPERTY> <NAME>DeviceID</NAME> <DERIVATION>DeviceID</DERIVATION> </PROPERTY> <PROPERTY> <NAME>Manufacturer</NAME> <DERIVATION>Manufacturer</DERIVATION </PROPERTY> <PROPERTY> <NAME>MaxClockSpeed</NAME> <DERIVATION>MaxClockSpeed</DERIVATION> </PROPERTY> <PROPERTY> <NAME>Name</NAME> <DERIVATION>Name</DERIVATION
</PROPERTY> <PROPERTY> <NAME>SocketDesignation</NAME> <DERIVATION>SocketDesignation</DERIVATION> </PROPERTY> </PROPERTIES> </COMMANDLINECOMPONENTS> <CONTEXT> <NAMESPACE>root\cimv2</NAMESPACE> <ROLE>root\cli</ROLE> <IMPLEVEL>IMPERSONATE</IMPLEVEL> <AUTHLEVEL>DEFAULT</AUTHLEVEL> < L0CALE>ms_419 </LOCALE> <PRIVILEGES>ENABLE</PRIVILEGES> <TRACE>OFF</TRACE> <RECORD>N/A</RECORD> <INTERACTIVE>OFF</INTERACTIVE> <FAILFAST>OFF</FAILFAST> <OUTPUT>C:\out_xml.xml</OUTPUTS <APPEND>STDOUT</APPEND> <USER>N/A</USER> <AGGREGATE>ON</AGGREGATE> </.CONTEXT> </REQUEST> <RESULTS NODE=,,SHIKIN"> <CIM> <INSTANCE CLASSNAME="Win32_Processor,*> <PROPERTY NAME="Caption" TYPE="string"> <VALUE>x86 Family 6 Model 3 Stepping 1</VALUE> </PROPERTY> <PROPERTY NAME="DeviceID" TYPE="string"> <VALUE>CPUO</VALUE> </PROPERTY> <PROPERTY NAME="Manufacturer" TYPE="string"> <VALUE>AuthenticAMD</VALUE> </PROPERTY> <PROPERTY NAME="MaxClockSpeed" TYPE="uint32"> <VALUE>7 47</VALUE>
</PROPERTY> < PROPERTY NAME=,,Name" TYPE= " string" > <VALUE>AMD Duron(tm) Processor</VALUE> </PROPERTY> <PROPERTY NAME="SocketDesignation" TYPE="string"> <VALUE>Slot A</VALUE> </PROPERTY> </INSTANCE> </CIM> </RESULTS> </COMMAND> Вывод в HTML-файл С помощью стандартных форматов вывода hform и htable можно, используя параметр /output, сформировать HTML-файлы двух видов с результатами выполнения операторов list и get. Формат вывода hform позволяет представить выходную информацию в виде совокупности HTML-таблиц для каждого из экземпляров класса, выбранного в результате выполнения команды. При этом в первом столбце этих таблиц записывается имя свойства, а во втором — значение этого свойства. Например, выполним команду /OUTPUT:С:\hf.htm PROCESS LIST BRIEF /FORMAT:HFORM и откроем полученный файл hf.htm с помощью браузера Internet Explorer (рис. 3.43). С помощью формата htable можно поместить всю выводимую информацию в одну HTML-таблицу, в которой каждая строка соответствует одному экземпляру класса. В заголовках столбцов этой таблицы записываются названия выводимых свойств, а в самих столбцах — значения этих свойств. Например, на рис. 3.44 показан открытый в браузере Internet Explorer файл ht.htm, который был сформирован в результате выполнения следующей команды: /OUTPUT:С:\ht.htm PROCESS LIST BRIEF /FORMAT:HTABLE Кроме этого, таблица, получаемая с помощью формата htable, может быть отсортирована по любому столбцу с помощью параметра sortby (название параметра обязательно должно быть набрано строчными буквами), в качестве значения которого должно быть указано имя нужного столбца (свойства). Например, для получения таблицы процессов, отсортированной по полю Name (рис. 3.45), нужно выполнить следующую команду: /OUTPUT:С:\ht.htm PROCESS LIST BRIEF /FORMAT:HTABLE:"sortby=Name"
Рис. 3.43. Пример выходного HTML-файла, полученного с помощью формата HFORM Рис. 3.44. Пример выходного HTML-файла, полученного с помощью формата HTABLE
Рис. 3.45. Выходная HTML-таблица, отсортированная по полю Name Рис. 3.46. Выходная HTML-таблица, отсортированная по полю Process Id
По умолчанию сортируемые данные считаются строками, если же необходимо произвести сортировку по числовому полю (например, в нашем случае, по полю ProcessiD) (рис. 3.46), то кроме параметра sortby необходимо указать параметр datatype со значением number: /OUTPUT:C:\ht.htm PROCESS LIST BRIEF /FORMAT:HTABLE :"datatype=number":"sortby=ProcessId" Вывод в текстовый файл Для того чтобы перенаправить вывод операторов list и get в текстовый файл, используется параметр /output вместе с форматами вывода TEXTTABLE, TEXTTABLEWSYS И TEXTVALUELIST. Формат texttable позволяет получить информацию в табличном виде, где каждая колонка соответствует определенному свойству класса WMI, причем числовые значения форматируются в соответствии с региональными настройками Windows. Выполним, например, следующую команду: /OUTPUT:С:\tablel.txt PROCESS GET Name, Priority, Processld /FORMAT:TEXTTABLE Содержимое выходного файла tablel.txt представлено в листинге 3.4. Листинг 3.4. Пример выходного файла, полученного с помощью формата TKXTTABLE Name Priority Processld System Idle Process System 8, 4, SMSS.EXE 11, 364, CSRSS.EXE 13, 436, WINLOGON.EXE 13, 468, SERVICES.EXE 9, 512, LSASS.EXE 9, 524, SVCHOST.EXE 8, 684, SVCHOST.EXE 8, 728, SVCHOST.EXE 8, 7 88, SVCHOST.EXE 8, 804, SPOOLSV.EXE 8, 948, ALG.EXE 8, 1 048, DBNT1SV.EXE 8, 1 060, INETINFO.EXE 8, 1 092, SQLSERVR.EXE 8, 1 136,
EXPLORER.EXE 8, 340, PCTSPK.EXE 8, 416, ICQLite.exe 8, 420, CTFMON.EXE 8, 488, MSMSGS.EXE 8, 648, SQLMANGR.EXE 8, 700, wuauclt.exe 8, 3 488, WINWORD.EXE 8, 4 068, wmic.exe 8, 856, Far.exe 8, 2 392, wmiprvse.exe 8, 2 904, Формат texttablewsys также позволяет получить таблицу аналогичной структуры, однако числовые значения здесь выводятся без дополнительного форматирования. В листинге 3.5 представлен файл table2.txt, который является результатом выполнения следующей команды: /OUTPUT:C:\table2.txt PROCESS GET Name, Priority, Processld /FORMAT:TEXTTABLEWSYS Листинг 3.5. Пример выходного файла, полученного с помощью формата TEXTTABLEWSYS Name Priority Processld System Idle Process 0 0 System 8 4 SMSS.EXE 11 364 CSRSS.EXE 13 436 WINLOGON.EXE 13 468 SERVICES.EXE 9 512 LSASS.EXE 9 524 SVCHOST.EXE 8 684 SVCHOST.EXE 8 728 SVCHOST.EXE 8 788 SVCHOST.EXE 8 804 SPOOLSV.EXE 8 948 ALG.EXE 8 1048 DBNT1SV.EXE 8 1060 INETINFO.EXE 8 1092 SQLSERVR.EXE 8 1136
EXPLORER.EXE 8 340 PCTSPK.EXE 8 416 ICQLite.exe 8 420 CTFMON.EXE 8 488 MSMSGS.EXE 8 648 SQLMANGR.EXE 8 700 wuauclt.exe 8 3488 WINWORD.EXE 8 4068 wmic.exe 8 856 Far.exe 8 2392 wmiprvse.exe 8 3008 С помощью формата textvaluelist можно для каждого возвращаемого экземпляра класса WMI ПОЛУЧИТЬ СПИСОК пар ВИДа свойство=значение. Например, выполним следующую команду: /OUTPUT:С:\value.txt PROCESS GET Name, Priority, Processld /FORMAT:TEXTVALUELIST Содержимое полученного в результате файла value.txt приведено в листинге 3.6. Листинг 3.6. Пример выходного файла, полученного с помощью формата TEXTVALUELIST Name=System Idle Process Priority=0 ProcessId=0 Name=System Priority=8 ProcessId=4 Name=SMSS.EXE Priority=ll ProcessId=364 Name=CSRSS.EXE Priority=13 ProcessId=436 Name=WINLOGON.EXE
Priority=13 ProcessId=468 Name=SERVICES.EXE Priority=9 ProcessId=512 Name=LSASS.EXE Priority=9 ProcessId=524 Name=SVCHOST.EXE Priority=8 ProcessId=684 Name=SVCHOST.EXE Priority=8 ProcessId=728 Name=SVCHOST.EXE Priority=8 ProcessId=788 Name=SVCHOST.EXE Priority=8 Processld=804 Name=SPOOLSV.EXE Priority=8 ProcessId=948 Name=ALG.EXE Priority=8 Processld=1048 Name=DBNTlSV.EXE Priority=8 Processld=1060
Name=INETINFO.EXE Priority=8 Processld=1092 Name=SQLSERVR.EXE Priority=8 ProcessId=1136 Name=EXPLORER.EXE Priority=8 Processld=340 Name=PCTSPK.EXE Priority=8 ProcessId=416 Name=ICQLite.exe Priority=8 Processld=420 Name=CTFMON.EXE Priority=8 ProcessId=488 Name=MSMSGS.EXE Priority=8 ProcessId=648 Name=SQLMANGR.EXE Priority=8 Processld=700 Name=wuauclt.exe Priority=8 ProcessId=3488 Name=WINWORD.EXE Priority=8 Processld=4068
Name=wmic.ехе Priority=8 ProcessId=856 Name=Far.ехе Priority=8 ProcessId=2392 Name=wmiprvse.ехе Priority=8 Processld=1808 Вывод в CSV-файл Стандартный формат вывода csv позволяет преобразовывать информацию, возвращаемую командами WMIC, в формат файла с разделителями, при этом в качестве разделителя выступает запятая. Данные файлы пот'ом могут быть легко открыты, например, с помощью программы Microsoft Excel. Для примера выполним следующую команду: /OUTPUT:C:Xklop.csv PROCESS LIST BRIEF /FORMAT:CSV В результате на диске С формируется текстовый файл klop.csv, в первой строке которого будут записаны разделенные запятыми названия свойств псевдонима process, а в остальных строках — значения этих свойств для всех процессов, запущенных в системе (листинг 3.7). Листинг 3.7. Пример выходного файла с разделителями, полученного с помощью формата csv Node,HandleCount,Name,Priority,ProcessId,ThreadCount,WorkingSetSize, SHIKIN,0,System Idle Process,0,0,1,20480, SHIKIN,194,System,8,4,50,131072, SHIKIN,21,SMSS.EXE,11,364,3,159744, SHIKIN,430,CSRSS.EXE,13,43 6,11,978944, SHIKIN,503,WINLOGON.EXE,13,468,20,2760704, SHIKIN,299,SERVICES.EXE,9,512,16,1556480, SHIKIN,322,LSASS.EXE,9,524,20,1282048, SHIKIN,297,SVCHOST.EXE,8,684,9,1720320, SHIKIN,1343,SVCHOST.EXE,8,728,81,7376896,
SHIKIN,95,SVCHOST.EXE,8,788,6,524288, SHIKIN,192,SVCHOST.EXE,8,804,15,1974272, SHIKIN,155,SPOOLSV.EXE,8,948,11,925696, SHIKIN,129,ALG.EXE,8,1048,5,290816, SHIKIN,101,DBNT1SV.EXE,8,1060,12,2543616, SHIKIN,445,INETINFO.EXE,8,1092,24,966656, SHIKIN,237,SQLSERVR.EXE,8,1136,24,1085440, SHIKIN,382,EXPLORER.EXE,8,340,12,6942720, SHIKIN,64,PCTSPK.EXE,8,416,3,524288, SHIKIN,213,ICQLite.exe,8,420,7,3903488, SHIKIN,50,CTFMON.EXE,8,488,1,532480, SHIKIN,125,MSMSGS.EXE,8,648,2,659456, SHIKIN,65,SQLMANGR.EXE,8,700,2,1040384, SHIKIN,143,wuauclt.exe,8,3488,5,991232 , SHIKIN,772,WINWORD.EXE,8,4068,6,8761344, SHIKIN,120,wmic.exe,8,856,4,3080192, SHIKIN,23,Far.exe,8,2392,1,532480, SHIKIN,115,wmiprvse.exe,8,2704,6,3719168, Примеры команд WMIC В данном разделе приведены примеры команд, которые позволяют из среды WMIC выполнять повседневные администраторские задачи, связанные с управлением компьютером, получением сведений о состоянии оборудования и операционной системы и т. д. Завершение сеанса пользователя Для того чтобы принудительно завершить сеанс пользователя, можно применить метод win32shutDown псевдонима os. Этот метод имеет один обязательный параметр, задающий действие, которое нужно произвести при завершении работы пользователя (это может быть завершение сеанса, перезагрузка или выключение компьютера). Для завершения сеанса пользователя значение этого параметра должно быть равно нулю. Отметим, что метод win32shutDown нельзя вызвать, не указав с помощью оператора where конкретный экземпляр псевдонима os (рис. 3.47). Данная ошибка возникает даже в том случае, когда у псевдонима os имеется единственный экземпляр, поэтому обязательно нужно применить оператор where, задав в качестве условия, скажем, совпадение значения свойства csname с именем компьютера, на котором вызывается метод. Например: /NODE:SHIKIN OS WHERE(CSNAME="SHIKIN") CALL Win32ShutDown 0
Рис. 3.47. Ошибка при выполнении метода Win32ShutDown (не указано условие where) Перезагрузка и выключение компьютера Для перезагрузки компьютера нужно вызвать метод win32shutDown с параметром 2. Например: /NODE: SHIKIN OS WHERE(CSNAME="SHIKIN") CALL Win32ShutDown 2 Выключение компьютера производится путем запуска метода win32shutDown с параметром 1. Например: /NODE:SHIKIN OS WHERE(CSNAME="SHIKIN") CALL Win3 2ShutDown 1 Замечание Для выполнения метода win3 2ShutDown у пользователя должен быть установлен режим использования всех привилегий (/privileges:enable). Вывод информации о BIOS Для получения информации о BIOS (версия, серийный номер, дата выпуска и т. д.) следует вывести свойства псевдонима BIOS: /OUTPUT:C:\bios.txt BIOS GET /FORMAT:TEXTVALUELIST В этом примере данные выводятся в текстовый файл bios.txt, содержимое которого представлено в листинге 3.8. Замечание Изменять значения свойств у псевдонима bios нельзя
Листинг 3.8. Информация о BIOS BuildNumber= Caption=PhoenixBIOS 4.0 Release 6.0 CodeSet= CurrentLanguage=en|US|iso8859-l Description=PhoenixBIOS 4.0 Release 6.0 IdentificationCode= InstallableLanguages=l InstallDate= LanguageEdition= ManufacturerPhoenix Technologies Ltd. Name=PhoenixBIOS 4.0 Release 6.0 OtherTargetOS= PrimaryBI0S=TRUE ReleaseDate=20010411******.******+*** SerialNumber=FR14329405 SMBIOSBIOSVersion=IP.01.07US SMBIOSMajorVersion=2 SMBIOSMinorVersion=2 SMBIOSPresent=TRUE SoftwareElementID=PhoenixBIOS 4.0 Release 6.0 SoftwareElementState=3 Status=OK TargetOperatingSystem=0 Version=PTLTD - 6040000 Просмотр параметров загрузки Информация о параметрах загрузки системы (путь к загрузочным файлам, каталогу для хранения временных файлов, буква последнего диска в системе и т. д.) может быть получена с помощью псевдонима bootconfig (рис. 3.48): BOOTCONFIG GET /VALUE Изменять значения свойств у псевдонима bootconfig нельзя.
Рис. 3.48. Значения параметров загрузки системы Вывод свойств операционной системы С помощью псевдонима os можно просмотреть различные свойства операционной системы, которые могут быть весьма полезны администратору (например, в свойстве LastBootupTime содержится время последней загрузки системы). Следующая команда выводит все свойства псевдонима os в текстовый файл os.txt (листинг 3.9): /OUTPUT:С:\os.txt OS GET /VALUE Замечание Свойства CurrentTimeZone, Description, ForegroundApplicationBoost, QuantumLength и QuantumType у псевдонима OS доступны ДЛЯ записи. Листинг 3.9. Информация об операционной системе BootDevice=\Device\HarddiskVolumel BuildNumber=2600 BuildType=Uniprocessor Free Caption=Microsoft Windows XP Professional CodeSet=1251 CountryCode=7 CreationClassName=Win3 2_OperatingSystem CSCreationClassName=Win3 2_ComputerSystem CSDVersion= CSName=SHIKIN
CurrentTimeZone=240 Debug=FALSE Description= Distributed=FALSE EncryptionLevel=168 ForegroundApplicationBoost=2 FreePhysicalMeniory=20116 FreeSpaceInPagingFiles=219536 FreeVirtualMemory=239652 InstallDate=20021224122559.000000+180 LargeSystemCacne=0 LastBootUpTime=20030625132053.499662+240 LocalDateTime=20030625134723.596000+240 Locale=0419 Manufacturer=Microsoft Corporation MaxNumberOfProcesses=-l MaxProcessMemorySize=2 097 024 Name=Microsoft Windows XP Professional|F:\WINDOWS| \Device\HarddiskO\ Partition2 NumberOfLicensedUsers= NumberOfProcesses=22 NumberOfUsers=2 Organization=Home OSLanguage=1049 OSProductSuite= OSType=18 OtherTypeDescription= PlusProductID= PlusVersionNumber= Primary=TRUE Produc tType=1 QuantumLength=0 QuantumType=0 RegisteredUser=Andrey SerialNumber=55683-OEM-0013917-41219 ServicePackMajorVersion=0 ServicePackMinorVersion=0 SizeStoredInPagingFiles=31542 8 Status=OK
SuiteMask=272 SystemDevice=\Device\HarddiskVolume2 SystemDirectory=F:\WINDOWS\System3 2 SystemDrive=F: TotalSwapSpaceSize= TotalVirtualMemorySize=44494 8 TotalVisibleMemorySize=12 9 52 0 Version^.1.2600 WindowsDirectory=F:\WINDOWS Получение информации о процессоре Получить информацию об установленных процессорах можно с помощью псевдонима cpu. В свойстве DeviceiD этого псевдонима хранится идентификатор процессора (CPUO, CPU1 и т. д.), в свойстве Name — имя процессора, в currentciockspeed — текущая частота и т д. В листинге 3.10 представлено содержимое файла cpu.txt с информацией об одном процессоре. Файл cpu.txt сформирован с помощью следующей команды: /OUTPUT:C:\cpu.txt CPU GET /VALUE Замечание Изменять значения свойств у псевдонима cpu нельзя. Листинг 3.10. Информация о процессоре AddressWidth=32 Architectures Availability=3 Caption=x86 Family 6 Model 8 Stepping 10 ConfigManagerErrorCode= ConfigManagerUserConfig= CpuStatus=l CreationClassName=Win3 2_Processor CurrentClockSpeed=8 97 CurrentVoltage=22 DataWidth=32 Description=x86 Family 6 Model 8 Stepping 10 DeviceID=CPU0 ErrorCleared= ErrorDescription=
ExtClock=100 Family=15 InstallDate= L2CacheSize=128 L2CacheSpeed=897 LastErrorCode= Level=6 LoadPercentage=0 Manufacturer=GenuineIntel MaxClockSpeed=897 Name=npoueccop Intel Celeron OtherFamilyDescription= PNPDeviceID= PowerManagementSupported=FALSE ProcessorId=03 83F9FF0 0 0 006 8A ProcessorType=3 Revision=2058 Role=CPU SocketDesignation=Socket 370 Status=OK StatusInfo=3 Stepping=10 SystemCreationClassName=Win3 2_ComputerSystem SystemName=SHIKIN Uniqueld= UpgradeMethod=1 Уегз1оп=Модель 8, Выпуск 10 VoltageCaps= Получение информации об оперативной памяти Получить сведения об оперативной памяти можно с помощью трех псевдонимов WMIC: memphysical (информация о физической памяти), мемсасне (информация о кэш-памяти) и memlogical (информация о логической памяти). На рис. 3.49 представлен результат выполнения команды memlogical get /value Как мы видим, псевдоним memlogical позволяет, в частности, узнать общий Объем физической Памяти (СВОЙСТВО TotalPhysicalMemory) И объем ВИрту- аЛЬНОЙ ПаМЯТИ (СВОЙСТВО TotalVirtualMemory).
Рис. 3.49. Информация о логической структуре оперативной памяти Вывод и изменение параметров журналов событий Windows Получить доступ к журналам событий Windows можно с помощью псевдонима nteventlog. На рис. 3.50 показан результат выполнения команды, которая выводит основные свойства (размер, полный путь в файловой системе и количество записей) трех журналов Windows (Application, System и Security): NTEVENTLOG LIST BRIEF /FORMAT:TEXTVALUELIST Рис. 3.50. Информация о журналах событий Windows
AccessMask=-l Archive=TRUE Caption=f:\windows\system32\config\appevent.evt Compressed=FALSE CompressionMethod= CreationClassName=Win32_NTEventlogFile CreationDate=20021224120228.900000+*** CSCreationClassName=Win32_ComputerSystem CSName=SHIKIN Description=f:\windows\system32\config\appevent.evt Drive=f: EightDotThreeFileName=f:\windows\system32\config\appevent.evt Encrypted=FALSE EncryptionMethod= Extension=Evt F i1eName=AppEven t FileSize=196608 FileType=Evt File FSCreationClassName=Win3 2_FileSystem FSName=FAT32 Hidden=FALSE InstallDate=200212 241202 28.900000+*** InUseCount= LastAccessed=20030625000000.000000+*** LastModified=200 3 0 625141504.000000+*** LogfileName=Application Manufacturer^ MaxFileSize=52 42 88 Name=F:\WINDOWS\system32\config\AppEvent.Evt NumberOfRecords=62 4 OverwriteOutDated=7 OverWritePolicy=OutDated Path=\windows\system32\config\ Листинг 3.11. Значения параметров журнала событий приложений Windows Если необходимо посмотреть все свойства для определенного журнала (например, журнала событий приложений), то можно воспользоваться следующей командой: NTEVENTLOG WHERE LogFileName="Application" GET /VALUE Результат выполнения этой команды представлен в листинге 3.11.
Readable=TRUE Status=OK System=FALSE Version= Writeable=TRUE Псевдоним nteventlog позволяет также изменять максимальный размер журнала (свойство MaxFiiesize) и количество дней, по истечении которых старые события будут заменяться новыми при достижении максимального размера журнала (свойство overwriteOutDated). Например, для того чтобы установить максимальный размер журнала событий приложений равным 3 Мбайт, нужно выполнить следующую команду (размер журнала здесь указывается в байтах): NTEVENTLOG WHERE LogFileName="Application" SET MaxFileSize=3000000 Вывод записей из журналов событий Windows Для просмотра записей из журналов событий Windows нужно воспользоваться псевдонимом ntevent. Например, для того чтобы вывести основные сведения о всех записях из журнала событий приложений, информирующих о произошедших ошибках, можно выполнить следующую команду: /OUTPUT:С:\NTLogEvent.htm NTEVENT WHERE "LogFile='Application' AND EventType='1'" GET Message, TimeGenerated, SourceName /FORMAT:HTABLE Рис. 3.51. Информация о записях из журнала событий Windows
В результате сформируется HTML-файл NTLogEvent.htm, содержащий таблицу с именем источника и описанием событий, а также датой и временем возникновения этих событий (рис. 3.51). Получение информации о свойствах и состоянии служб Получить доступ к сведениям о зарегистрированных в системе службах можно с помощью псевдонима service. Например, для того чтобы сформировать HTML-таблицу, содержащую информацию о состоянии всех зарегистрированных служб на компьютерах \\Serverl и \\Server2, можно выполнить следующую команду: /NODE:Server1,Server2 /OUTPUT:С:\service.htm SERVICE GET Name, DisplayName, State /FORMAT:HTABLE Замечание Изменять значения свойств псевдонима service нельзя. Запуск и остановка служб У псевдонима service имеются несколько методов, с помощью которых можно, в частности, запускать и останавливать службы на локальном или удаленном компьютере. Для запуска служб предназначен метод startservi.ee. Например, для того чтобы запустить службы Microsoft SQL Server на сервере \\Serverl, нужно выполнить следующую команду: /NODE:Server1 SERVICE WHERE(Name="MSSQLSERVER") CALL StartService Для остановки этой же службы используется метод stopservice: /NODE:Serverl SERVICE WHERE(Name="MSSQLSERVER") CALL StopService Создание и завершение процессов Для создания новых процессов используется метод create псевдонима process, в качестве обязательного параметра которого указывается путь к запускаемому исполняемому файлу. Например, следующая команда откроет стандартный Блокнот Windows: PROCESS CALL Create Notepad.exe Отметим, что при таком использовании метода create нужно следить за параметром Returnvalue, ненулевое значение которого служит индикатором ошибки, произошедшей во время выполнения метода. Если же Returnvalue равно нулю, то значит метод create выполнился успешно (рис. 3.52).
Рис. 3.52. Результат успешного запуска нового процесса Завершить Процесс МОЖНО С ПОМОЩЬЮ Метода Terminate! PROCESS WHERE (Name="Notepad.exe") CALL Terminate У метода Terminate также есть выходной параметр Returnvalue, который здесь имеет тот же смысл, что и в методе create. Мониторинг информации о процессах С помощью параметров /every и /repeat операторов get и list можно периодически выводить значения свойств какого-либо псевдонима, т. е. производить мониторинг состояния объекта, которому этот псевдоним соответствует. Например, пусть нам требуется постоянно следить за количеством операций записи, которые производят процессы, и за объемом данных, записанных этими процессами. Эти данные хранятся в свойствах writeoperationcount и writeTransferCount псевдонима process, поэтому мы можем вывести значения этих свойств с помощью оператора get и добавить параметры /every:ю и /repeat:20, позволяющие автоматически запустить команду 20 раз с интервалом в 10 секунд (рис. 3.53): PROCESS GET Handle, Name, WriteOperationCount, WriteTransferCount /EVERY:10 /REPEAT:20 Другой пример. Пусть нам нужно видеть информацию об использовании страничной и виртуальной памяти процессом system на компьютере \\Shikin. Для этого можно выполнить следующую команду: /NODE:SHIKIN PROCESS WHERE (Name="System") GET Handle, Name, PageFileUsage, VirtualSize /EVERY:10
Рис. 3.53. Мониторинг операций записи, выполняемых процессами Пакетный режим работы WMIC Пакетный режим позволяет автоматизировать работу WMIC — можно создать командный (пакетный) файл Windows, в котором будут вызываться команды WMIC и обрабатываться результаты их выполнения. Естественно, для составления таких пакетных файлов недостаточно только знать нужные команды WMIC, необходимо еще иметь четкое представление о возможностях командного интерпретатора cmd.exe и командных файлов Windows. Надо отметить, что командные файлы Windows XP являются намного более удобным и мощным средством программирования повторяющихся рутинных задач, чем аналогичные файлы в DOS и ранних версиях Windows. Перечислим основные возможности командных файлов в Windows XP. □ В командах внутри файла можно использовать замещаемые параметры командной строки (%0, %1, ..., %9) и переменных среды. При этом над переменными среды и заменяемыми параметрами можно выполнять арифметические действия, а также проводить определенный синтаксический анализ и манипуляции над строками. Изменения переменных среды можно локализовать внутри командного файла или сделать глобальными.
С помощью команды echo можно выводить строки текста на экран,-во внешний файл или на принтер. Команда set с ключом /р дает возможность записать в переменную строку, введенную с клавиатуры. С помощью команды goto можно переходить на заданную команду внутри текущего файла или в новой копии текущего пакетного файла (с произвольными параметрами командной строки). Команда goto :Eof осуществляет немедленный переход в конец пакетного файла. В условном операторе if ... else реализованы различные типы сравнений с помощью ключевых слов eql (равно), neq (не равно), lss (меньше), leq (меньше или равно), gtr (больше), geq (больше или равно). Имеются несколько видов циклов. В частности, реализованы возможности обработки множества файлов, чтения и обработки строк из текстового файла, а также обработки строк вывода определенной команды. Можно вызывать внешние командные файлы (симуляция подпрограмм). К сожалению, рамки данной книги не позволяют подробно рассмотреть команды Windows XP, которые можно применять в командных файлах (желающим получить больше информации по этой теме можно порекомендовать книгу [1], где описаны командные файлы в Windows NT, и справочный файл %SystemRoot%\Help\ntcmds.chm, в котором описаны команды Windows XP). Мы ограничимся здесь лишь рассмотрением двух простых примеров автоматизированного составления с помощью WMIC отчетов о жестких дисках на локальном или удаленном компьютере и открытия этих отчетов для просмотра. Практические примеры командных файлов WMIC В качестве первого примера напишем командный файл PartitionsList.bat, который будет формировать в текстовом файле отчет о физических разделах (partitions) жестких дисков локального компьютера и открывать этот файл в редакторе, ассоциированном в операционной системе с текстовыми файлами (по умолчанию это Блокнот Windows) (рис. 3.54). Предположим также, что создаваться текстовый файл должен на диске С, а его имя должно соответствовать шаблону Partition_jm_MM_rnT.txt, где ДД, ММ и ГГГГ — это текущий день, месяц и год соответственно. Для того чтобы сформировать такое имя файла и сохранить его в переменной FileName, мы воспользуемся командой set в следующем виде: SET FileName=C:\Partition_%DATE:.=_%.txt Выражение %date:.=_% здесь определяет следующую операцию: берется значение переменной среды %date%, в которой хранится системная дата, и все точки заменяются на символы подчеркивания "_" (мы подразумеваем,
что форматом даты в региональных стандартах Windows является ДД ММ.ГГГГ). Рис. 3.54. Отчет о физических разделах жесткого диска, открытый в Блокноте Windows Теперь можно запустить команду WMIC (нам требуется вывести значения свойств экземпляров псевдонима partition в формате текстовой таблицы): WMIC /OUTPUT:"%FileName%" PARTITION LIST BRIEF /FORMAT:TEXTTABLEWSYS В конец полученного выходного файла допишем с помощью команды echo и переменных среды %date% и %time% дату и время формирования отчета: ECHO Отчет создан: %DATE% %TIME% >> iFileName% Замечание Для корректного отображения на экране символов кириллицы в ВАТ-файлах должна использоваться DOS-кодировка. Теперь осталось только выполнить команду start, которая автоматически запустит приложение, ассоциированное в Windows с текстовыми файлами, и откроет в нем наш выходной файл: START %FileName% Полностью файл PartitionsList.bat представлен в листинге 3.12. Листинг 3.12. Командный файл PartitionsList.bat @ECHO OFF REM *************************************************************/ REM Имя: PartitionsList.bat */ REM Язык: ВАТ-файл Windows */
REM Описание: Создание с помощью WMIC текстового отчета о */ REM разделах жестких дисков локального компьютера */ REM *************************************************************/ REM Конструируем имя файла в формате С: \Partition_^_MM_rnT. txt SET FileName=C:\Partition_%DATE:.=_%.txt REM Запускаем команду WMIC для формирования выходного файла WMIC /OUTPUT:"%FileName%" PARTITION LIST BRIEF /FORMAT:TEXTTABLEWSYS REM Дописываем в выходной файл дату и время создания ECHO Отчет создан: °oDATE°6 %TIME% » %FileName% REM Открываем выходной файл START %FileName% REM *************** Коней *******************+*******************/ Во втором примере мы несколько усложним задачу. Напишем командный файл, который в зависимости от значения первого обязательного параметра командной строки (тхт или html) будет формировать отчет о логических разделах жестких дисков либо в текстовом (C:\Drives^£m,_IVIM__rn~T.txt), либо в HTML-файле (C:\Drives J^_M M_ITiT.htm) и автоматически открывать полученный файл с помощью соответствующего приложения (рис. 3.55). Рис. 3.55. Отчет о логических разделах жестких дисков в HTML-формате, открытый в Internet Explorer
В качестве второго необязательного параметра в нашем командном файле можно будет задать либо имя удаленного компьютера, для которого необходимо сделать отчет, либо имя текстового файла со списком таких удаленных компьютеров. Если второй параметр не будет указан, то отчет сформируется для локальной машины. Итак, сначала необходимо проверить, был ли указан в командной строке первый обязательный параметр (формат вывода отчета): IF "%l"=="" GOTO BadParam Если первый параметр не указан, то произойдет переход к метке :BadParam, где мы выводим на экран информацию о синтаксисе запуска командного файла: :BadParam REM Неправильно заданы параметры, выводим информацию о синтаксисе программы ECHO Вывод информации о логических разделах жестких дисков ECHO Ошибка: Не задан формат вывода (ТХТ или HTML) ECHO. ECHO Синтаксис: DrivesList.bat Формат_вывода [Источник] ECHO Источник - имя одного удаленного компьютера или ECHO текстового файла со списком компьютеров ECHO. ECHO Примеры: ECHO DrivesList.bat TXT - отчет для локальной машины ECHO ' в текстовом файле ECHO DrivesList.bat HTML - отчет для локальной машины ECHO в HTML-файле ECHO DrivesList.bat HTML Servl - отчет для компьютеров WServl ECHO DrivesList.bat TXT nodes.txt - отчет для компьютеров, имена ECHO которых записаны в файле nodes.txt Затем мы создадим переменную NodeName, значение которой будет подставлено при запуске команды WMIC в глобальный параметр /node: IF "%2"=="M (GOTO LocalHost) IF EXIST %2 (SET NodeName=@%2) ELSE (SET NodeName=%2) GOTO CheckTXT :LocalHost SET NodeName=. Как мы видим, если второй параметр не был указан, то значением NodeName будет "." (локальный компьютер). Если же второй параметр определяет имя существующего файла, то в NodeName записывается это имя, которому пред-
шествует символ @; в противном случае второй параметр, который должен совпадать с именем удаленного компьютера, записывается в NodeName без изменений. Следующий шаг в командном файле — это проверка значения первого параметра (выходного формата отчета) и в зависимости от него определение переменной outFormat, значение которой (texttablewsys или htable) будет подставлено при запуске команды WMIC в параметр /format, и переменной Extension, в которой будет записано расширение выходного файла (txt или htm). Для того чтобы при проверке значения первого параметра не учитывать регистр символов, мы используем ключ /i в расширенном синтаксисе команды if: :CheckTXT REM Проверяем, задан ли текстовый формат вывода IF /I %1 EQU TXT (SET OutFormat=TEXTTABLEWSYS) ELSE (GOTO CheckHTML) SET Extension^txt GOTO RunWMIC :CheckHTML REM Проверяем, задан ли HTML-формат вывода IF /I %1 EQU HTML (SET OutFormat=HTABLE) ELSE (GOTO BadParam) SET Extension=htm После этого формируем в переменной FileName имя выходного файла и запускаем команду WMIC: REM Запускаем команду WMIC для формирования выходного файла :RunWMIC REM Конструируем имя файла в формате С:\Drives_njI_MM_rrrr.txt REM или С:\Drives_OT_MM_rrrr.htm SET FileName=C:\Drives_%DATE:.=_%.%Extension% WMIC /NODE:"%NodeName%" /OUTPUT:"%FileName%" LOGICALDISK WHERE "Drive- Type=3" LIST BRIEF /FORMAT:%OutFormat% В случае текстового формата вывода допишем в выходной файл информацию о дате и времени формирования отчета: IF /I %1 EQU TXT (ECHO Отчет создан: %DATE% %TIME% » %FileName%) Файл с отчетом мы открываем с помощью команды start, после чего выходим из командного файла: START %FileName% GOTO :EOF Полностью файл DrivesList.bat представлен в листинге 3.13.
Листинг 3.13. Командный файл DrivesL.ist.bat @ЕСНО OFF REM ******************************+*******************************/ REM Имя: DrivesList.bat */ REM Язык: ВАТ-файл Windows -7 REM Описание: Создание с помощью WMIC текстового или HTML-отчета */ REM о логических разделах жестких дисков локального */ REM или удаленного компьютера */ REM **********************************************^ REM Проверяем наличие хотя бы одного параметра командной строки IF "%l"=="» GOTO BadParam REM Задаем имя компьютера, на котором будет выполнена команда IF "%2"=="M (GOTO LocalHost) IF EXIST %2 (SET NodeName=@%2) ELSE (SET NodeName=%2) GOTO CheckTXT :LocalHost SET NodeName=. :CheckTXT REM Проверяем, задан ли текстовый формат Еывода IF /I %1 EQU TXT (SET OutFormat=TEXTTABLEWSYS) ELSE (GOTO CheckHTML) SET Extension=txt GOTO RunWMIC :CheckHTML REM Проверяем, задан ли HTML-формат вывода IF /I %1 EQU HTML (SET OutFormat=HTABLE) ELSE (GOTO BadParam) SET Extension=htm :RunWMIC REM Конструируем имя файла в формате С:\Drives_M_MM_rrrr.txt REM или С:\Drives_JW_MM_rrrr.htm SET FileName=C:\Drives_%DATE:.=_%.%Extension% REM Запускаем команду WMIC для формирования выходного файла
WMIC /NODE:"%NodeName%" /OUTPUT:"%FileName%" LOGICALDISK WHERE "Drive- Type=3" LIST BRIEF /FORMAT:%OutFormat% REM В случае текстового формата вывода дописываем в выходной файл REM дату и время создания отчета IF /I %1 EQU TXT (ECHO Отчет создан: °5DATE% %TIME% » %FileName%) REM Открываем выходной файл START %FileName% GOTO :EOF :BadParam REM Неправильно заданы параметры, выводим информацию о синтаксисе программы ECHO Вывод информации о логических разделах жестких дисков ECHO Ошибка: Не задан формат вывода (ТХТ или HTML) ECHO. ECHO Синтаксис: DrivesList.bat Формат_вывода [Источник] ECHO Источник - имя одного удаленного компьютера или ECHO текстового файла со списком компьютеров ECHO. ECHO Примеры: ECHO DrivesList.bat TXT - отчет для локальной машины ECHO в текстовом файле ECHO DrivesList.bat HTML - отчет для локальной машины ECHO в HTML-файле ECHO DrivesList.bat HTML Servl - отчет для компьютеров \\Servl ECHO DrivesList.bat TXT nodes.txt - отчет для компьютеров, имена ECHO которых записаны в файле nodes.txt REM ^г************ Коней *****+********+********************************/ Расширение схемы WMIC Одним из достоинств архитектуры WMIC является ее расширяемость, т. е. возможность создавать собственные псевдонимы и определять дополнительные форматы преобразования выходных данных команд. В данном разделе мы покажем, как эти возможности реализуются на практике.
Рис. 3.56. Результат применения к псевдониму EVENTFILTER оператора LIST с модификаторами BRIEF и FULL Для создания нового псевдонима запустим описанную в главе 2 утилиту WMI CIM Studio, подключимся к пространству имен Rootxcii и создадим новый экземпляр класса MSFT_ciiAiias (рис. 3.57). Ключевым свойством здесь является FriendiyName, куда записывается имя ПСеВДОНИМа (EventFilter), В СВОЙСТВО Description МЫ Помещаем описание создаваемого псевдонима. Свойство Target должно содержать текст WQL- запроса, который применяется для извлечения экземпляров фильтров событий: Select * from EventFilter В качестве условия where с подстановочными знаками # (свойство pwhere) зададим следующее выражение: Where Name='#' Создание новых псевдонимов Среди стандартных псевдонимов WMIC нет ни одного, с помощью которого можно было бы получить сведения о постоянных потребителях событий WMI или о зарегистрированных фильтрах для этих событий. Поэтому мы в качестве примера создадим псевдоним eventfilter для отображения хранящихся в CIM фильтров событий (рис. 3.56).
Рис. 3.57. Свойства нового псевдонима EventFilter Рис. 3.58. Данные по умолчанию для соединения с подсистемой WMI При Обращении К Псевдониму EVENTFILTER В СВОЙСТВе Connection хранится экземпляр объекта MSFT_CliConnection, в свойствах которого указываются следующие данные: пространство имен
CIM, имя компьютера, имя пользователя и пароль, которые будут использоваться по умолчанию при обращении к псевдониму, и т. д. (рис. 3.58). В свойство Formats нужно записать список модификаторов (наборов свойств псевдонима), которые будут доступны для оператора list, при этом каждый из форматов представляет собой экземпляр класса MSFT_ciiFormat. Для нашего псевдонима мы определим три модификатора: brief, full и SYSTEM. Для модификатора brief зададим табличную форму вывода, назначив свойству format значение table (рис. 3.59). Рис. 3.59. Свойства экземпляра класса MSFT_CliFormat для модификатора BRIEF В свойстве Properties экземпляра класса MSFT_ciiFormat заводится список всех свойств псевдонима, которые будут выводиться в данном модификаторе, при этом каждому свойству соответствует экземпляр класса MSFT_CliProperty. В Модификаторе BRIEF МЫ Определим Три СВОЙСТВа: Name, Query и QueryLanguage. На рис. 3.60 показаны значения свойств экземпляра класса MSFT_ciiProperty, который соответствует свойству Name псевдонима (свойства экземпляров для остальных свойств заполняются аналогичным образом). В свойстве Derivation здесь записывается имя нужного свойства класса EventFilter (в нашем случае ЭТО Name), а В СВОЙСТВе Name — ИМЯ, ПОД КО- торым это свойство будет доступно в псевдониме (в нашем случае это снова Name).
Рис. 3.60. Свойства экземпляра класса MSFT_CliProperty для свойства Name Рис. 3.61. Свойства экземпляра класса MSFT_CliFormat для модификатора FULL Для модификатора full мы задаем форму вывода свойство=значение, определив свойству format значение value (рис. 3.61). В целях экономии места мы не будем описывать здесь свойства, доступные в модификаторах full и system, а приведем MOF-файл с полным описанием
псевдонима eventfilter (листинг 3.14). Напомним, что с помощью компиляции этого MOF-файла описанный в нем псевдоним eventfilter может быть записан в репозигорий CIM на локальном или удаленном компьютере. Замечание J На прилагаемом к книге диске приведены еще два файла (EventConsumer.mof и LogFJIeEventConsumer.mof) с описанием псевдонимов eventconsumer и logfileeventconsumer, позволяющих получить доступ к зарегистрированным в WMI постоянным потребителям событий. Листинг 3.14. MOF-файл с описанием псевдонима eventfilter /у********************************** //* File: EventFilter.mof //* This MOF was generated from the "\\.\ROOT\Cli" //* namespace on machine "SHIKIN". //* To compile this MOF on another machine you should edit this pragma. //•••••••••••••••••it********************* #pragma namespace("\\\\.\\ROOT\\Cli") у/************************************ //* Instances of: MSFT_CliAlias instance of MSFT_CliAlias { Connection = instance of MSFT_CliConnection { Locale = "ms_409" ; NameSpace = nROOT\\CIMV2"; Server = "."; }; Description = "Фильтры событий"; Formats = { instance of MSFT_CliFormat { Format = "TABLE";
Name = "BRIEF"; Properties = { instance of MSFT_CliProperty { Derivation = "Name"; Description = "Имя фильтра"; Name = "Name"; }, instance of MSFT_CliProperty { Derivation = "Query"; Description = "Запрос"; Name = "Query"; }, instance of MSFT_CliProperty { Derivation = "QueryLanguage"; Description =■ "Язык запроса"; Name = "QueryLanguage"; }}; }, instance of MSFT_CliFormat { Format = "VALUE"; Name = " FULL" ; Properties = { instance of MSFT_CliProperty { Derivation = "EventAccess"; Name = "EventAccess"; }, instance of MSFT_CliProperty { Derivation = "EventNamespace"; Name = "EventNamespaсe"; }, instance of MSFT_CliProperty { Derivation = "Name";
Description = "Имя фильтра"; Name = "Name" ; }, instance of MSFT_CliProperty { Derivation = "Query"; Description = "Текст запроса"; Name = "Query"; }, instance of MSFT_CliProperty { Derivation = "QueryLanguage"; Name = "QueryLanguage"; }}; }, instance of MSFT_CliFormat { Format = "Table"; Name = "SYSTEM"; Properties = { instance of MSFT_CliProperty { Derivation = " PATH"; Name = " PATH"; h instance of MSFT_CliProperty { Derivation = " NAMESPACE"; Name = "__NAMESPACE"; }, instance of MSFT_CliProperty { Derivation = " SERVER"; Name = " SERVER"; }, instance of MSFT_CliProperty { Derivation = " PROPERTY_COUNT"; Name = " PROPERTY_COUNT" ;
Определение новых форматов вывода Для того чтобы автоматически преобразовывать информацию, выводимую командами WMIC, к требуемому нестандартному формату, нужно создать соответствующую таблицу стилей XSL и подключать ее с помощью параметра /format операторов list и get. }, instance of MSFT_CliProperty { Derivation = " RELPATH"; Name = " RELPATH"; }, instance of MSFT_CliProperty { Derivation = " DYNASTY"; Name = " DYNASTY"; }, instance of MSFT_CliProperty { Derivation = " SUPERCLASS"; Name = " SUPERCLASS"; }, instance of MSFT_CliProperty { Derivation = " GENUS"; Name = " GENUS"; }, instance of MSFT_CliProperty { Derivation = " CLASS"; Name = " CLASS"; }}; }}; FriendlyName = "EventFilter"; PWhere = "Where Name='#'"; Target = "Select * from EventFilter"; }; //* EOF EventFiIter.mof
Общую структуру XSL-файлов мы здесь описывать не будем (необходимую информацию и примеры по этой теме можно легко найти в Интернете), а лишь рассмотрим один простой пример. Создадим формат evg (т. е. таблицу стилей evg.xsl), с помощью которого информация, выводимая оператором list, будет представляться в следующем виде: □ заголовок, содержащий текст выполняемой команды, описание используемого псевдонима WMIC и текст WQL-запроса, который выполняется при запуске команды; □ список свойств выбираемых экземпляров, разделенных символом | (в первой строке списка должны быть приведены имена свойств). Пример файла evg.txt описанной структуры приведен в листинге 3.15. Этот файл должен формироваться при выполнении следующей команды: /OUTPUT:С:\evg.txt PROCESS LIST BRIEF /FORMAT:EVG Листинг 3.15. Результат применения формата EVG в операторе LIST Forma t: evg.xs1 Command: /OUTPUT:С:\evg.txt PROCESS LIST BRIEF /FORMAT:EVG Description: Управление процессами. Result Query: SELECT ThreadCount, HandleCount, Name, Priority, Processld, WorkingSetSize FROM Win32_Process Node|HandleCount|Name|Priority|Processld|ThreadCount|WorkingSetSize| SHIKIN|0|System Idle Process|0|0|1|20480| SHIKIN|220|System|8|4|48|77824| SHIKIN|21|SMSS.EXE|11|276|3|139264| SHIKIN|350|CSRSS.EXE|13|332|12|2199552| SHIKIN|260|WINLOGON.EXE|13|356|16|905216| SHIKIN|275|SERVICES.EXE|9|400|16|1589248 | SHIKIN|332|LSASS.EXE|9|412|21|1814528| SHIKIN|241|SVCHOST.EXE|8|568|8|2240512| SHIKIN|905|SVCHOST.EXE|8|592|52|7913472| SHIKIN|72|SVCHOST.EXE|8|652|6|1404928| SHIKIN|155|SVCHOST.EXE|8|672|14|1937408| SHIKIN|168|SPOOLSV.EXE|8|792|13|340377 6| SHIKIN|127|DBNT1SV.EXE|8|908|17|4149248| SHIKIN|226|INETINFO.EXE|8|940|15|2834432| SHIKIN|297|Explorer.EXE|8|1572|10|8159232|
SHIKIN|52|ctfmon.ехе|8|1700|1|905216| SHIKIN|128|msmsgs.ехе|8|1708|2|13 51680| SHIKIN|66|sqlmangr.ехе|8|1716|2|2441216| SHIKIN|34|BiPrint.ехе|811724|211515520 | SHIKIN|59|Far.ехе|8|1928|1|3923968| SHIKIN|137|wmic.ехе|8|148|5|4263936| SHIKIN|93|aditor.ехе|8|1236|2|5853184| SHIKIN|228|iexplore.ехе|8|1908|5|8228864| SHIKIN1128 | wrniprvse.ехе | 8 11320 | 8 | 4087808 | Перед тем как приступить к созданию нужной таблицы стилей XSL, напомним, что ранее мы уже рассматривали XML-данные, возвращаемые командой list (см. раздел "Вывод в XML-файл" данной главы). В листинге 3.16 схематично показана структура этих данных (здесь приведены только те элементы, которые нам понадобится обрабатывать в XSL-таблице). Листинг 3.16. XML-структура, выводимая оператором list <COMMAND> <REQUEST> <COMMANDLINE>...< /COMMANDLINE> <COMMANDLINECOMPONENTS> <DESCRIPTION>...</DESCRIPTION <RESULTANTQUERY>...< / RESULTANTQUERY> <PROPERTIES> <PROPERTY> <NAME>...</NAME> </PROPERTY> </PROPERTIES> </COMMANDLINECOMPONENTS> </REQUEST> <RESULTS NODE=...> <CIM> <INSTANCE> < PROPERTY NAME=...> <VALUE>...< / VALUE> </PROPERTY>
</INSTANCE> </CIM> </RESULTS> </COMMAND> Перейдем теперь к написанию файла evg.xsl. Первые строки здесь являются стандартными: <?xml version='1.О' ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output encoding="utf-8" omit-xml-declaration ="yes"/> Следующим обязательным элементом XSL-файла является шаблон (template) для корневого элемента соответствующего входного потока XML- данных. В нашем случае этот шаблон будет иметь следующий вид: <xsl:template match="/"> Format: evg.xsl <xsl:apply-templates select="COMMAND/REQUEST"/> <xsl:apply-templates select="COMMAND/RESULTS"/> </xsl:template> Как мы видим, внутри шаблона для корневого элемента выводится строка Format: evg.xsl, ПОСЛе Чего С ПОМОЩЬЮ ИНСТРУКЦИИ <xsl:apply- tempiates/> применяются еще два шаблона: для элемента <request> и всех элементов, находящихся внутри него, и для элемента <results> и всех элементов, для которых <results> является корневым. В шаблоне для элемента <request> формируется заголовок для выводимой информации, здесь мы сначала с помощью инструкции <xsi:vaiue-of select/> извлекаем значение элементов <commandline>, <description> и <resultantquery>, а потом в цикле <xsi: for-each/> перебираем все элементы <property> и выбираем значения вложенных в них элементов <name> <xsl:template match="REQUEST"> Command: <xsl:value-of select="COMMANDLINE"/> Description: <xsl:value-of select=,,COMMANDLINECOMPONENTS/DESCRIPTIONM/> Result Query: <xsl:value-of select="COMMANDLINECOMPONENTS/ RESULTANTQUERY"/> Node|<xsl:for-each seleet="COMMANDLINECOMPONENTS/PROPERTIES/PROPERTY"> <xsl:value-of select="NAME"/>|</xsl:for-each> </xsl:template>
В шаблоне элементов <instance> (элемент <instance> соответствует возвращаемому в WQL-запросе экземпляру псевдонима) в цикле <xsi:for-each/> по всем элементам <property> выводится список значений элементов <value> (в <value> хранится значение соответствующего свойства экземпляра псевдонима): <xsl:template match="INSTANCE" xml:space="preserve"> <xsl:value-of select^"../../@NODE"/>|<xsl:for-each select="PROPERTY"> <xsl: value-of select= "VALUE" /> | </xsl: f or-eachx/xsl: template> Полностью содержимое файла evg.xsl представлено в листинге 3.17. Для того чтобы формат evg можно было использовать в командах WMIC без указания полного пути к таблице стилей, файл evg.xsl нужно записать в каталог %SystemRoot%\System32\WBEM. Листинг 3.17. Таблица стилей evg.xsl <?xml version='1.О' ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Trans form" version="1.0 " > <xsl:output encoding="utf-8" omit-xml-declaration ="yes"/> <xsl:template match="/"> Format: evg.xsl <xsl -.apply-templates s e lee t=" COMMAND /REQUEST" /> <xsl:apply-templates select="COMMAND/RESULTS"/> </xsl:template> <xsl:template match="REQUEST"> Command: <xsl:value-of select="COMMANDLINE"/> Description: <xsl:value-of select="COMMANDLINECOMPONENTS/DESCRIPTION"/> Result Query: <xsl:value-of select="COMMANDLINECOMPONENTS/ RESULTANTQUERY" / > Node|<xsl:for-each select="COMMANDLINECOMPONENTS/PROPERTIES/PROPERTY"> <xsl:value-of select="NAME"/>|</xsl:for-each> </xsl:template> <xsl:template match="INSTANCE" xml:space="preserve"> <xsl:value-of select="../../©NODE"/>|<xsl:for-each select="PROPERTY"> <xsl:value-of select="VALUE"/>|</xsl:for-each> </xsl:template> </xsl:stylesheet> 9 3ак 1250
Глава 4 Сценарии WSH как средство доступа к WMI В предыдущей главе было показано, как можно с помощью простых командных файлов WMIC автоматизировать работу с WMI. Однако язык командных файлов в силу своей ограниченности плохо подходит для составления более сложных сценариев, требующих, например, полноценной работы с файловой системой, специальными папками Windows или базами данных. Несколько лет назад компания Microsoft предложила в качестве инструмента разработки и выполнения специальных сценариев для операционной системы Windows сервер сценариев Windows Script Host (WSH), различные версии которого входят в стандартную поставку Windows 98/2000/XP. ( Замечание ^ Последняя версия WSH 5.6 включена в Windows XP и Windows Server 2003. Для того чтобы установить и использовать эту версию во всех предыдущих 32-разрядных версиях Windows, необходимо скачать инсталляционный файл для WSH 5.6 с сервера Microsoft (http://msdn.microsoft.com/scripting); там же можно найти и документацию по WSH 5.6. Сценарии WSH могут создаваться с помощью специализированных языков (например, Microsoft Visual Basic Script Edition (VBScript) или Microsoft JScript, краткие справочники по которым приведены в Приложении 4) и использовать любые объекты-серверы автоматизации, зарегистрированные в системе, что и определяет чрезвычайно мощные возможности таких сценариев. Самая важная задача, которую решают сценарии WSH, — это организация взаимодействия с различными ActiveX-технологиями Microsoft: WMI, ActiveX Data Object (ADO), Active Directory Service Interface (ADSI) и т. д. Кроме этого, собственная объектная модель WSH позволяет из сценариев работать с файловой системой, системным реестром, специальными папками и ярлыками Windows, ресурсами локальной сети, а также запускать процессы и контролировать ход их выполнения. В данной главе мы рассмотрим как типичные примеры сценариев WSH, в которых используются только стандартные объекты WSH 5.6, так и сценарии для просмотра данных о различных объектах WM1. Отметим, что здесь
мы будем иметь дело только с простыми сценариями, написанными на одном языке (VBScript или JScript). Более сложные сценарии WSH с разметкой XML, позволяющей, в частности, использовать разные языки в одном сценарии, подробно описаны в [2]. Создание и запуск простейших сценариев WSH Простейший WSH-сценарий, написанный на языке JScript или VBScript, — это обычный текстовый файл с расширением js или vbs соответственно, создать его можно в любом текстовом редакторе, способном сохранять документы в формате "Только текст". Замечание Специальные мощные программы, позволяющие создавать и отлаживать сценарии, описаны в Приложении 3. Размер сценария может изменяться от одной до тысяч строк, предельный размер ограничивается лишь максимальным размером файла в соответствующей файловой системе. В качестве первого примера создадим JScript-сценарий, выводящий на экран диалоговое окно с надписью "Привет!" (рис. 4.1). Рис. 4.1. Простое диалоговое окно Рис. 4.2. Сценарий First.js
Для вывода такого окна достаточно с помощью, например, стандартного Блокнота Windows (notepad.exe) создать файл First.js, содержащий всего одну строку: WScript.Echo("Привет!"); Тот же самый сценарий на языке VBScript, естественно, отличается синтаксисом и выглядит следующим образом: WScript.Echo "Привет!" Несмотря на то, что для работы наших сценариев достаточно всего одной строки, желательно сразу приучить себя к добавлению в начало файла информации 0 находящемся в нем сценарии: имя файла, используемый язык, краткое описание выполняемых действий. На языке JScript такая информация, оформленная в виде комментариев, может выглядеть следующим образом: /•••••••••••••••^ /* Имя: First.js */ /* Язык: JScript */ /* Описание: Вывод на экран приветствия */ На языке VBScript то же самое выглядит следующим образом: 1 Имя: First.vbs ' Язык: VBScript 1 Описание: Вывод на экран приветствия i **•**•****•******•****•*•***** Для запуска сценариев WSH существует несколько способов. Запуск сценария из командной строки в консольном режиме Можно выполнить сценарий из командной строки с помощью консольной версии WSH cscript.exe. Например, чтобы запустить сценарий, записанный в файле C:\Script\First.js, нужно загрузить командное окно и выполнить в нем команду cscript C:\Script\First.js В результате выполнения этого сценария в командное окно выведется строка "Привет!" (рис. 4.3).
Рис. 4.З. Результат выполнения First.js в консольном режиме (cscript.exe) Запуск сценария из командной строки в графическом режиме Сценарий можно выполнить из командной строки с помощью (оконной) графической версии WSH wscript.exe. Для нашего примера в этом случае нужно выполнить команду wscript C:\Script\First.js Рис. 4.4. Результат выполнения First.js в графическом режиме (wscript.exe)
Тогда в результате выполнения сценария на экране появится нужное нам диалоговое окно (рис. 4.4). Таким образом, мы видим, что при запуске сценария в консольном режиме вывод текстовой информации происходит в стандартный выходной поток (на экран), при запуске в графическом режиме — в диалоговое окно. Запуск сценария с помощью меню Пуск Для запуска сценария с помощью пункта Выполнить (Run) меню Пуск (Stan) достаточно написать полное имя этого сценария в поле Открыть (Open) (рис. 4.5). Рис. 4.5. Запуск сценария из меню Пуск в Windows XP В этом случае по умолчанию сценарий будет выполнен с помощью wscript.exe, т. е. вывод информации будет происходить в графическое диалоговое окно. Запуск сценария с помощью Проводника Windows (Windows Explorer) Самым простым является запуск сценария в окнах Проводника Windows или на рабочем столе — достаточно просто выполнить двойной щелчок левой кнопкой мыши на имени файла со сценарием или на его значке (рис. 4.6). Рис. 4.6. Запуск сценария с помощью Проводника Windows
При этом, как и в случае запуска с помощью меню Пуск (Start), сценарий по умолчанию выполняется с помощью wscript.exe. Стандартные объекты WSH 5.6 Перейдем теперь к описанию собственной объектной модели WSH 5.6. С помощью внутренних объектов этой версии WSH из сценариев можно выполнять следующие задачи: □ выводить информацию в стандартный выходной поток (на экран) или в диалоговое окно Windows; □ читать данные из стандартного входного потока (т. е. вводить данные с клавиатуры) или использовать информацию, выводимую другой командой; □ использовать свойства и методы внешних объектов, а также обрабатывать события, которые генерируются этими объектами; □ запускать новые независимые процессы или активизировать уже имеющиеся; □ запускать дочерние процессы с возможностью контроля их состояния и доступа к их стандартным входным и выходным потокам; □ работать с локальной сетью: определять имя зарегистрировавшегося пользователя, подключать сетевые диски и принтеры; □ просматривать и изменять переменные среды; □ получать доступ к специальным папкам Windows; □ создавать ярлыки Windows; П работать с системным реестром. Объектную модель WSH 5.6 формируют следующие объекты. □ wscript. Это главный объект WSH, который служит для создания других объектов или связи с ними, содержит сведения о сервере сценариев, а также позволяет вводить данные с клавиатуры и выводить информацию на экран или в окно Windows. □ wshArguments. Обеспечивает доступ ко всем параметрам командной строки запущенного сценария или ярлыка Windows. □ wshNamed. Обеспечивает доступ к именным параметрам командной строки запущенного сценария. □ wshunnamed. Обеспечивает доступ к безымянным параметрам командной строки запущенного сценария. □ wshsheii. Позволяет запускать независимые процессы, создавать ярлыки, работать с переменными среды, системным реестром и специальными папками Windows.
wshspeciaiFoiders. Обеспечивает доступ к специальным папкам Windows. wshshortcut. Позволяет работать с ярлыками Windows. wshurishortcut. Предназначен для работы с ярлыками сетевых ресурсов. wshEnvironment. Предназначен для просмотра, изменения и удаления переменных среды. wshNetwork. Используется при работе с локальной сетью: содержит сетевую информацию для локального компьютера, позволяет подключать сетевые диски и принтеры. wshscriptExec. Позволяет запускать консольные приложения в качестве дочерних процессов, обеспечивает контроль состояния этих приложений и доступ к их стандартным входным и выходным потокам. wshcontroiier. Позволяет запускать сценарии на удаленных машинах. wshRemote. Позволяет управлять сценарием, запущенным на удаленной машине. wshRemoteError. Используется для получения информации об ошибке, возникшей в результате выполнения сценария, запущенного на удаленной машине. Кроме этого, имеется объект Filesystemobject, обеспечивающий доступ к файловой системе компьютера. Типичные примеры сценариев WSH В этом разделе мы подробно рассмотрим типичные сценарии WSH, позволяющие решать некоторые практические задачи, связанные, в частности, с выводом и вводом текстовой информации, запуском других приложений, созданием ярлыков в различных папках, работой с системным реестром и локальной сетью. Практически все сценарии приведены на двух языках (JScript и VBScript) и снабжены подробными комментариями. Вывод на экран текстовых строк Сформированные в сценарии строки текста можно выводить в стандартный выходной поток (в консольном режиме) или в графическое диалоговое окно несколькими способами: с помощью метода Echo объекта wscript; С ПОМОЩЬЮ МеТОДОВ Write И WriteLine объекта WScript. StdOut; с помощью функции MsgBox языка VBScript; С ПОМОЩЬЮ метода Popup Объекта WshShell.
Метод Echo объекта WScript Примеры использования метода wscript.Echo в сценариях, написанных на языках JScript и VBScript, представлены соответственно в листингах 4.1 и 4.2. Для корректного отображения с помощью метода Echo символов кириллицы, эти символы должны быть представлены в Windows-кодировке (СР 1251). у******************************* /* Имя: Echol.js */ /* Язык: JScript */ /* Описание: Пример использования метода WScript.Echo */ //Печатаем строку текста (кириллица) WScript.Echo("Использование метода Echo (Win-кодировка)"); //Печатаем строку текста и результат вычислений WScript.Echo("Например, 1+2=",1+2); у************* Коней *•*■*■ + *•*■*•******* + ****** + + * + **** + ** + + * + **■*■*■*■*■*■**/ ' Имя: Echol.vbs 1 Язык: VBScript 1 Описание: Пример использования метода WScript.Echo I****************************************** 1 Печатаем строку текста (кириллица) WScript.Echo "Использование метода Echo (Win-кодировка)" 1 Печатаем строку текста и результат вычислений WScript.Echo "Например, 1+2=",1+2 i ** + ***•**•***** Коней ****************+**************************** Если сценарий Echol.js (Echol.vbs) был запущен с помощью cscript.exe, то строки выводятся в командное окно (рис. 4.7). Замечание Листинг 4.1. Вывод строк с помощью метода wscript.Echo (JScript) Листинг 4.2. Вывод строк с помощью метода wscript. Echo (VBScript)
Рис. 4.7. Результат выполнения Echol.js с помощью cscript.exe Если же этот сценарий выполнялся с помощью wscript.exe, то строки по очереди выводятся в диалоговые окна с единственной кнопкой ОК (рис. 4.8). Рис. 4.8. Результат выполнения Echol.js с помощью wscript.exe Рис. 4.9. Диалоговое окно с несколькими строками текста Часто бывает необходимо выводить в диалоговое окно не по одной строке текста, а сразу несколько таких строк (рис. 4.9). Для этого нужно формировать строки, содержащие символы перевода строки: Escape-последовательность \п для JScript и предопределенная именованная константа vberLf для VBScript (соответствующие примеры сценариев приведены в листингах 4.3 и 4.4).
у****************************** /* Имя: Echo2.js */ /* Язык: JScript */ /* Описание: Вывод сразу нескольких строк (WScript.Echo) */ var s; //Объявляем переменную з="Пример\пвывода\пнескольких\пстрок"; //Формируем строки WScript.Echo(s); //Печатаем строки /************* Коней *********************************************/ '******************••****•****•***************•*******************•* ' Имя: Echo2.vbs 1 Язык: VBScript 1 Описание: Вывод сразу нескольких строк (WScript.Echo) <**************•***************************************•************ Option Explicit Dim s ' Объявляем переменную 1 Формируем строки s=MnpHMep"&vbCrLf&"вывода"&vbCrLf&"нескольKHx"&vbCrLf&"строк" WScript.Echo s ' Печатаем строки »************* Конец ************* + ** + ** + *******************+■*■**** Методы Write и WriteLine объекта WScript.StdOut Для вывода строк в сценариях, выполняющихся в консольном режиме, МОЖНО ИСПОЛЬЗОВаТЬ Стандартный ВЫХОДНОЙ ПОТОК WScript.StdOut (СМ. ЛИСТИНГИ 4.5 и 4.6). Напомним, что запускать сценарий, обращающийся к потоку stdout, можно только в консольном режиме с помощью cscript.exe. Если же попробовать выполнить, например, сценарий StdOutl.js с помощью wscript.exe, то произойдет ошибка (рис. 4.10). Листинг 4.3. Вывод в диалоговое окно нескольких строк (JScript)
Рис. 4.10. Ошибка, возникающая при обращении к stdOut в графическом режиме Листинг 4.5. Вывод строк в стандартный выходной поток (JScript) у************************************ /* Имя: StdOutl.js */ /* Язык: JScript */ /* Описание: Пример использования методов StdOut.Write и */ /* StdOut.WriteLine . */ у******************************************* var n; //Объявляем переменную n=l+2; //Печать без перевода строки WScript.StdOut.Write("Использование метода "); //Выводим строку с текущей позиции курсора WScript.StdOut.WriteLine("StdOut.WriteLine"); //Печатаем строку и значение переменной WScript.StdOut.WriteLine("Например, 1+2="+n); /•k-k-k-k-k-k-k-k-k-k-h-k-k Конец *****************************+****+**********/ Листинг 4.6. Вывод строк в стандартный выходной поток (VBScript) I••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• ' Имя: StdOutl.vbs 1 Язык: VBScript 1 Описание: Пример использования методов StdOut.Write и StdOut.WriteLine Option Explicit Dim n ' Объявляем переменную
•••••••••••••••••••••••••••••••••*********^ ' Имя: StdOut2.vbs ' Язык: VBScript ' Описание: Вывод сразу нескольких строк (StdOut. WtiteLme) Option Explicit n=l+2 ' Печать без перевода строки WScript.StdOut.Write "Использование метода " ' Выводим строку с текущей позиции курсора WScript.StdOut.WriteLine "StdOut.WriteLine" ' Печатаем строку и значение переменной WScript.StdOut.WriteLine "Например, 1+2=" & n »••••••*•••*••* Коней ***************++***+++*****************+***+ Замечание В Windows XP и Windows Server 2003 символы кириллицы, посылаемые из сценария в стандартный выходной поток, должны быть представлены в Windows-кодировке (СР 1251). В предыдущих версиях Windows для корректного отображения на экране символы кириллицы, при использовании потока wscript. stdOut, должны быть в DOS-кодировке (OEM 866). Как и при использовании метода wscript.Echo, в качестве параметра метода writeLine можно указывать строки, содержащие символы перевода строки (см. листинги 4.7 и 4.8). Листинг 4.7 Вывод в stdout сразу нескольких строк (JScript) /* Имя: StdOu2.js */ /* Язык: JScript */ /* Описание: Вывод сразу нескольких строк (StdOut.WriteLine) */ /••••••••••••••••••••••••••••••••••••**^ var s; //Объявляем переменную з="Пример\пвывода\пнескольких\пстрок"; //Формируем строки WScript.StdOut.WriteLine(s); //Выводим строки /*•••****•**** Конец ********************************************•*/ ПтаИ?!ж111^тШТ1ТН?Я^
Dim s ' Объявляем переменную ' Формируем строки s="Пример"&vbCrLf&"вывода"&vbCrLf&,,нecкoлькиx"&vbCrLf&пстрок" WScript.StdOut.WriteLine s ' Выводим строки » ******* + ***-*-* Коней + ********* + ** + ***** + ****** + * + ** + **** + **-** + **>' Для создания более компактного текста сценария можно сразу сохранить ссылку на стандартный выходной поток wscript.stdout в отдельную переменную и затем при вызове методов write и writeLine использовать эту переменную (см. листинги 4.9 и 4.10). /* Имя: StdOut3.js */ /* Язык: JScript */ /* Описание: Пример использования метода StdOut.WriteLine */ /•••••••а-********-************ var n,StdOut; //Объявляем переменные n=l+2; StdOut=WScript.StdOut; //Сохраняем ссылку на StdOut в переменной //Выводим строки в StdOut StdOut.WriteLine("Пример использования метода StdOut.WriteLine() ..."); StdOut.WriteLine("1+2="+n); у************* Конец ******************+***+****************+*****/ Листинг 4.10. Сохранение ссылки на поток StdOut в переменной (VBScript) i ******************************************************************* ' Имя: StdOut3.vbs ' Язык: JScript ' Описание: Пример использования метода StdOut.WriteLine I******************************************************************* Option Explicit Dim n,StdOut ' Объявляем переменные n=l+2 Set StdOut=WScript.StdOut ' Сохраняем ссылку на StdOut в переменной ■ЯЧИчч*Е?1ВЯЯ^ЧЧЧч^гмИлИ
' Выводим строки в StdOut StdOut.WriteLine "Это пример использования метода StdOut.WriteLine() ..." StdOut.WriteLine "1+2=" & n i •••••**•••••• Коней ********************************************* Функция MsgBox языка VBScript В языке VBScript существует специальная функция MsgBox, с помощью которой можно выводить информацию в диалоговое окно с несколькими кнопками; также в этом окне можно задавать заголовок и значок (рис. 4.11). Рис. 4.11. Диалоговое окно, созданное с помощью функции MsgBox Пример сценария, создающего такое диалоговое окно, приведен в листинге 4. И. В языке JScript аналога функции MsgBox нет. ' Имя: MsgBox.vbs ' Язык: VBScript ' Описание: Пример использования функции MsgBox ■•*•*•••••••••••••*•**••••*•••*•*••••••*• Dim Res,Text,Title ' Объявляем переменные Text="npHMep вывода строк в диалоговое" & vbCrLf & " окно VBScript" Т^1е="Заголовок" ' Выводим диалоговое окно на экран Res=MsgBox(Text,vbOkCancel+vbInformation+vbDefaultButton2,Title) ' Определяем, какая из кнопок была нажата в диалоговом окне If Res=vbOk Then Замечание ^^^*^ШШШШШШШШШШШ1ШШШШШШШЛШ!Ш
MsgBox "Нажата кнопка ОК" Else MsgBox "Нажата кнопка Отмена" End If < •*****х**т*г*** Коней ********************************************* Подробное описание функции MsgBox приведено в Приложении 4. Здесь же мы отметим только то, что значением функции MsgBox является константа, соответствующая нажатой в диалоговом окне кнопке (в нашем примере такими константами являются vbok и vbcancel). Таким образом, MsgBox может использоваться в сценариях для организации выбора пользователем одного из возможных вариантов, однако это не совсем удобно, так как надписи на кнопках нельзя задавать произвольным образом (можно указать только ОК, Отмена, Стоп, Повтор, Пропустить, Да и Нет). Метод Popup объекта WshShell С помощью метода Popup можно создавать такие же диалоговые окна, как и при помощи функции MsgBox, причем этот метод можно использовать как в сценариях VBScript, так и в JScript (см. листинги 4.12 и 4.13). Листинг 4.12. Создание диалогового окна с помощью метода Popup (JScript) /**•*••*•***••••*•*••*••••••*•*•*•••*• /* Имя: Popup.js */ /* Язык: JScript */ /* Описание: Пример использования метода WshShell.Popup */ /***•*•••*•*••*•*•**•*••••*•••*•••*•*•*•• var WshShell,Res,Text,Title; //Объявляем переменные //Инициализируем константы для диалоговых окон var vbOkCancel=l,vbOk=l; //Создаем объект WshShell WshShell = WScript.CreateObject("WScript.Shell"); Text="npHMep вывода строк в диалоговое\покно WScript"; Т^1е="Заголовок" //Выводим диалоговое окно на экран Res=WshShell.Popup(Text,0,Title,vbOkCancel); // Определяем, какая из кнопок была нажата в диалоговом окне if (Res==vbOk)
WshShell.Popup("Нажата кнопка OK"); else WshShell.Popup("Нажата кнопка Отмена"); /************* Конец *********************************************/ Листинг 4.13. Создание диалогового окна с помощью метода Popup (VBScript) • •••**••••••••*••••*•••*•••••****•••••*•**••••••• ' Имя: Popup.vbs ' Язык: VBScript ' Описание: Пример использования метода WshShe11.Popup !••••••••••••••••••••••••••••• Option Explicit Dim WshShell,Res,Text,Title ' Объявляем переменные ' Создаем объект WshShell Set WshShell = WScript.CreateObject("WScript.Shell") Text="ripHMep вывода строк в диалоговое" & vbCrLf & "окно WScript" Title="Заголовок" ' Выводим диалоговое окно на экран Res=WshShell.Popup(Text,0,Title,vbOkCancel) ' Определяем, какая из кнопок была нажата в диалоговом окне If (Res =vbOk) Then WshShe11.Popup "Нажата кнопка OK" Else WshShe11.Popup "Нажата кнопка Отмена" End If i ••••*••*•••** Конеи ********************************************* Главным отличием метода Popup от функции MsgBox является наличие параметра nSecTowait, задающего время (в секундах), по истечении которого диалоговое окно будет автоматически закрыто. Если этот параметр равен нулю, как в приведенных ранее примерах, то окно будет закрыто только после нажатия какой-либо кнопки в нем. Ввод строк текста Для организации в сценариях диалога с пользователем необходимо уметь принимать вводимые с клавиатуры строки текста. В консольном и графическом режиме ввод информации осуществляется по-разному: при запуске
сценария с помощью cscript.exe мы имеем доступ к стандартному входному потоку stdout, при использовании wscript.exe можно применять функцию inputBox языка VBScript. Ввод строк в консольном режиме Самый простой способ ввести строку в консольном режиме предоставляет метод wscript.stdin.ReadLine, при использовании этого метода ввод завершается нажатием клавиши <Enter>. Отметим, что при использовании стандартного входного потока wscript.stdin в Windows XP может возникнуть проблема, связанная с кодировкой символов кириллицы. Дело в том, что метод wscript.stdin.ReadLine возвращает строку в DOS-кодировке, а для вывода на экран С ПОМОЩЬЮ методов WScript.StdOut.WriteLine ИЛИ WScript. Echo строка должна быть в Windows-кодировке (в предыдущих версиях Windows метод wscript.stdout.writeLine требовал строку в DOS-кодировке). Поэтому для корректного отображения символов кириллицы на экране приходится применять дополнительные функции конвертации из DOS- в Windows-кодировку. Стандартных методов или функций, предназначенных для этой цели, в языках JScript и VBScript нет, поэтому такие функции следует написать самостоятельно. Рассмотрим сначала написанную на JScript функцию конвертации DosTowin из листинга 4.14: function DosToWin(s) { var i,ss; //Объявляем переменные //Проверяем, создан ли объект RusDict if (typeof(RusDict)=="undefined") //Если объект RusDict не создан, создаем его MakeRusDict(); ss=""; for (i=0;i<s.length;i++) { //Цикл по всем символам в строке //Проверяем наличие символа в словаре if (RusDict.Exists(s.charAt(i))) //Преобразуем i-й символ в Windows-кодировку ss+=RusDict.Item(s.charAt(i)); else ss+=s.charAt(i); } return ss; //Возвращаем преобразованную строку }
Как мы видим, эта функция преобразует переданную в качестве параметра строку следующим образом: все символы кириллицы в этой строке переводятся в Windows-кодировку, остальные символы остаются без изменений. ОСНОВНЫМ В фуНКЦИИ DosToWin ЯВЛЯеТСЯ использование Объекта Dictionary (аналог ассоциативного массива) с именем RusDict. Этот объект формируется в функции MakeRusDict и содержит пары "ключ-значение" для всех букв русского алфавита, причем в качестве ключа указывается буква в DOS- кодировке, а в качестве значения — символ с кодом, который соответствует этой букве в Windows-кодировке: function MakeRusDict() { //Создаем объект Dictionary RusDict = WScript.CreateObject("Scripting.Dictionary"); //Заполняем пары "ключ" (символ в DOS-кодировке)- "значение" (символ в //Windows-кодировке) для всех букв русского алфавита RusDict.add ("Ъ", "A"); RusDict.add ("f", "Б"); PusDict.add (",", "В"); RusDict.add ("г", "Г"); RusDict.add ("„", "Д"); RusDict.add (" ", "E") ; RusDict.add ("p", "E"); RusDict.add ("t", "Ж"); RusDict.add ("Ф", "3"); RusDict. add ("€", "И") ; RusDict. add ("oV, "Й") ; RusDict. add ("Jb", "K") ; RusDict. add ("<", "Л") ; RusDict. add ("b", "M") ; RusDict. add ("К", "Н") ; RusDict.add ("Ti", "0"); RusDict.add ("Ц", "П") ; RusDict.add ("5", "P") ; RusDict.add ("x", "C"); RusDict.add ("'", "T"); RusDict.add (""", "У"); RusDict.add (""", "Ф"); RusDict.add ("•", "X"); RusDict.add ("-", "Ц") ; RusDict.add ("-", "4"); RusDict.add ("", "Ш"); RusDict.add ("™", "Щ") ; RusDict. add ("jb", "Ъ") ; RusDict. add (">", "Ы") ; RusDict. add ("н,", "b") ; RusDict.add ("к", "Э"); RusDict.add ("h", "Ю"); RusDict.add ("ц", "Я"); RusDict.add (" ", "a"); RusDict.add ("У", "б"); RusDict.add ("у", "в"); RusDict.add ("J", "r"); RusDict.add ("п", "д"); RusDict.add ("Г", "e") ; RusDict.add ("c", "e"); RusDict.add ("I", "ж"); RusDict.add ("§", "з"); RusDict.add ("E", "и"); RusDict.add ("©", "й"); RusDict.add ("G", "к"); RusDict.add (""", "л"); RusDict.add ("-.", "м"); RusDict.add ("-", "н"); RusDict.add ("©", "o"); RusDict.add ("I", "n"); RusDict.add ("a", "p"); RusDict.add ("6", "c"); RusDict.add ("в", "т"); RusDict.add ("г", "у"); RusDict.add ("д", "ф"); RusDict.add ("e", "x"); RusDict.add ("ж", "ц"); RusDict.add ("з", "ч"); RusDict.add ("и", "ш"); RusDict.add ("й", "щ"); RusDict.add ("к", "ъ"); RusDict.add ("л", "ы"); RusDict.add ("м", "ь"); RusDict.add ("н", "э") ; RusDict.add ("o", V); RusDict.add ("п", "я"); }
В функции DosTowin из VBScript-сценария Stdlnl.vbs (см. листинг 4.15) реализован другой подход к переводу строки в Windows-кодировку, связанный с преобразованием ANSI-кодов символов: Function DosToWin(s) Dim i,k,ss ss="" For i=l To Len(s) ' Цикл по всем символам в строке k = Asc(Mid(s,i,1)) ' Определяем ANSI-код 1-го символа ' Изменяем код к на код соответствующего символа в ' Windows-кодировке If (128 <= k) And (к <= 175) Then к=к+64 Elself (224 <= к) And (к <= 239) Then к=к+1б Elself к = 240 Then к=168 Elself к = 241 Then к=184 End If ss=ss+Chr(к) Next DosToWin=ss ' Возвращаем преобразованную строку End Function Весь алгоритм этой функции состоит в вычислении по ANSI-коду буквы русского алфавита в DOS-кодировке кода символа в Windows-кодировке, соответствующего этой букве. Листинг 4.14. Ввод ОДНОЙ строки с помощью метода Stdln.ReadLine (JScript /*••••**•*•*•****••*••••*•••*••••**•*****•••*••*•* /* Имя: Stdlnl.js */ /* Язык: JScript */ /* Описание: Пример использования метода Stdln.ReadLine */ /••••••*•••*••**••****••••••••••••*•••*•••* var s,RusDict; //Объявляем переменные //Функция для создания объекта Dictionary с парами "ключ-значение", где //"ключ" - буква в DOS-кодировке, //"значение" - символ, соответствующий этой букве в Windows-кодировке
function MakeRusDict() { //Создаем объект Dictionary RusDict = WScript.CreateObject("Scripting.Dictionary"); //Заполняем пары "ключ" (символ в DOS-кодировке)- "значение" (символ в //Windows-кодировке) для всех букв русского алфавита RusDict.add ("Ъ", "A"); RusDict.add ("f", "Б"); RusDict.add (",", "В"); RusDict.add ("г", "Г"); RusDict.add ("„", "Д") ; RusDict.add ("...", "E") ; RusDict.add ("p", "E"); RusDict.add ("t", "Ж"); RusDict.add ("t", "3") ; RusDict.add ("€", "И") ; RusDict.add ("Vo", "Й") ; RusDict.add ("Jb", "K") ; RusDict.add ("<", "Л"); RusDict.add ("ft>", "M"); RusDict.add ("К", "Н"); RusDict.add ("Ъ", "0"); RusDict.add ("Ц", "П") ; RusDict.add ("5", "P"); RusDict.add (">u, "C"); RusDict.add ("'", "T"); RusDict.add (""", "У"); RusDict.add (""", "Ф"); RusDict.add ("•", "X"); RusDict.add ("-", "Ц"); RusDict.add ("-", "4"); RusDict.add ("i", "Ш"); RusDict.add ("™", "Щ"); RusDict. add ("л>", "Ъ") ; RusDict. add (">", "Ы"); RusDict. add ("к,", "Ь") ; RusDict.add ("к", "Э"); RusDict.add ("h", "Ю"); RusDict.add ("ц", "Я"); RusDict.add (" \ "a"); RusDict.add ("У", "б"); RusDict.add ("у", "в"); RusDict.add ("J", "r"); RusDict.add ("и", "д"); RusDict.add ("Г", "e"); RusDict.add ("c", "e"); RusDict.add ("I", "ж"); RusDict.add ("§", "з"); RusDict.add ("Ё", "и"); RusDict.add ("©", "й"); RusDict.add ("е", "к"); RusDict.add (""", "л"); RusDict.add ("-.", "м") ; RusDict.add ("-", "н") ; RusDict.add ("©", "o"); RusDict.add ("I", "n"); RusDict.add ("a", "p"); RusDict.add ("6", "c"); RusDict.add ("в", "т"); RusDict.add ("г", "у"); RusDict.add ("д", "ф"); RusDict.add ("e'\ "x"); RusDict.add ("ж", "ц"); RusDict.add ("з", "ч"); RusDict.add ("и", "ш"); RusDict.add ("й", "щ"); RusDict.add ("к", "ъ"); RusDict.add ("л", "ы"); RusDict.add ("м", "ь") ; RusDict.add ("н", "э"); RusDict.add ("о", "ю"); RusDict.add ("п", "я"); } //Функция для перевода строки из DOS- в Windows-кодировку function DosToWin(s) { var i,ss; //Объявляем переменные //Проверяем, создан ли объект RusDict if (typeof(RusDict)=="undefined") //Если объект RusDict не создан, создаем его MakeRusDict(); ss=""; for (i=0;i<s.length;i++) { //Цикл по всем символам в строке
//Проверяем наличие символа в словаре if (RusDict.Exists(s.charAt(i))) //Преобразуем i-й символ в Windows-кодировку ss+=RusDict.Item(s.charAt(i)); else ss+=s.charAt(i); } return ss; //Возвращаем преобразованную строку } /******•****** Начало *********************************************/ //Печатаем приглашение для ввода WScript.StdOut.Write("Введите одну строку: ") ; s = WScript.Stdln.ReadLine(); //Вводим строку с клавиатуры WScript.StdOut.WriteBlankLines(l); //Печатаем пустую строку WScript.StdOut.Write("Было введено: "); //Преобразовываем введенную строку в Windows-кодировку //и выводим ее на экран WScript.StdOut.WriteLine(DosToWin(s)); /*••*••••••*** Конец *********************************************/ I•*•*•**••••**•*••*•••••••*•*••*•*•••**••*•••*•• ■ Имя: Stdlnl.vbs ' Язык: VBScript ' Описание: Пример использования метода Stdln.WriteLine i •••*••*••*••**•••••••••••*•••*••*•••*••••••*•• ' Функция для перевода строки из DOS- в Windows-кодировку Function DosToWin(s) Dim i,k,ss ss="M For i=l To Len(s) ' Цикл по всем символам в строке k = Asc(Mid(s,i,1)) ' Определяем ANSI-код i-ro символа ' Изменяем код к на код соответствующего символа в ' Windows-кодировке If (128 <= k) And (к <= 175) Then к=к+64 Elself (224 <= к) And (к <= 239) Then ы'ц.'шмьунтавтгасттажт^^ i или шшлви
к=к+16 Elself к = 240 Then к=168 Elself к = 241 Then к=184 End If ss=ss+Chr(к) Next DosToWin=ss ' Возвращаем преобразованную строку End Function • ************* Начало ********************************************* Dim s 1 Печатаем приглашение для ввода WScript.StdOut.Write "Введите одну строку: " s = WScript.Stdln.ReadLine ' Вводим строку с клавиатуры WScript.StdOut.WriteBlankLines 1 ' Печатаем пустую строку WScript.StdOut.Write "Было введено: " ' Преобразовываем введенную строку в Windows-кодировку 1 и выводим ее на экран WScript.StdOut.WriteLine DosToWin(s) • ************* Коней ********************************************* Используя метод wscript.stdin.ReadAii, можно ввести сразу несколько строк подряд, ввод при этом прекращается после нажатия клавиш <Ctrl>+<Z>. Из введенной таким образом переменной можно затем сформировать массив, содержащий все строки. Для этого в JScript применяется метод split объекта string, а в VBScript — одноименная внутренняя функция split (см. листинги 4.16 и 4.17). Листинг4.16. Ввод нескольких строк с помощью метода stdm.ReadAii (JScript) /* Имя: Stdln2.js */ /* Язык: JScript */ /* Описание: Пример использования метода Stdln.ReadAll */ /*********•******************************************* var RusDict; //Функция для создания объекта Dictionary с парами "ключ-значение", где //"ключ" - буква в DOS-кодировке,
//"значение" - символ, соответствующий этой букве в Windows-кодировке function MakeRusDict() { //Создаем объект Dictionary RusDict = WScript.CreateObject("Scripting.Dictionary"); //Заполняем пары "ключ" (символ в DOS-кодировке)- "значение" (символ в //Windows-кодировке) для всех букв русского алфавита RusDict.add ("Ъ", "A"); RusDict.add ("f", "Б"); RusDict.add (",", "В"); RusDict.add ("г", "Г"); RusDict.add ("„", "Д") ; RusDict.add ("...", "E") ; RusDict.add ("p", "E"); RusDict.add ("t", "Ж"); RusDict.add ("Ф", "3"); RusDict. add ("€", "И") ; RusDict. add ("V, "Й"); RusDict. add ("Jb", "K"); RusDict.add ("<", "Л"); RusDict.add ("Б", "М"); RusDict.add ("К", "Н"); RusDict.add ("Ъ", "О"); RusDict.add ("Ц", "П") ; RusDict.add ("Г)п, "Р") ; RusDict.add ("л", "С"); RusDict.add ("'", "T"); RusDict.add С"", "У") ; RusDict.add (""", "Ф"); RusDict.add ("•", "X"); RusDict.add ("-", "Ц"); RusDict.add ("-", "4"); RusDict.add (" ", "Ш"); RusDict.add ("™", "Щ") ; RusDict.add ("л", "Ъ"); RusDict.add (">", "Ы"); RusDict.add ("ft", "Ь"); RusDict.add ("к", "Э") ; RusDict.add ("h", "Ю"); RusDict.add ("цУ, "Я") ; RusDict.add (" ", "a"); RusDict.add ("У", "б"); RusDict.add ("у", "в"); RusDict.add ("J", "r"); RusDict.add ("п", "д"); RusDict.add ("Г", "e"); RusDict.add ("c", "e"); RusDict.add ("!", "ж"); RusDict.add ("§", "з"); RusDict.add ("E", "и"); RusDict.add ("О", "й"); RusDict.add ("G", "к"); RusDict.add (""", "л"); RusDict.add ("-.", V); RusDict.add ("-", "н") ; RusDict.add ("®"f "o") ; RusDict.add ("I", V); RusDict.add ("a", "p") ; RusDict.add ("6", "c"); RusDict.add ("в", "т"); RusDict.add ("г", "у"); RusDict.add ("д", "ф"); RusDict.add ("e", "x"); RusDict.add ("ж", "ц"); RusDict.add ("з", "ч"); RusDict.add ("и", "ш"); RusDict.add ("й", "щ"); RusDict.add ("к", "ъ"); RusDict.add ("л", "ы"); RusDict.add ("м", "ь") ; RusDict.add ("н", "э"); RusDict.add ("о", V); RusDict.add ("п", "я") ; } //Функция для перевода строки из DOS- в Windows-кодировку function DosToWin(s) { var i,ss; //Объявляем переменные //Проверяем, создан ли объект RusDict if (typeof(RusDict)=="undefined") //Если объект RusDict не создан, создаем его MakeRusDict(); ss="";
for (i=0;i<s.length;i++) { //Цикл по всем символам в строке if (RusDict.Exists(s.charAt(i))) //Проверяем наличие символа в словаре //Преобразуем i-й символ в Windows-кодировку ss+=RusDict.Item(s.charAt(i)); else ss+=s.charAt(i); } return ss; } /******•*****• Начало *********************************************/ var s,ArrS,i; //Объявляем переменные //Печатаем приглашение для ввода WScript.StdOut.WriteLine("Вводите строки:"); s = WScript.Stdln.ReadAll(); //Вводим строки с клавиатуры WScript.StdOut.WriteBlankLines(3); //Печатаем пустые строки ArrS=s.split("\n"); //Формируем массив из введенных строк WScript.StdOut.WriteLine("Всего введено строк: "+ArrS.length); for (i=l;i<=ArrS.length;i++) //Преобразовываем введенные строки в Windows-кодировку //и выводим их на экран WScript.StdOut.WriteLine(i+": "+DosToWin(ArrS[i-1])); /************* Коней *********************************************/ Листинг 4.17. Ввод нескольких строк с помощью метода Stdln.ReadAll (VBScript) •******************************************************************* ' Имя: Stdln2.vbs 1 Язык: VBScript 1 Описание: Пример использования метода Stdln.ReadAll ************************************************** Option Explicit 1 Функция для перевода строки из DOS- в Windows-кодировку Function DosToWin(s) Dim i,k,ss ss="" For i=l To Len(s) ' Цикл по всем символам в строке k = Asc(Mid(s,i,1)) ' Определяем ANSI-код i-ro символа 1 Изменяем код к на код соответствующего символа в
' Windows-кодировке If (128 <= k) And (к <= 175) Then к=к+64 Elself (224 <= к) And (к <= 239) Then к=к+16 Elself к = 240 Then к=168 Elself к = 241 Then к=184 End If ss=ss+Chr(к) Next DosToWin=ss ' Возвращаем преобразованную строку End Function • ************* Начало ********************************************* Dim s,ArrS,i,ColStr ' Объявляем переменные 1 Печатаем приглашение для ввода WScript.StdOut.WriteLine "Вводите строки:" s = WScript.Stdln.ReadAll ' Вводим строки с клавиатуры WScript.StdOut.WriteBlankLines 3 ' Печатаем пустые строки ArrS=Split(s, vbCrLf) ' Формируем массив из введенных строк ColStr=UBound(ArrS)+1 1 Печатаем введенные строки WScript.StdOut.WriteLine "Всего введено строк: " & ColStr For i=l To ColStr 1 Преобразовываем введенные строки в Windows-кодировку 1 и выводим их на экран WScript.StdOut.WriteLine i & ": " & DosToWin(ArrS(i-l)) Next i ************* Конец *********************************************/ Ввод строк в графическом режиме В сценариях VBScript в графическом режиме информацию можно вводить с помощью диалогового окна, создаваемого внутренней функцией inputBox (рис. 4.12). Пример сценария, использующего функцию inputBox, представлен в листинге 4.18.
Рис. 4.12. Диалоговое окно со строкой ввода ******************************************************************** ' Имя: InpBox.vbs 1 Язык: VBScript 1 Описание: Пример использования функции InputBox i********************************************** Option Explicit Dim s,sl ' Объявляем переменные sl="npHMep" & vbCrLf & "диалогового окна" & vbCrLf & "для ввода строки" 1 Выводим диалоговое окно со строкой ввода на экран s=InputBox(si,"Диалоговое окно VBScript") 1 Выводим диалоговое окно с введенной строкой MsgBox "Было введено: " & s • ************* Коней *********************************************/ К сожалению, ни в языке JScript, ни в объектной модели WSH нет функции или метода, позволяющих напрямую создавать диалоговые окна со строкой ввода. Однако при помощи файлов сценариев с XML-разметкой (подобные сценарии подробно описаны в [2]) функции языка VBScript (inputBox в частности) можно использовать внутри JScript-сценария. Получение свойств WSH и запущенного сценария На практике часто бывает необходимо знать определенные атрибуты WSH (например, с помощью какого приложения-сервера был запущен сценарий) и сценария, работающего в данный момент (например, имя этого сценария или путь к каталогу, в котором он находится). Некоторые параметры WSH lil!l4J!l!lf:lil:Wi|»M.|.f.l'M'^..M!J'JJ.M.'MIIW!.l»M!IHII!l'.iW.WJ:?.Wt'i:MJJI.Ul
и исполняемого сценария можно определить непосредственно с помощью соответствующих методов объекта wscript: □ полный путь к приложению-серверу (cscript.exe или wscript.exe); □ имя каталога, в котором находится приложение-сервер; □ номер используемой версии WSH; □ полный путь к исполняемому сценарию; □ имя исполняемого сценария. Для проверки режима, в котором был запущен сценарий, можно предложить функцию iscscript (далее приведена реализация этой функции на языке JScript), которая будет возвращать True, если использовался хост cscript.exe (консольный режим), и False, если использовался wscript.exe (графический режим): function IsCScriptO { //Проверка режима, в котором запущен сценарий return ("с"== WScript.FullName.toLowerCase().charAt(WScript.FullName.length - 11) ) ; } Как мы видим, вся работа функции iscscript состоит в определении того, с какой буквы начинается имя приложения-сервера ("с" для cscript.exe или "w" для wscript.exe). Полный путь к текущему каталогу, т. е. к каталогу, из которого был запущен сценарий, Хранится В СВОЙСТВе CurrentDirectory объекта WshShell. Если сценарий был запущен не из того каталога, в котором находится сам файл со сценарием, то текущий каталог не будет совпадать с каталогом сценария. Для того чтобы получить путь к каталогу сценария, нужно выделить этот путь из свойства wscript.scriptFuiiName, содержащего полный путь к выполняемому сценарию (включая имя файла). На языке JScript это можно реализовать с помощью функции GetscriptDir следующего содержания: function GetScriptDir() { var ScriptDir; ScriptDir = WScript.ScriptFullName; ScriptDir = ScriptDir.substring(0, ScriptDir.lastlndexOf("\\")); return ScriptDir; } Полные тексты сценариев на языках JScript (PropScript.js) и VBScript (PropScript.vbs), выводящих на экран сведения о свойствах WSH и запущенного сценария, приведены в листингах 4.19 и 4.20 соответственно; результат работы сценария PropScript.js представлен на рис. 4.13.
Рис. 4.13. Результаты выполнения сценария PropScript.js в графическом режиме Листинг 4.19. Вывод свойств WSH и запущенного сценария (JScript) /* Имя: PropScript.js */ /* Язык: JScript */ /* Описание: Вывод свойств запущенного сценария */ у*************************************************** //Проверка режима, в котором запущен сценарий function IsCScript() { return- ("c"== WScript. FullName. toLowerCase () . charAt (WScript. FullName. length -11)1 } //Возвращает каталог, содержащий запущенный сценарий function GetScriptDir() { var ScriptDir; ScriptDir = WScript.ScriptFullName; ScriptDir = ScriptDir.substring(0, ScriptDir.lastlndexOf("\\")); return ScriptDir; } /******************* Начало **********************************/ var WshShell,s; //Объявляем переменные //Создаем объект WshShell WshShell=WScript.CreateObject("WScript.Shell"); s=" Свойства запущенного сценария:\n\n"; //Проверяем, в каком режиме был запущен сценарий
if (IsCScriptO) s+="3anymeH в консольном режиме\п"; else s+="3anymeH в графическом режиме\п"; //Определяем остальные параметры 3+=»Путь к серверу: "+WScript.FullName+"\n"; з+="Каталог сервера: "+WScript.Path+"\n"; s+="Версия WSH: "+WScript.Version+"\n\n"; з+="Текущий каталог: "+ WshShell.CurrentDirectory+"\n"; з+="Путь к сценарию: "+WScript.ScriptFullName+"\n"; s+="Каталог сценария: "+GetScriptDir()+"\n"; s+="Имя сценария: "+WScript.ScriptName+"\n"; WScript.Echo(s); //Выводим сформированные строки /••••*•*•*■•*■•• Конец ********************************** + **********/ Листинг 4.20. Вывод свойств WSH и запущенного сценария (VBScript) 1 Имя: PropScript.vbs 1 Язык: VBScript 1 Описание: Вывод свойств запущенного сценария Option Explicit ' Проверка режима, в котором запущен сценарий Function IsCScriptO IsCScript=("с"=Mid(LCase(WScript.FullName),Len(WScript.FullName)-10,1)) End Function 1 Возвращает каталог, содержащий запущенный сценарий Function GetScriptDir() Dim ScriptDir ScriptDir = WScript.ScriptFullName ScriptDir = Left(ScriptDir, InstrRev(ScriptDir,"\")-1) GetScriptDir=ScriptDir End Function »••*•••*■*■•*•*•*••*■**■•• Начало ************•******************** + */
Dim WshShell,s ' Объявляем переменные 1 Создаем объект WshShell Set WshShell=WScript.CreateObject("WScript.Shell") s=" Свойства запущенного сценария:" & vbCrLf & vbCrLf 1 Проверяем, в каком режиме был запущен сценарий If IsCScriptO Then s=s & "Запущен в консольном режиме" & vbCrLf Else s=s & "Запущен в графическом режиме" & vbCrLf End If 1 Определяем остальные параметры s=s & "Путь к серверу: " & WScript.FullName & vbCrLf s=s & "Каталог сервера: " & WScript.Path & vbCrLf s=s & "Версия WSH: " & WScript.Version & vbCrLf & vbCrLf s=s & "Текущий каталог: "+ WshShell.CurrentDirectory & vbCrLf s=s & "Путь к сценарию: " & WScript.ScriptFullName & vbCrLf s=s & "Каталог сценария: " & GetScriptDir() & vbCrLf s=s & "Имя сценария: " & WScript.ScriptName & vbCrLf WScript.Echo s ' Выводим сформированные строки • *■**•*•**■*■****■*+ Конец ***************** + **^**** + *jr**** + ***'* + iiir + ***'iir + Работа с параметрами командной строки сценария Используя аргументы командной строки, в сценарии можно передавать различную информацию, скажем, те или иные переключатели или имена пользователей и рабочих станций. При задании аргумента можно указать либо только его значение, либо имя вместе со значением в следующем формате: "/ Имя_аргумента\3начение". Как в имени аргумента, так и в его значении могут использоваться символы кириллицы. Например, выполнив в командном окне строку cscript Example.js /Имя:"Андрей Попов" /Возраст:30 ИЛИ cscript Example.js /Возраст:30 /Имя:"Андрей Попов" Замечание
мы передадим в сценарий Example.js два параметра: имя со значением Андрей попов и возраст со значением зо. Значения этих параметров можно было передать и как безымянные параметры: cscript Example.js "Андрей Попов" 30 Однако в последнем случае при задании безымянных аргументов будет важен порядок их указания в командной строке. В WSH для обработки параметров командной строки служат следующие объе кты - колл екци и: □ wshArguments (содержит все параметры как именные, так и безымянные); □ wshNamed (содержит только именные параметры); □ wshurmamed (содержит только безымянные параметры). Для доступа к коллекциям, содержащим аргументы командной строки, в сценарии сначала нужно создать переменную-экземпляр объекта WshArguments; ДЛЯ ЭТОГО ИСПОЛЬЗуетСЯ СВОЙСТВО Arguments объекта WScript. Пример на языке JScript: var objArgs=WScript.Arguments; Для создания экземпляров коллекций WshNamed и wshunnamed используются соответственно методы Named и unnamed объекта WshArguments. Например: var objNamedArgs=obj Args . Named ; var obj UnnamedArgs=objArgs . Unnamed ; Замечание Для корректной работы с параметрами командной строки, имена которых содержат символы кириллицы, эти имена в сценарии должны быть написаны в кодировке Windows. Рис. 4.14. Результат работы сценария Args.js
В листингах 4.21 и 4.22 приведены примеры сценариев на языках JScript и VBScript, которые выводят на экран общее количество параметров командной строки, количество именных и безымянных аргументов, а также значения каждой из этих групп параметров. Результат работы этих сценариев, запущенных в консольном режиме, представлен на рис. 4.14. Листинг 4.21. Доступ к параметрам командной строки запущенного сценария (JScript) /* Имя: Args.js */ /* Язык: JScript */ /* Описание: Работа с аргументами запущенного сценария */ var i,objArgs, s, objNamedArgs, objUnnamedArgs; //Объявляем переменные objArgs = WScript.Arguments; //Создаем объект WshArguments //Определяем общее количество аргументов s="Bcero аргументов: "+objArgs .Count () +"\n"; for (i=0; i<=objArgs.Count()-1; i++) s+=objArgsd)+"\n"; //Формируем строки со значениями аргументов objUnnamedArgs=objArgs.Unnamed; //Создаем объект WshUnnamed //Определяем количество безымянных аргументов з+="\пБезымянных аргументов: "+objUnnamedArgs.length*"\n"; for (i=0; i<=objUnnamedArgs.length-l; i++) //Формируем строки со значениями безымянных аргументов s+=objUnnamedArgs(i)+"\n"; objNamedArgs=objArgs.Named; //Создаем объект WshNamed //Определяем количество именных аргументов з+="\пИменных аргументов: "+objNamedArgs.length+"\n"; //Проверяем, существует ли аргумент /Имя: if (objNamedArgs.Exists("Имя")) s+=objNamedArgs("Имя")+"\n"; // Проверяем, существует ли аргумент /Сотр: if (objNamedArgs.Exists("Сотр")) s+=objNamedArgs("Сотр")+"\n"; WScript.Echo(s); // Выводим сформированные строки /••••••••*••■*•• Коней *********************************************/
I******************************************************************** 1 Имя: Args.vbs ' Язык: VBScript ' Описание: Работа с аргументами запущенного сценария Option Explicit Dim i, Arg, objArgs, s, objNamedArgs, objUnnamedArgs ' Объявляем переменные Set obj Args = WScript. Arguments ' Создаем объект WshArguments ' Определяем общее количество аргументов s="Bcero аргументов: " & objArgs.Count() & vbCrLf For Each Arg In objArgs s=s & Arg & vbCrLf ' Формируем строки со значениями аргументов Next Set objUnnamedArgs=objArgs.Unnamed ' Создаем объект WshUnnamed ' Определяем количество безымянных аргументов s=s & vbCrLf & "Безымянных аргументов: " & objUnnamedArgs.length & vbCrLf For Each Arg In objUnnamedArgs ' Формируем строки со значениями безымянных аргументов s=s 8c Arg & vbCrLf Next Set objNamedArgs=obj Args. Named ' Создаем объект WshNamed ' Определяем количество именных аргументов s=s & vbCrLf & "Именных аргументов: " & objNamedArgs.Length & vbCrLf ' Проверяем, существует ли аргумент /Имя: If objNamedArgs. Exists ("Имя") Then s=s & objNamedArgs! "Имя") & vbCrLf End If ' Проверяем, существует ли аргумент /Comp: If objNamedArgs.Exists("Comp") Then s=s & objNamedArgs("Comp") & vbCrLf End If WScript.Echo s ' Выводим сформированные строки i ************* Коней я******************************************** Листинг 4.22. Доступ к параметрам командной строки запущенного сценария (VBScript)
Выход из сценария с определенным кодом завершения Любое приложение при завершении своей работы может возвращать операционной системе целое число — код выхода (обычно ненулевое значение этого кода указывает на то, что выполнение программы прервалось в силу той или иной ошибки). Замечание Сама операционная система Windows не проверяет код завершения приложений В WSH код выхода из сценария задается с помощью параметра метода Quit объекта wscript. В листингах 4.23 и 4.24 приведены сценарии, в которых код завершения выбирается в зависимости от того, какая кнопка нажата в диалоговом окне (рис. 4.15): кнопке ОК соответствует код 1, кнопке Отмена — код 0. Рис. 4.15. Диалоговое окно, создаваемое в сценарии Quit.js /•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••у/ /* Имя: Quit.js */ /* Язык: JScript */ /* Описание: Выход из сценария с заданным кодом завершения */ у************************************************ var WshShell,Res,Text,Title; //Объявляем переменные var vbOkCancel=l,vbOk=l; //Инициализируем константы для диалоговых окон //Создаем объект WshShell WshShell = WScript.CreateObject("WScript.Shell"); Text="Bbi6epnTe кнопку для завершения сценария"; Тл^1е="Диалоговое окно"; //Выводим диалоговое окно на экран Res=WshShell.Popup(Text,0,Title,vbOkCancel);
if (Res==vbOk) WScript.Quit(l); else WScript.Quit(0); у************-* Коней *************+****+**************************/ Листинг 4.24. Выход из сценария с заданным кодом завершения (VBScript) ' Имя: Quit.vbs ' Язык: VBScript ' Описание: Выход из сценария с заданным кодом завершения Option Explicit Dim WshShell,Res,Text,Title ' Объявляем переменные ' Создаем объект WshShell Set WshShell = WScript.CreateObject("WScript.Shell") Text="Bbi6epHTe кнопку для завершения сценария" Т^1е="Диалоговое окно" ' Выводим диалоговое окно на экран Res=WshShell.Popup(Text,0,Title,vbOkCancel) If Res=l Then WScript.Quit 1 Else WScript.Quit 0 End If •************* Коней ********************************************* Если сценарий запускался с помощью командного файла, то код выхода можно проанализировать с помощью оператора if errorlevel. Пример подобного ВАТ-файла приведен в листинге 4.25. Здесь сценарий Quit.js запускается с помощью команды start с ключом /wait, указывающим на то, что выполнение ВАТ-файла должно быть приостановлено до окончания работы Quit.js. После этого, если код завершения равен 1 (в диалоговом окне сценария была нажата кнопка ОК), происходит переход к метке :Ок и выдача с помощью команды echo соответствующего сообщения на экран.
©ECHO OFF REM ************************************************************** REM Имя: check.bat REM Язык: ВАТ-файл REM Кодировка: DOS REM Описание: Определение кода завершения для сценария Quit.js REM ***************************************** ©ECHO OFF ECHO Запускаем сценарий Quit.js... START /W Quit.js REM Определяем код завершения для сценария Quit.js IF ERRORLEVEL 1 GOTO :Ok ECHO Для"выхода из Quit.js была нажата кнопка Отмена GOTO :end :0k ECHO Для выхода из Quit.js была нажата кнопка Ok :end Использование внешних объектов автоматизации (на примере Microsoft Word) Для того чтобы из сценария получить доступ к свойствам или методам внешнего сервера автоматизации, вначале надо "создать" соответствующий объект, т. е. загрузить в память экземпляр нужного СОМ-объекта и сохранить в переменной ссылку на этот объект. Объект в сценарии может создаваться несколькими способами: □ с помощью метода createobject объекта wscript (объектная модель WSH); □ с помощью конструкции New Activexobject (язык JScript); □ с помощью функции createobject (язык VBScript). Замечание Листинг 4.25. Анализ кода выхода сценария Quitjs (Check.bat) Для корректного отображения на экране символов кириллицы в ВАТ-файлах должна использоваться DOS-кодировка. Если же код завершения сценария Quit.js был равен 0 (в диалоговом окне была нажата кнопка Отмена), то управление перейдет к строке ECHO Для выхода из Quit.js была нажата кнопка Отмена
В любом случае в используемый метод или функцию в качестве параметра передается программный идентификатор объекта (ProgID), заключенный в скобки. Пример на языке JScript: var WA=WScript.CreateObject("Word.Application"); To же самое на VBScript: Set WA=WScript.CreateObject("Word.Application") Перед точкой в ProgID стоит имя библиотеки типов (type library) для объекта, которая может существовать как в виде отдельного файла с расширением tlb, так и в виде части файла с исполняемым кодом объекта (библиотека типов, содержащая сведения о СОМ-объекте, регистрируется в системном реестре при установке приложения, использующего этот объект). После точки в ProgID указывается имя класса, содержащего свойства и методы, доступные для использования другими приложениями. Выполняя метод CreateObject, интерпретатор сценария через ProgID получает из системного реестра путь к файлам нужной библиотеки типов. Затем с помощью этой библиотеки в память загружается экземпляр запрашиваемого объекта, и его интерфейсы становятся доступными для использования в сценарии. Ссылка на созданный объект сохраняется в переменной; в дальнейшем, используя эту переменную, мы получаем доступ к свойствам и методам объекта, а также к его вложенным объектам (если они имеются). Для примера рассмотрим, каким образом из сценария можно управлять работой Microsoft Word, который является сервером автоматизации (см. листинги 4.26 и 4.27). Сначала создается главный объект word.Application, который запускает приложение Microsoft Word: WA=WScript.CreateObject("Word.Application"); Затем создается новый пустой документ, в результате в переменную wd заносится ссылка на Объект Document: WD=WA.Documents.Add(); Наконец, в переменную sei заносится ссылка на объект selection, с помощью которого можно задать тип и размер шрифта, тип выравнивания абзацев и напечатать в документе строки текста: Sel=WA.Selection; В результате выполнения сценариев PrintlnWord.js или PrintlnWord.vbs в новом документе Word печатаются две строки текста (рис. 4.16), после чего с помощью метода Printout объекта Document содержимое документа выводится на принтер: WD.Printout();
Рис. 4.16. Результат выполнения сценариев PrintlnWord.js ■ '•"'•" »•" '•••• • "•'•' ■•" , Листинг 4.26. Использование сервера автоматизации Microsoft Word (JScript) /* Имя: PrintInWord.js */ /* Язык: JScript */ /* Описание: Использование из сценария внешнего объекта */ /* автоматизации (Microsoft Word) */ у****************************************************** var WA,WD,Sel; //Объявляем переменные //Создаем объект-приложение Microsoft Word WA=WScript.CreateObject("Word.Application"); //Можно было использовать конструкцию //WA=new ActiveXObject("Word.Application"); WD=WA.Documents.Add(); //Создаем новый документ (объект Document) WA.Visible=true; //Делаем Word видимым Sel=WA.Selection; //Создаем объект Selection Sel.Font.Size=14; //Устанавливаем размер шрифта
Sel.ParagraphFormat.Alignment=l; //Выравнивание по центру Sel.Font.Bold=true; //Устанавливаем полужирный шрифт Sel.TypeText("Привет!\n"); //Печатаем строку текста Sel.Font.Bold=false; //Отменяем полужирный шрифт Sel.ParagraphFormat.Alignment=0; //Выравнивание по левому краю //Печатаем строку текста Sel.TypeText("Эти строки напечатаны с помощью WSH."); WD.Printout(); //Выводим документ на принтер /************* Коней ************************************+****+***/ Листинг 4.27. Использование сервера автоматизации Microsoft Word (VBScript) 1 Имя: PrintInWord.vbs ' Язык: VBScript ' Описание: Использование из сценария внешнего объекта ' автоматизации (Microsoft Word) Option Explicit Dim WA,WD,Sel ' Объявляем переменные 'Создаем объект-приложение Microsoft Word Set WA=WScript.CreateObject("Word.Application") ' Можно было использовать конструкцию ' Set WA=CreateObject("Word.Application") Set WD=WA.Documents.Add 'Создаем новый документ (объект Document) WA.Visible=true ' Делаем Word видимым Set Sel=WA.Selection 'Создаем объект Selection Sel.Font.Size=14 'Устанавливаем размер шрифта Sel.ParagraphFormat.Alignments 'Выравнивание по центру Sel.Font.Bold=true 'Устанавливаем полужирный шрифт Sel.TypeText "Привет!" & vbCrLf 'Печатаем строку текста Sel.Font.Bold=false 'Отменяем полужирный шрифт Sel.ParagraphFormat.Alignment=0 'Выравнивание по левому краю 'Печатаем строку текста Sel.TypeText "Эти строки напечатаны с помощью WSH." WD.Printout 'Выводим документ на принтер i ************* Конец *********************************************
Запуск из сценариев внешних программ Сценарии WSH способны запускать другие графические или консольные приложения, причем в последнем случае запущенный процесс может функционировать как дочерний, что позволяет в сценарии-родителе работать с информацией из его входного или выходного потока. Запуск приложений Windows Из сценария WSH запустить другое приложение можно с помощью методов Run ИЛИ Exec объекта WshShell. При использовании метода Run для запускаемого приложения можно задать тип окна (при условии, что приложение поддерживает этот тип). Например, в результате выполнения следующих двух строк JScript-кода: var WshShell = WScript.CreateObject("WScript.Shell"); WshShell.Run("notepad", 3); программа Блокнот (notepad.exe) будет запущена в максимизированном (развернутом на весь экран) окне. ( Замечание ) Метод Run всегда создает новый экземпляр запускаемого процесса, с его помощью нельзя ни повторно активизировать окно запущенного приложения (для этого используется метод AppActivate), ни свернуть или развернуть его. Другим вариантом запуска из сценария приложения Windows является применение метода Exec. Этод метод запускает приложение, путь к которому указан как параметр метода, и возвращает объект wshscriptExec. Например: var WshShell = WScript.CreateObject("WScript.Shell"); var theNotepad = WshShell.Exec("calc"); ( Замечание ) При подобном запуске приложения, в отличие от метода Run, нельзя задать тип окна. Объект wshscriptExec позволяет контролировать ход выполнения запущенного приложения с помощью свойства status — если status равен о, то приложение выполняется, если status равен 1, то приложение завершено. Кроме этого, используя метод Terminate, можно принудительно завершить работу ТОГО Приложения, КОТОРОМУ соответствует Объект WshscriptExec. В листинге 4.28 приведен сценарий на языке JScipt, в котором с помощью метода Exec запускается Блокнот (notepad.exe); ссылка на соответствующий Объект WshscriptExec сохраняется В переменной theNotepad! theNotepad = WshShell.Exec("notepad");
После этого выполнение сценария приостанавливается на 1 секунду (пауза необходима, для того чтобы окно Блокнота успело появиться на экране), после чего выводится диалоговое окно с информацией о статусе запущенного приложения и вопросом о необходимости закрытия Блокнота (рис. 4.17): WScript.Sleep(1000); Text="EnoKHOT запущен (Status="+theNotepad. Status + ") ХпЗакрыть Блокнот?"; Title=""; Res=WshShell.Popup(Text,0,Title,vbQuestion+vbYesNo); Рис. 4.17. Диалоговое окно, формируемое в сценарии ExecWinApp.js В случае утвердительного ответа происходит закрытие Блокнота с помощью метода Terminate! if (Res==vbYes) { theNotepad.Terminate(); WScript.Sleep(100); WScript.Echo("Блокнот закрыт (Status="+theNotepad.Status*")"); } * ; - ... v............... ,..;.- щ ,-••. ..- Листинг 4.28. Запуск и принудительное закрытие приложения (JScript) / * Имя: ExecWinApp. j s * / /* Язык: JScript V /* Описание: Запуск и закрытие приложения (объект WshScriptExec) */ var WshShell,theNotepad,Res,Text,Title; //Объявляем переменные //Инициализируем константы для диалоговых окон var vbYesNo=4,vbQuestion=32,vbYes=6,vbNo=7; //Создаем объект WshShell WshShell = WScript.CreateObject("WScript.Shell"); WScript.Echo("Запускаем Блокнот");
//Запускаем приложение (создаем объект WshScriptExec) theNotepad = WshShell.Exec("notepad"); WScript.Sleep(1000); //Приостанавливаем выполнение сценария Text="RnoKHOT запущен (Status="+theNotepad.Status+")\пЗакрыть Блокнот?"; Title=""; //Выводим диалоговое окно на экран Res=WshShell.Popup(Text,0,Title,vbQuestion-fvbYesNo)/ //Определяем, какая кнопка нажата в диалоговом окне if (Res==vbYes) { theNotepad.Terminate(); //Прерываем работу Блокнота //Приостанавливаем выполнение сценария, для того чтобы Блокнот //успел закрыться WScript.Sleep(100); WScript.Echo("Блокнот закрыт (Status="+theNotepad.Status*")"); } /*•*•••***•*•**** Конец ***************************** + **************•*/ Тот же самый пример на языке VBScript приведен в листинге 4.29. Листинг 4.29. Запуск и принудительное закрытие приложения (VBScript) ■•••*•••••••***•*••*••••*••*••***••**•***********••**•••*• 1 Имя: ExecWinApp. vbs 1 Язык: VBScript 1 Описание: Запуск и закрытие приложения (объект WshScriptExec) i •••••••••••••••••*••••••••••••••••**••*••***•*•*••••**•••** Option Explicit Dim WshShell,theNotepad,Res,Text,Title ' Объявляем переменные 1 Создаем объект WshShell Set WshShell = WScript.CreateObject("WScript.Shell") WScript.Echo "Запускаем Блокнот" 1 Запускаем приложение (создаем объект WshScriptExec) Set theNotepad = WshShell.Exec("notepad") WScript.Sleep 500 ' Приостанавливаем выполнение сценария Text="Блокнот запущен (Status=" & theNotepad.Status & ")" & vbCrLf _ & "Закрыть Блокнот?" Title="" ' Выводим диалоговое окно на экран
Res=WshShell.Popup(Text,0,Title,vbQuestion+vbYesNo) ' Определяем, какая кнопка нажата в диалоговом окне If Res=vbYes Then theNotepad.Terminate ' Прерываем работу Блокнота ' Приостанавливаем выполнение сценария, для того чтобы Блокнот 1 успел закрыться WScript.Sleep 100 WScript.Echo "Блокнот закрыт (Status=" & theNotepad.Status & ")" End If i •*•••••*•**•* Коней *********************************************/ Переключение между приложениями, имитация нажатий клавиш Производить переключение между окнами нескольких запущенных приложений позволяет метод AppActivate объекта wshscript. В качестве аргумента этого метода нужно указывать либо заголовок активизируемого окна, либо идентификатор процесса (Process ID, PID), который запущен в данном окне. Предпочтительным является использование PID, получаемого с помощью свойства ProcessiD объекта wshScriptExec, соответствующего активизируемому приложению. Недостатки применения заголовка окна в методе AppActivate! □ при написании сценария необходимо знать точное название заголовка; □ само приложение может изменить текст в заголовке окна; □ В Случае НеСКОЛЬКИХ ОКОН С ОДИНаКОВЫМИ Заголовками AppActivate всегда будет активизировать один и тот же экземпляр, доступ к другим окнам получить не удастся. Активизировав то или иное окно, в котором выполняется приложение Windows, можно из сценария сымитировать нажатия клавиш в этом окне. Для этого используется метод sendKeys объекта wshsheii (подробное описание этого метода приведено в главе /). ( Замечание ^ Для нормальной работы метода SendKeys необходимо, чтобы языком по умолчанию в операционной системе был назначен английский язык. Рассмотрим пример сценария Run&ExecWinApp.js (листинг 4.30), в котором запускается Калькулятор (calc.exe) и в его окно с помощью sendKeys последовательно посылаются нажатия клавиш <1>, <+>, <2> и <Enter>: theCalculator = WshShell.Exec("calc"); WScript.Sleep(1000);
WshShell.AppActivate(theCalculator.ProcessID) ; WshShell.SendKeys("1{ + }") ; WshShell.SendKeys(" 2") ; WshShell.SendKeys("-"); //Клавиша <Enter> Затем выполнение сценария приостанавливается на 1 секунду, чтобы результат вычислений был виден на экране: WScript.Sleep(1000); Далее результат вычислений (символ "3") копируется в буфер с помощью "нажатия" клавиш <Ctrl>+<C>: WshShell.SendKeys("Ас"); После этого на экран выводится сообщение о том, что Калькулятор будет закрыт: WScript.Echo("Закрываем калькулятор"); в результате чего окно Калькулятора теряет фокус. Для того чтобы вновь активизировать это окно, используется метод AppActivate, параметром которого служит PID Калькулятора: WshShell.AppActivate(theCalculator.ProcessID) ; Для того чтобы закрыть окно Калькулятора, в него посылаются нажатия клавиш <Alt>+<F4>: WshShell.SendKeys("%{F4}"); Рис. 4.18. Результат работы сценария Run&ExecWinApp.js После закрытия Калькулятора запускается Блокнот (notepad.exe) и в него записываются результаты работы Калькулятора (вставка из буфера вычисленной суммы производится с помощью "нажатий" <Ctrl>+<V>): WshShell.Run("notepad"); WScript.Sleep(1000); WshShell.AppActivate("notepad");
WshShel1.SendKeys(" 1 {+} 2 =") ; WshShell.SendKeys("Av"); WshShell.SendKeys(" {(}c{)} Calculator"); В результате в Блокноте отображается текст, показанный на рис. 4.18. Листинг 4.30. Запуск двух приложений и обмен данными между ними (JScript) /••••••••••а*************************** /* Имя: Run&ExecWinApp.js */ /* Язык: JScript * / /* Описание: Запуск двух приложений и обмен данными между ними */ /••••••••••••а***************************************** var WshShell, theCalculator; //Объявляем переменные //Создаем объект WshShell WshShell = WScript.CreateObject("WScript.Shell"); WScript.Echo("Запускаем калькулятор и\п считаем 1+2"); //Создаем объект WshScript (запускаем Калькулятор) theCalculator = WshShell.Exec("calc"); //Приостанавливаем выполнение сценария, для того //чтобы окно Калькулятора успело появиться на экране WScript.Sleep(1000); //Активизируем окно Калькулятора WshShell.AppActivate(theCalculator.ProcessID) ; //Посылаем нажатия клавиш в окно Калькулятора WshShell.SendKeys("1{ + }"); WshShell.SendKeys(" 2") ; WshShe11.SendKeys("~"); //Клавиша <Enter> WScript.Sleep(1000); //Копируем результат вычисления в буфер Windows (<Ctrl>+C) WshShell.SendKeys("Ac"); //Выводим сообщение (активное окно меняется) WScript.Echo("Закрываем калькулятор"); //Активизируем окно Калькулятора WshShell.AppActivate(theCalculator.ProcessID); //Закрываем окно Калькулятора (<Alt>+<F4>) WshShell.SendKeys("%{F4}"); WScript.Echo("Запускаем Блокнот и копируем туда результат"); WshShell.Run("notepad"); //Запускаем Блокнот //Приостанавливаем выполнение сценария, для того чтобы
//окно Блокнота успело появиться на экране WScript.Sleep(1000); WshShell.AppActivate("notepad"); //Активизируем окно Блокнота //Посылаем нажатия клавиш в окно Блокнота WshShell.SendKeys("1{+}2="); //Вставляем содержимое буфера Windows (<Ctrl>+V) WshShell.SendKeys("Av"); //Выводим в окно Блокнота оставшуюся информацию WshShell.SendKeys(" {(}c{)} Calculator"); /************* Коней. ************************** + + ***************•*•*/ Тот же пример, реализованный в виде VBScript-сценария, приведен в листинге 4.31. Листинг 4.31. Запуск двух приложений и обмен данными между ними (VBScript) »••*••••*•••••••••*•*•****•***•*•***** 1 Имя: Run&ExecWinApp.vbs ' Язык: VBScript ' Описание: Запуск двух приложений и обмен данными между ними »•*•*•**•****•*•••*•*••••***•*****••*•*• Option Explicit Dim WshShell, theCalculator ' Объявляем переменные ' Создаем объект WshShell Set WshShell = WScript.CreateObject("WScript.Shell") WScript.Echo("Запускаем калькулятор и" & vbCrLf & "считаем 1+2") ' Создаем объект WshScript (запускаем Калькулятор) Set theCalculator = WshShell.Exec("calc") ' Приостанавливаем выполнение сценария, для того чтобы ' окно Калькулятора успело появиться на экране WScript.Sleep 500 ' Активизируем окно Калькулятора WshShell.AppActivate theCalculator.ProcessID 1 Посылаем нажатия клавиш в окно Калькулятора WshShel1.SendKeys "1{+}" WshShell.SendKeys "2" WshShell.SendKeys "~" ' Клавиша <Enter> WScript.Sleep 500
' Копируем результат вычисления в буфер Windows (<Ctrl>+C) WshShell.SendKeys "Лс" 1 Выводим сообщение (активное окно меняется) WScnpt. Echo "Закрываем калькулятор" 1 Активизируем окно Калькулятора WshShell.AppActivate theCalculator.ProcessID 1 Закрываем окно Калькулятора (<Alt>+<F4>) WshShell.SendKeys "%{F4}" WScripL.Echo "Запускаем Блокнот и копируем туда результат" WshShell.Run "notepad" ' Запускаем Блокнот 1 Приостанавливаем выполнение сценария, для того чтобы 1 окно Блокнота успело появиться на экране WScript.Sleep 1000 WshShell.AppActivate "notepad" ' Активизируем окно Блокнота 1 Посылаем нажатия клавиш в окно Блокнота WshShell.SendKeys "l{+}2=" 1 Вставляем содержимое буфера Windows (<Ctrl>+V) WshShell.SendKeys "Av" 1 Выводим в окно Блокнота оставшуюся информацию WshShell.SendKeys " {(}c{)} Calculator" i************* Коней ********************************************* Запуск независимых консольных приложений и команд Windows Для запуска независимых, т. е. работающих в отдельном адресном пространстве и использующих свою копию переменных среды, консольных приложений или внешних (представленных исполняемыми файлами на жестком диске) команд Windows используется метод Run объекта WshShell. При этом выполнение сценария можно приостановить до окончания работы запущенного приложения, а затем проанализировать код выхода этого приложения (для этого третий параметр метода Run должен равняться True). Соответствующие примеры сценариев на языках JScript и VBScript приведены в листингах 4.32 и 4.33 соответственно. Листинг 4.32. Запуск независимого консольного приложения (JScript) У****************************************************** /* Имя: RunConApp.j s * / /* Язык: JScript */
/* Описание: Запуск независимого консольного приложения и */ /* определение его кода выхода */ /•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••у var WshShell, Code; //Объявляем переменные //Создаем объект WshShell WshShell = WScript.CreateObject("WScript.Shell"); //Запускаем утилиту хсору с ключом "/?" и ожидаем окончания ее работы Code=WshShel1.Run("хсору /?",1,true); //Печатаем полученный код возврата WScript.Echo("Код возврата: ", Code); /************* Коней *********************************************/ Листинг 4 33. Запуск независимого консольного приложения (VBScript) i •••••••••••••••••••••••••••••••••••••••••••••••••• 1 Имя: RunConApp.vbs ' Язык: VBScript ' Описание: Запуск независимого консольного приложения и ' определение его кода выхода i••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• Option Explicit Dim WshShell, Code ' Объявляем переменные ' Создаем объект WshShell Set WshShell = WScript.CreateObject("WScript.Shell") ' Запускаем утилиту хсору с ключом "/?" и ожидаем окончания ее работы Code=WshShell.Run("хсору /?",1,true) 1 Печатаем полученный код возврата WScript.Echo "Код возврата: ", Code i *•***•****••*• Конец *********************************************/ Для выполнения внутренней команды Windows нужно запустить командный интерпретатор cmd.exe и передать ему в качестве параметра нужную команду. Для того чтобы при вызове командного интерпретатора не заботиться о полном пути к cmd.exe, нужно использовать переменную среды comspec. ( Замечание ^ Для получения значения переменной среды ее имя нужно окружить знаками % (например, %comspec%).
/•••••••••••••••••••••••••••••••••••^ /* Имя: RunDOSCom.js */ /* Язык: JSCript */ /* Описание: Выполнение внутренних команд Windows */ /•••••••••••••••••••••••••••••^ •.••• / var WshShell, Code; //Объявляем переменные //Создаем объект WshShell WshShell = WScript.CreateObject("WScript.Shell"); //Запускаем внутреннюю команду COPY WshShell.Run("%COMSPEC% /k copy /?",1); //Запускаем внутреннюю команду DIR WshShell.Run("%COMSPEC% /с dir %WINDIR% > windir.txt",1); /*•••••*•••*•*•••• Коней *********************************************/ Листинг 4.35. Запуск внутренней команды Windows (JScript) i ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• • Имя: RunDOSCom.vbs 1 Язык: VBScript ' Описание: Выполнение внутренних команд Windows • ******************************************************************* Option Explicit Dim WshShell, Code ' Объявляем переменные ' Создаем объект WshShell Set WshShell = WScript.CreateObject("WScript.Shell") ' Запускаем внутреннюю команду COPY Листинг 4.34. Запуск внутренней команды Windows (JScript) В листингах 4.34 и 4.35 приведены сценарии на языках JScript и VBScript, в которых запускаются внутренние команды copy /? (вызов встроенной справки для copy) и dir %windir% (вывод содержимого системного каталога Windows). При этом окно, в котором выполняется команда copy /?, не закрывается после завершения этой команды, т. к. при запуске командного интерпретатора был указан ключ /к, а информация, выводимая командой dir %windir%, перенаправляется в файл windir.txt, после чего командное окно закрывается, т. к. для командного интерпретатора в этом случае был указан ключ /с.
WshShell.Run "%COMSPEC% /k copy /?",1 ' Запускаем внутреннюю команду DIR WshShell.Run "%COMSPEC% /с dir %WINDIR% > windir.txt",1 Запуск дочерних консольных приложений и команд DOS, использование их входных и выходных потоков Консольное приложение или команду DOS можно запустить из сценария как дочернюю задачу, т. е. с теми же переменными среды, что у процесса- родителя. При этом информация, выводимая дочерним процессом, на экран дублироваться не будет, однако из родительского сценария можно считывать информацию из выходного потока и посылать данные во входной поток дочерней задачи (это напоминает конвейеризацию команд DOS, при которой данные выходного потока одной команды поступают во входной поток другой команды, например dir | more). Таким образом, из сценария можно запускать ту или иную утилиту командной строки и обрабатывать выводимые ей данные; иногда таким образом получить нужную информацию бывает проще и быстрее, чем при использовании объектной модели WSH или другого сервера автоматизации. В качестве примера рассмотрим сценарий ExecConApp.js (листинг 4.36), который выводит на экран общее количество файлов в текущем каталоге и их имена (рис. 4.19). Рис. 4.19. Результат выполнения сценария ЕхесСопАрр js Как нетрудно заметить, имена файлов выводятся на экран в том же виде, что и при использовании команды dir /в (рис. 4.20).
Рис. 4.20. Результат выполнения команды DIR /в Таким образом, для получения нужной информации необходимо запустить в качестве дочернего процесса команду dir с ключом /в: ObjExec=WshShell.Exec("%COMSPEC% /с dir /b"); и полностью считать данные, появляющиеся в выходном потоке этого процесса. Для этого в цикле вызывается метод ReadAli, считывающий всю информацию, имеющуюся к тому времени в потоке stdout объекта objExec, в переменную s: IsBreak=false; for (;;) { //Бесконечный цикл //Проверяем, достигнут ли конец выходного потока команды DIR if ('ObjExec.StdOut.AtEndOfStream) //Считываем полностью выходной поток команды DIR s+=ObjExec.StdOut.ReadAli(); if (IsBreak) break; //Выходим из цикла if (ObjExec.Status==l) //Проверяем, не завершилось ли выполнение DIR IsBreak=true; else WScript.Sleep(lOO); //Приостанавливаем сценарий на 0,1 сек } Родительский и дочерний процессы работают асинхронно, поэтому пока команда dir не перестанет выдавать данные, т. е. пока свойство status объекта objExec не станет равным 1, выполнение сценария с помощью метода wscript. sleep периодически приостанавливается на 0,1 секунды.
После того как считаны все данные из выходного потока команды dir (СВОЙСТВО Obj Exec. StdOut.AtEndOf Stream paBHO True), ПРОИСХОДИТ ВЫХОД ИЗ цикла и формирование из переменной s массива выведенных строк: ArrS=s.split("\n"); Теперь остается подсчитать количество файлов в каталоге, которое на единицу меньше количества строк в массиве Arrs: ColFiles=ArrS.length-1; и вывести нужные строки на экран: WScript.StdOut.WriteLine("Всего файлов в текущем каталоге: "+ColFiles); for (i=0;i<=ColFiles-l;i++) WScript.StdOut.WriteLine(ArrS[i]); //Выводим строки на экран ( Замечание ) В дочернем консольном приложении вывод строк в выходной поток происходит в DOS-кодировке, поэтому при наличии символов кириллицы эти строки нужно преобразовывать в кодировку Windows (примеры соответствующих функций конвертации на языках JScript и VBScript приведены в листингах 4.14 и 4.15). /•••••••••••••••••••••••••••••••••••••••••••••••••••••****•***•••***/ /* Имя: ЕхесСопАрр.js */ /* Язык:' JScript */ /* Описание: Запуск дочернего консольного приложения */ у**************************************************** //Объявляем переменные var ObjExec,WshShell,s,IsBreak,ArrS,ColStr,ColFiles,i; //Создаем объект WshShell WshShell = WScript.CreateObject("WScript.Shell"); //Запускаем команду DIR ObjExec=WshShell.Exec("%COMSPEC% /c dir /b"); s=""; IsBreak=false; for (;;) { //Бесконечный цикл //Проверяем, достигнут ли конец выходного потока команды DIR if (!Obj Exec.StdOut.AtEndOfStream) //Считываем полностью выходной поток команды DIR s+=ObjExec.StdOut.ReadAll(); if (IsBreak) яшшвяяттттяттттшшшшттт
break; //Выходим из цикла if (ObjExec.Status==l) //Проверяем, не завершилось ли выполнение DIR IsBreak=true; else WScript.Sleep(100); //Приостанавливаем сценарий на 0,1 сек } ArrS=s.split("\n"); //Формируем массив строк ColFiles=ArrS.length-1; // Количество файлов в текущем каталоге WScript.StdOut.WriteLine("Всего файлов в текущем каталоге: "+ColFiles); for (i=0;i<=ColFiles-l;i++) WScript.StdOut.WriteLine(ArrS[i]); //Выводим строки на экран у************* Коней *********************************************/ Аналогичный сценарий на языке VBScript приведен в листинге 4.37. Листинг 4.37. Запуск дочернего консольного приложения (VBScript) i******************************************************************* ' Имя: ЕхесСопАрр.vbs 1 Язык: VbScript ' Описание: Запуск дочернего консольного приложения i******************************************************************* Option Explicit ' Объявляем переменные Dim ObjExec,WshShell,s,IsBreak,ArrS,ColStr,ColFiles,i ' Создаем объект WshShell Set WshShell = WScript.CreateObject("WScript.Shell") ' Запускаем команду DIR Set ObjExec=WshShell.Exec("%COMSPEC% /c dir /b") s="" IsBreak=False Do While True ' Бесконечный цикл ' Проверяем, достигнут ли конец выходного потока команды DIR If (Not ObjExec.StdOut.AtEndOfStream) Then ' Считываем полностью выходной поток команды DIR s=s+Obj Exec.StdOut.ReadAll End If If IsBreak Then Exit Do ' Выходим из цикла
End If ' Проверяем, не завершилось ли выполнение DIPx If ObjExec.Status=l Then IsBreak=True Else WScript. Sleep 100 ' Приостанавливаем сценарий на 0,1 сек End If Loop ArrS=Split(s,vbCrLf) ' Формируем массив строк ColFiles=UBound(ArrS) ' Количество файлов в текущем каталоге WScript.StdOut.WriteLine "Всего файлов в текущем каталоге: " & ColFiles For i=0 To ColFiles-1 WScript.StdOut.WriteLine ArrS(i) * Выводим строки на экран Next Доступ к специальным папкам Windows XP При установке Windows всегда автоматически создаются несколько специальных папок (например, папка для рабочего стола (Desktop) или папка для меню Пуск (Start)), путь к которым впоследствии может быть тем или иным СПОСОбоМ Изменен. С ПОМОЩЬЮ СВОЙСТВа SpecialFolders Объекта WshShell Рис. 4.21. Пути для всех специальных папок в Windows XP
можно создать объект WshSpeciaiFoiders, который является коллекцией, содержащей пути ко всем специальным папкам, имеющимся в системе. В листингах 4.38 и 4.39 приводятся сценарии на языках JScript и VBScript соответственно, которые формируют список всех имеющихся в системе специальных папок (рис. 4.21). | Листинг 4.38. Формирование списка всех специальных папок (JScript) у************************************************** /* Имя: SpecFoldl.js */ /* Язык: JScript */ /* Описание: Вывод названий всех специальных папок Windows */ у************************************************* var WshShe.11, WshFldrs, i, s; //Объявляем переменные //Создаем объект WshShell WshShell = WScript.CreateObject("Wscript.Shell"); //Создаем объект WshSpeciaiFoiders WshFldrs = WshShell.SpecialFolders; s="CnncoK всех специальных папок:\n\n"; //Перебираем все элементы коллекции WshFldrs for (i=0;i<= WshFldrs.Count()-1;i++){ //Формируем строки с путями к специальным папкам s+=WshFldrs(i)+"\n"; } WScript.Echo(s); Листинг 4.39. Формирование списка всех специальных папок (VBScript) ' Имя: SpecFoldl.vbs 1 Язык: VBScript ' Описание: Вывод названий всех специальных папок Windows Option Explicit Dim WshShell, WshFldrs, SpecFldr, s ' Объявляем переменные ' Создаем объект WshShell Set WshShell = WScript.CreateObject("Wscript.Shell")
' Создаем объект WshSpecialFolders Set WshFldrs = WshShell.SpecialFolders з="Список всех специальных папок:" & vbCrLf & vbCrLf ' Перебираем все элементы коллекции WshFldrs For Each SpecFldr In WshFldrs ' Формируем строки с путями к специальным папкам s=s & SpecFldr & vbCrLf Next WScript.Echo s • ••*•*• + *•••*• Конец ***+********+++*******+**********************/ Объект WshSpecialFolders также позволяет получить путь к конкретно заданной специальной папке. Например, в сценарии SpecFold2.js (листинг 4.40) на экран выводятся пути к папкам рабочего стола (Desktop), избранных ссылок (Favorites) и раздела Программы (Programs) меню Пуск (Run) — рис. 4.22. Рис. 4.22. Пути для некоторых специальных папок /* Имя: SpecFold2.js */ /* Язык: JScript */ /* Описание: Вывод названий заданных специальных папок Windows */ /••••••••••••••••••••••••••••••••••••••••••• var WshShell, WshFldrs, s; //Объявляем переменные //Создаем объект WshShell WshShell = WScript.CreateObject("Wscript.Shell"); //Создаем объект WshSpecialFolders WshFldrs = WshShell.SpecialFolders; //Формируем строки с путями к конкретным специальным папкам Листинг 4.40. Доступ к определенным специальным папкам (JScript)
s="HeKOTopbie специальные папки:\п\п"; s+="Desktop:\t"+WshFldrs("Desktop")+"\n"; s+="Favorites:\t"+WshFldrs("Favorites")+"\n"; s+="Programs:\t"+WshFldrs("Programs"); WScript.Echo(s); //Вьгоодим сформированные строки на экран /*•***•*•******* Коней ***+**************************+**************/ Реализация того же сценария на языке VBScript приведена в листинге 4.41. <•••••••••••••••••••••••••••••••••••••••••••••••••••••*••*•••••+••• ' Имя: SpecFold2.vbs ' Язык: VBScript ' Описание: Вывод названий заданных специальных папок Windows ••••••**•*•*•*+••**•*•••••••••*•*••**••**•**•***•*••*•* Option Explicit Dim WshShell, WshFldrs, s ' Объявляем переменные 1 Создаем объект WshShell Set WshShell = WScript.CreateObject("Wscript.Shell") ' Создаем объект WshSpecialFolders Set WshFldrs = WshShell.SpecialFolders ' Формируем строки с путями к конкретным специальным папкам s="HeKOTopbie специальные папки:" & vbCrLf & vbCrLf s=s+"Desktop:"+WshFldrs("Desktop") & vbCrLf s=s+"Favorites:"+WshFldrs("Favorites") & vbCrLf s=s+"Programs:"+WshFldrs("Programs") WScript.Echo s ' Выводим сформированные строки на экран i **••**•••**•* Конец *********************************************/ Создание ярлыков в специальных папках Для того чтобы из сценария создать ярлык в специальной папке (рабочий стол, меню Пуск (Start) и т. п.) или изменить свойства уже существующего ярлыка, необходимо выполнить ряд условий. 1. Используя коллекцию WshSpecialFolders, узнать путь к нужной специ- альной папке. 2. С помощью метода createshortcut объекта WshShell создать объект wshshortcut (wshurishortcut) для связи с ярлыком в этой папке. ||ЩД]1Ш1:аШ.1.ЦЛ.1а.1.1.!:1.1:1.М!1!1Я|1Ц.1:111!И.Ш!Ш1.'1.М.1!М.'1Ш:Ы^1.и1
3. Задать или изменить свойства ярлыка с помощью соответствующих методов Объекта Wshshortcut (WshUrlShortcut). 4. Сохранить ярлык с помощью метода save объекта wshshortcut (WshUrlShortcut). Объект wshshortcut предоставляет доступ к следующим свойствам ярлыков (рис. 4.23): □ Объект (Target); □ Рабочая папка (start in); □ БЫСТРЫЙ ВЫЗОВ (Shortcut key); □ Окно (Run); □ Комментарий (Comment). Кроме этого, с помощью объекта wshshortcut можно сменить значок, который соответствует ярлыку. Рис. 4.23. Свойства ярлыка в Windows XP Остальных свойств, имеющихся у ярлыков в Windows XP, объект wshshortcut не поддерживает (например, нельзя установить или сбросить флажок, по-
зволяющии запускать процесс в отдельном адресном пространстве или под другой учетной записью пользователя). В качестве примера далее приведен сценарий Shortcut.js (листинг 4.42), в котором создается ярлык "Мой ярлык.Ink" для Блокнота (notepad.exe), причем этот ярлык может быть сохранен либо в меню Программы (Programs) работающего пользователя, либо на его рабочем столе. Выбор специальной папки в сценарии производится с помощью диалогового окна, которое создается методом Popup объекта wshsheii (рис. 4.24). Рис. 4.24. Диалоговое окно для выбора специальной папки Рис. 4.25. Свойства ярлыка "Мой ярлык.Ink"
Для создаваемого ярлыка выбирается значок из файла Shell32.dll, находящегося в подкаталоге System32 каталога Windows (в Windows 95/98 этот файл находится в подкаталоге System), назначается комбинация горячих клавиш <Ctrl>+<Alt>+<N> и устанавливается максимизированный тип окна (рис. 4.25). Листинг 4.42. Доступ к определенный специальным папкам (JScript) /••••••••••••••••••*••••••*•••••••••••••••••••••••••••••••••••• /* Имя: Shortcut.js */ /* Язык: JScript */ /* Описание: Создание ярлыков в специальных папках */ /••••••••••••••••••••••••••••••^ //Объявляем переменные var WshShell,MyShortcut,PathTarg,Pathlcon,Res,PathShortcut; //Инициализируем константы для диалоговых окон var vbYesNo=4,vbQuestion=32,vbYes=6; //Создаем объект WshShell WshShell = WScript.CreateObject("WScript.Shell"); //Выводим запрос для выбора папки, в которой будет создан ярлык Res=WshShell.Popup("Где создать ярлык?\пДа — на рабочем столе\пНет — в меню Программы",О, "Работа с ярлыками",vbQuestion+vbYesNo); if (Res==vbYes) //Нажата кнопка Да //Определяем путь к рабочему столу PathShortcut = WshShell.SpecialFolders("Desktop"); else //Определяем путь к меню Программы PathShortcut = WshShell.SpecialFolders("Programs"); //Создаем объект-ярлык MyShortcut = WshShell.CreateShortcut(PathShortcut*"\\Мой ярлык.Ink"); //Устанавливаем путь к файлу PathTarg=WshShell.ExpandEnvironmentStrings("%windir%\\notepad.exe"); MyShortcut.TargetPath = PathTarg; //Назначаем комбинацию горячих клавиш MyShortcut.Hotkey = "CTRL+ALT+N"; //Выбираем значок из файла SHELL32.dll PathIcon= WshShell.ExpandEnvironmentStrings("%windir%\\system32\\SHELL32.dll");
MyShortcut.IconLocation = PathIcon+'\ 1"; MyShortcut.WindowStyle=3; //Устанавливаем тип окна (максимизировано) MyShortcut.Save(); //Сохраняем ярлык WScript.Echo("Ярлык создан| ") ; /••••••••••••■а- Коней *********************************************/ Реализация того же сценария на языке VBScript приведена в листинге 4.43. I ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• ' Имя: Shortcut.vbs ' Язык: JScript ' Описание: Создание ярлыков в специальных папках i******************************************** Option Explicit ' Объявляем переменные Dim WshShell,MyShortcut,PathTarg,Pathlcon,Res,PathShortcut ' Создаем объект WshShell Set WshShell = WScript.CreateObject("WScript.Shell") ' Выводим запрос для выбора папки, в которой будет создан ярлык Res=WshShell.Popup("Где создать ярлык?" & vbCrLf & "Да - на рабочем столе" & vbCrLf & _ "Нет — в меню Программы",0,"Работа с ярлыками",vbQuestion+vbYesNo) If Res=vbYes Then ' Нажата кнопка Да ' Определяем путь к рабочему столу PathShortcut = WshShell.SpecialFolders("Desktop") Else 1 Определяем путь к меню Программы PathShortcut = WshShell.SpecialFolders("Programs") End If ' Создаем объект-ярлык Set MyShortcut = WshShell.CreateShortcut(PathShortcut+"\MoH ярлык.Ink") ' Устанавливаем путь к файлу PathTarg=WshShell.ExpandEnvironmentStrings("%windir%\\notepad.exe") MyShortcut.TargetPath = PathTarg ' Назначаем комбинацию горячих клавиш
MyShortcut.Hotkey = "CTRL+ALT+N" 1 Выбираем значок из файла SHELL32.dll Pathlcon = _ WshShell.ExpandEnvironmentStrings("%windir%\system32\SHELL32.dll") MyShortcut.IconLocation = Pathlcon & ", 1" MyShortcut.WindowStyle=3 ' Устанавливаем тип окна (максимизировано) MyShortcut.Save ' Сохраняем ярлык WScript.Echo "Ярлык создан|" t ************* Конец ********************************************* Работа с системным реестром Windows Во всех версиях Windows системный реестр — это база данных, в которой хранится информация о конфигурации компьютера и операционной системы. С точки зрения пользователя, реестр является иерархическим деревом разделов, подразделов и параметров. Работать с этим деревом можно с помощью стандартного редактора реестра RegEdit.exe (рис. 4.26). Рис. 4.26. Редактор реестра regedit.exe С помощью методов объекта wshsheii из сценариев WSH можно: □ создавать новые разделы и параметры (метод Regwrite); □ изменять значения параметров и разделов (метод Regwrite); □ считывать значения параметров и разделов (метод RegRead); □ удалЯТЬ параметры И разделы (меТОД RegDelete). Замечание В Windows XP для работы с системным реестром сценарий должен иметь разрешение на доступ к разделам реестра, которым обладает администратор
В листинге 4.44 представлен сценарий Registry.js, который производит манипуляции внутри корневого раздела hkey_current_user, причем каждая операция выполняется только после утвердительного ответа на соответствующий запрос, формируемый в диалоговом окне. Сначала в разделе hkey_current_user создается подраздел ExampieKey, в который затем записывается строковый параметр ExampleValue со значением Value from WSH (рис. 4.27). Рис. 4.27. Элементы системного реестра, создаваемые сценарием Registry.js После этого параметр Exampievaiue и раздел ExampieKey последовательно удаляются из реестра. Листинг 4.44. Работа с системным реестром (JScript) у************************************************* /* Имя: Registry.js */ /* Язык: JScript */ /* Описание: Работа с системным реестром */ //Объявляем переменные var WshShell,Root,Key,Res,SValue,ValueName,SRegValue; //Инициализируем константы для диалоговых окон var vbYesNo=4,vbQuestion=32,vblnformation=64,vbYes=6,vbOkOnly=0; Root="HKEY_CURRENT_USER"; //Корневой ключ
Кеу="\\ExampleKey\\"; //Новый ключ ValueName="ExampleValue"; //Имя нового параметра SValue="Value from WSH"; //Значение нового параметра //Создаем объект WshShell WshShell=WScript.CreateObj ect("WScript.Shell"); //Запрос на создание нового ключа Res=WshShe11.Popup("Создать Kni04\n"+Root+Key+"?",О, "Работа с реестром",vbQuestion+vbYesNo); if (Res==vbYes) { //Нажата кнопка Да //Записываем новый ключ WshShell.RegWrite(Root+Key,""); WshShell. Popup("Kjuo4\n"+Root+Key+" создан ! ", О, "Работа с реестром",vblnformation+vbOkOnly); } //Запрос на запись нового параметра Res=WshShell.Popup("Записать napaMeTp\n"+Root+Key+ValueName+"?", 0, "Работа с реестром",vbQuestion+vbYesNo); if (Res==vbYes) { //Нажата кнопка Да //Записываем новый строковый параметр WshShell.RegWrite(Root+Key+ValueName,SValue,"REG_SZ"); WshShell.Popup("Параметр\n"+Root+Key+ValueName+" записан' ", 0, "Работа с реестром",vblnformation+vbOkOnly); //Считываем значение созданного параметра SRegValue=WshShell.RegRead(Root+Key+ValueName); //Выводим на экран полученное значение WshShell.Popup(Root+Key+ValueName+"="+SRegValue,0, "Работа с реестром",vblnformation+vbOkOnly); } //Запрос на удаление параметра Res=WshShell.Popup("Удалить параметр\п"+Root+Key+ValueName+"?",0, "Работа с реестром",vbQuestion+vbYesNo); if (Res==vbYes) { //Нажата кнопка Да //Удаляем параметр WshShell.RegDelete(Root+Key+ValueName); WshShell.Popup("ПараметрХп"+Root+Key+ValueName+" удален!",0,
"Работа с реестром",vblnformation+vbOkOnly); } //Запрос на удаление раздела Res=WshShell.Popup("Удалить paздeл\n"+Root+Key+"?",О, "Работа с реестром",vbQuestion+vbYesNo); if (Res==vbYes) { //Нажата кнопка Да //Удаляем раздел WshShell.RegDelete(Root+Key); WshShell.Popup("Раздел\n"+Root+Key+" удален'",0, "Работа с реестром",vblnformation+vbOkOnly); } /■к************ Коней *********************************************/ Реализация того же сценария на языке VBScript приведена в листинге 4.45. ; ;■ ;• 4 ••--'•■ '" • - ■"•••'■' Листинг 4.45. Работа с системным реестром (VBScript) i ******************************************** 1 Имя: Registry.vbs 1 Язык: VBScript 1 Описание: Работа с системным реестром • ************************************** Option Explicit 'Объявляем переменные Dim WshShell, Root, Key, Res, SValue, ValueName, SRegValue Root=nHKEY_CURRENT_USER" 'Корневой ключ Key="\ExampleKey\" 'Новый ключ ValueName=llExampleValue" 'Имя нового параметра SValue="Value from WSH" 'Значение нового параметра 'Создаем объект WshShell Set WshShell=WScript.CreateObject("WScript.Shell") 'Запрос на создание нового ключа Res=WshShell.Popup("Создать ключ" & vbCrLf & Root & Key & "?",0,_ "Работа с реестром",vbQuestion+vbYesNo)
If Res=vbYes Then 'Нажата кнопка Да 'Записываем новый ключ WshShell.RegWrite Root & Key, "" WshShell.Popup "Ключ" & vbCrLf & Root & Key & " создан!",0,_ "Работа с реестром",vblnformation+vbOkOnly End If 'Запрос на запись нового параметра Res=WshShell.Popup("Записать параметр" & vbCrLf & Root & Key & _ ValueName & "?",О,"Работа с реестром",vbQuestion+vbYesNo) If Res=vbYes Then 'Нажата кнопка Да 'Записываем новый строковый параметр WshShell.RegWrite Root & Key & ValueName,SValue,"REG_SZ" WshShell.Popup "Параметр" & vbCrLf & Root & Key & _ ValueName & " записан!",0,"Работа с реестром",vblnformation+vbOkOnly 'Считываем значение созданного параметра SRegValue=WshShell.RegRead(Root & Key & ValueName) 'Выводим на экран полученное значение WshShell.Popup Root & Key & ValueName & "=" & SRegValue,0,_ "Работа с реестром",vblnformation+vbOkOnly End If 'Запрос -на удаление параметра Res=WshShell.Popup("Удалить параметр" & vbCrLf & Root & Key & _ ValueName & "?",0,"Работа с реестром",vbQuestion+vbYesNo) If Res=vbYes Then 'Нажата кнопка Да 'Удаляем параметр WshShell.RegDelete Root & Key & ValueName WshShell.Popup "Параметр" & vbCrLf & Root & Key & _ ValueName & " удален!",0,"Работа с реестром",vblnformation+vbOkOnly End If 'Запрос на удаление раздела Res=WshShell.Popup("Удалить раздел" & vbCrLf & Root & Key & _ "?",0,"Работа с реестром",vbQuestion+vbYesNo) If Res=vbYes Then 'Нажата кнопка Да 'Удаляем раздел WshShell.RegDelete Root & Key WshShell.Popup "Раздел" & vbCrLf & Root & Key & " удален'",0,_
"Работа с реестром",vblnformation+vbOkOnly End If i************* Конец ********************************************* Работа с ресурсами локальной сети Стандартным объектом, позволяющим выполнять типовые операции с локальной сетью, является wshNetwork. С помощью этого объекта можно: □ узнать сетевое имя компьютера, имя текущего пользователя и название домена, в котором он зарегистрировался; □ получить список всех сетевых дисков и всех сетевых принтеров, подключенных к рабочей станции; □ подключить или отключить сетевой диск и принтер; □ установить сетевой принтер как используемый по умолчанию. ( Замечание ^ Для решения более сложных задач, связанных с администрированием локальной сети, необходимо применять технологии WMI или Active Directory Service Interfase (ADSI). Определение имен рабочей станции, пользователя и домена Для того чтобы из сценария узнать имя текущего пользователя, домена и компьютера в сети, можно использовать соответствующие свойства объекта WshNetwork: UserName, Domain И ComputerName. Примеры сценариев на языках JScript и VBScript, которые выводят на экран подобную информацию, приведены в листингах 4.46 и 4.47. Листинг 4.46. Вывод сетевых параметров станции (JScript) У*****************************************^ /* Имя: NetworkParam.js */ /* Язык: JScript */ /* Описание: Вывод сетевых параметров станции */ у********************************************** var WshNetwork,s; //Объявляем переменные //Создаем объект WshNetwork WshNetwork = WScript.CreateObject("WScript.Network"); з="Сетевые параметры станции:\n\n";
//Выводим на экран свойства ComputerName, UserName и UserDomain s+= "Имя машины: " +WshNetwork. СотриterName+" \n" ; s+="Mmh пользователя: ll+WshNetwork.UserName+l, \n" ; s+="Домен: "+WshNetwork.UserDomain; WScript.Echo(s); /************* Конец *************** + *************************'*'**'*/ «*•***•**••********•******•****•************• 1 Имя: NetworkParam.vbs 1 Язык: VBScript 1 Описание: Вывод сетевых параметров станции ■*********************************************** Option Explicit Dim WshNetwork, s,NetwDrives, i,NetwPrinters ' Объявляем переменные 1 Создаем объект WshNetwork Set WshNetwork = WScript.CreateObject("WScript.Network") s="CeTeBbie параметры станции:" & vbCrLf & vbCrLf 1 Выводим на экран свойства ComputerName, UserName и UserDomain s=s & "Имя машины: " & WshNetwork.ComputerName & vbCrLf s= s & "Имя пользователя: " & WshNetwork.UserName & vbCrLf s= s & "Домен: " & WshNetwork.UserDomain WScript.Echo s •***••***•**** Коней ********************************************* Получение списка подключенных сетевых дисков и принтеров У Объекта WshNetwork ИМеЮТСЯ меТОДЫ EnumNetworkDrives И EnumPrinterConnections, с помощью которых можно создать коллекции, содержащие, соответственно, сведения о всех подключенных к локальной станции сетевых дисках и сетевых принтерах. Эти коллекции устроены следующим образом: первым элементом является буква диска или название порта, вторым — сетевое имя ресурса, с которым связан этот диск или принтер. Та же последовательность сохраняется для всех элементов коллекции. В листингах 4.48 и 4.49 приведены сценарии на языках JScript и VBScript соответственно, в которых на экран выводятся диалоговые окна, содержа- •ичЯ^Я^тЖлЧ^ЯЯ^ЯЧТмЯ
щие информацию о сетевых дисках и сетевых принтерах, подключенных к рабочей станции (рис. 4.28). Рис. 4.28. Выводимая сценарием ListNetworkResources.js информация о подключенных сетевых ресурсах / /* Имя: ListNetworkResources.js */ /* Язык: JScript ' */ /* Описание: Вывод подключенных сетевых ресурсов (диски и принтеры) */ /•*••••••••••••••••••••••••••••••••••••••*••••••••• var WshNetwork,s,NetwDrives,i,NetwPrinters; //Объявляем переменные //Создаем объект WshNetwork WshNetwork = WScript.CreateObject("WScript.Network"); /***** Вывод списка всех подключенных сетевых дисков ******/ s="Подключенные сетевые диски:\п\п"; //Создаем коллекцию с данными о подключенных дисках NetwDrives = WshNetwork.EnumNetworkDrives () ; i=0; while (i<=NetwDrives.Count()-2) { //Перебираем элементы коллекции //В первом элементе коллекции содержится буква диска, //во втором — сетевое имя ресурса и т. д. s+=NetwDrives(i)+" "+NetwDrives(i+1)+"\n"; i=i+2; } WScript.Echo(s); //Выводим сформированные строки на экран /****** Вывод списка всех подключенных сетевых принтеров ******/ 9ШШ*кжШШШЯ1ШШШШШШШШШШШШ1Ш!!М
s="Подключенные сетевые принтеры:\n\n"; //Создаем коллекцию с данными о подключенных принтерах NetwPrinters = WshNetwork.EnumPrinterconnections(); i=0; while (i<=NetwPrinters.Count()-2) { //Перебираем элементы коллекции //В первом элементе коллекции содержатся названия локальных портов, //во втором — сетевое имя принтера и т. д. s+=NetwPrinters(i)+" "+NetwPrinters(i+1)+"\n"; i=i+2; } WScript.Echo(s); //Выводим сформированные строки на экран /************* Конец *********************************************/ Листинг 4.49. Вывод списка подключенных сетевых ресурсов (VBScript) 1******************************************************************** 1 Имя: ListNetworkResources.vbs 1 Язык: JScript 1 Описание: Вывод подключенных сетевых ресурсов (диски и принтеры) •*•*••***••********•********••***•******•*•**•**•********•*********** Option Explicit Dim WshNetwork,s,NetwDrives,i,NetwPrinters ' Объявляем переменные 1 Создаем объект WshNetwork Set WshNetwork = WScript.CreateObject("WScript.Network") i******** Вывод списка всех подключенных сетевых дисков ********* s="Подключенные сетевые диски:" & vbCrLf & vbCrLf 1 Создаем коллекцию с данными о подключенных дисках Set NetwDrives = WshNetwork. EnumNetworkDrives () i=0 While i<=NetwDrives.Count()-2 ' Перебираем элементы коллекции 1 В первом элементе коллекции содержится буква диска, 1 во втором — сетевое имя ресурса и т. д. s=s & NetwDrives.Item(i) & " " & NetwDrives.Item(i+1) & vbCrLf i=i+2 Wend
WScript.Echo s ' Выводим сформированные строки на экран |******** Вывод списка всех подключенных сетевых принтеров ******* s="Подключенные сетевые принтеры:" & vbCrLf & vbCrLf 1 Создаем коллекцию с данными о подключенных принтерах Set NetwPrinters = WshNetwork.EnumPrinterConnections() i=0 While i<=NetwPrinters.Count()-2 ' Перебираем элементы коллекции • 1 В первом элементе коллекции содержатся названия локальных портов, 1 во втором — сетевое имя принтера и т. д. s=s & NetwPrinters.Item(i) & " " & NetwPrinters.Itern(i+1) & vbCrLf i=i+2 Wend WScript.Echo s 'Выводим сформированные строки на экран t ************* Конец ********************************************* Подключение и отключение сетевых дисков и принтеров Имеющиеся в локальной сети общедоступные ресурсы (диски и принтеры) можно посредством сценария подключить к рабочей станции для совместного использования. Подключаемому сетевому диску при этом нужно поставить в соответствие незанятую букву локального диска (например, если в системе уже имеются диски С, D и Е — локальные или сетевые, — то сетевой диск можно подключить под буквой F или К, но не Е). В случае подключения сетевого принтера можно либо напрямую соединиться с этим принтером (для печати из приложений Windows), либо поставить в соответствие удаленному принтеру локальный порт (для печати из старых приложений MS-DOS). ( Замечание ^ Сетевые диски и принтеры также можно подключить с помощью Проводника Windows или выполнив соответствующую команду net use. В качестве примера рассмотрим JScript-сценарий MapResources.js (листинг 4.50), в котором производится подключение диска К к сетевому ресурсу \\RS_NT_Server\d и установка связи локального порта LPT1 с сетевым принтером \\104_Stepankova\HP. Сначала НуЖНО Создать экземпляры Объектов WshNetwork И WshSheli: WshNetwork = WScript.CreateObject("WScript.Network"); WshSheli = WScript.CreateObject("WScript.Shell");
Для того чтобы подключить сетевой диск к устройству К, нужно быть уверенным, что с этой буквой уже не связан сетевой диск (иначе произойдет ошибка). Поэтому предварительно отключается сетевой диск с помощью метода RemoveNetworkDrive: WshNetwork.RemoveNetworkDrive (Drive) ; (переменной Drive заранее было присвоено значение к). При выполнении этой команды может произойти ошибка времени выполнения (например, диск К не существует или возникла ошибка при отключении связанного С НИМ сетевого ресурса), ПОЭТОМУ ВЫЗОВ метода RemoveNetworkDrive помещается внутрь блока try конструкции try ... catch языка JScript, которая позволяет обрабатывать такие ошибки: try { //Отключаем сетевой диск WshNe twork. RemoveNe tworkDr ive (Dr ive) ; } catch (e) { //Обрабатываем возможные ошибки if (e.number != 0) { //Выводим сообщение об ошибке IsError=true; Mess="OiiM6Ka при отключении диска "+Drive+"\nKofl ошибки: " + е.number+"ХпОписание: "+е.description; WshShell.Popup(Mess,0,"Отключение сетевого диска",vbCritical); } } Теперь в случае возникновения ошибки при работе метода RemoveNetworkDrive управление передастся внутрь блока catch, а в полях перемен ной-объекта е будет содержаться информация о произошедшей Ошибке (е. number — ЧИСЛОВОЙ КОД Ошибки, е .description — Краткое ОПИ- сание ошибки); используя эту информацию, на экран выводится диалоговое окно с описанием ошибки (рис. 4.29). Рис. 4.29. Информация об ошибке, произошедшей при отключении диска К
Если же отключение диска К прошло успешно, на экран выводится диалоговое окно с информацией об этом (рис. 4.30): if (UsError) { //Все в порядке Мезз="Диск "+Drive+" отключен успешно"; WshShell.Popup(Mess,0,"Отключение сетевого диска",vblnformation); } Рис. 4.30. Информация об успешном отключении диска К Аналогичный блок try ... catch используется и при подключении .сетевого диска: try { //Подключаем сетевой диск WshNetwork .MapNetworkDrive (Drive, Net Path) ; } catch (e) { //Обрабатываем возможные ошибки if (e != 0) { //Выводим сообщение об ошибке IsError=true; Mess="Ouin6Ka при подключении диска " + Drive + " к " + NetPath+ "ХпКод ошибки: "+е.питЬег+"\пОписание: "+е.description; WshShell.Popup(Mess,0,"Подключение сетевого диска",vbCritical); } } Если, например, пользователь, который подключает сетевой диск, не имеет соответствующих прав доступа к сетевому ресурсу, то на экран выведется диалоговое окно, изображенное на рис. 4.31. Освобождение ЛОКальНОГО порта (метод RemovePrinterConnection), ПОД- КЛЮЧение сетевого Принтера К ЭТОМУ Порту (метод AddPrinterConnection) И обработка ошибок времени выполнения, которые могут возникнуть при этих действиях, производится в сценарии аналогичным образом.
Рис. 4.31. Информация об ошибке, произошедшей при подключении диска К /••••••••*••••••••••••••••••••••••••••••••••••*•• /* Имя: MapResources.js */ /* Язык: JScript */ /* Описание: Отключение и подключение сетевых дисков и принтеров */ /••••••••••••••••••••••••••••••••••••^ //Объявляем переменные var WshNetwork,WshShell,Drive,NetPath,Port,NetPrinter,Mess,IsError; //Инициализируем константы для диалоговых окон var vbCritical=16,vblnformation=64; Drive="K:"; //Буква диска NetPath="\\\\RS_NT__Server\\d"; //Сетевой путь для подключения диска Port="LPTl"; //Название локального порта //Сетевой путь для подключения принтера NetPrinter="\\\\104_Stepankova\\HP"; //Создаем объект WshNetwork WshNetwork = WScript.CreateObject("WScript.Network"); //Создаем объект WshShell WshShell = WScript.CreateObject("WScript.Shell"); /•*••••••*•••• Отключение сетевого диска *****•**•*•************/ IsError=false; try { //Отключаем сетевой диск WshNetwork. RemoveNetworkDrive (Drive) ; } catch (e) { //Обрабатываем возможные ошибки Ш^ШТ9Ш!Ш^!Ш!1ШТШШШШШЯШШШШШПШШй
if (е != 0) { //Выводим сообщение об ошибке IsError=true; Mess="Ouin6Ka при отключении диска "+Drive+"\nKofl ошибки: "+ е. number+" ХпОписание : " +е. description ; WshShell.Popup(Mess,0,"Отключение сетевого диска",vbCritical); } } if (UsError) { //Все в порядке Мезз="Диск "+Drive+" отключен успешно"; WshShell.Popup(Mess,0,"Отключение сетевого диска",vblnformation); } /*••*•*••*•*•*••*•*•*•*•*•*•*• Погтключение сетевого писка ***•*** + * + *• + *•*••*■•*■********/ IsError=false; try { //Подключаем сетевой диск WshNetwork.MapNetworkDrive(Drive,NetPath); } catch (e) { //Обрабатываем возможные ошибки if (e != 0) { //Выводим сообщение об ошибке IsError=true; Mess="Ouin6Ka при подключении диска " + Drive + " к " + NetPath+ "ХпКод ошибки: "+e.nuniber+"ХпОписание: "+е.description; WshShell.Popup(Mess,0,"Подключение сетевого диска",vbCritical); } } if (ilsError) { //Все в порядке Мезз="Диск "+Drive+" успешно подключен к "+NetPath; WshShell.Popup(Mess,0,"Подключение сетевого диска",vblnformation); } /••**•••*•••*• Освобождение локального порта ***********************/ IsError=false; try { //Разрываем связь с сетевым принтером WshNetwork.RemovePrinterconnection(Port);
} catch (e) { if (e != 0) { //Обрабатываем возможные ошибки //Выводим сообщение об ошибке IsError=true; Mess="Ошибка при отключении порта "+Port+"\nKofl ошибки: "+ е.number+"ХпОписание: "+е.description; WshShell.Popup(Mess,0,"Отключение локального порта от сетевого ресурса", vbCritical) ; } } if (UsError) { //Все в порядке Mess="nopT "+Port+" отключен успешно"; WshShell.Popup(Mess,0,"Отключение локального порта от сетевого ресурса", vblnfоrmation); } /**•** Подключение локального порта к сетевому принтеру ****•****/ IsError=false; try { //Подключаем сетевой принтер к локальному порту WshNetwork.AddPrinterconnection(Port,NetPrinter); } catch (e) { //Обрабатываем возможные ошибки if (e != 0) { //Выводим сообщение об ошибке IsError=true; Mess="Ошибка при переназначении порта "+Port+ " на "+NetPrinter+ "ХпКод ошибки: "+e.number+"ХпОписание: "+е.description; WshShell.Popup(Mess,0,"Подключение локального порта к сетевому ресурсу", vbCritical) ; } } if (UsError) { //Все в порядке Mess="nopT "+Port+" успешно подключен к "+NetPrinter; WshShell.Popup(Mess,0,"Подключение локального порта к сетевому ресурсу", vblnformation); } /•••*••*•••••• Коней *************++******+*++*+*****+************/
Реализация того же сценария на языке VBScript представлена в листинге 4.51. Главное отличие здесь состоит в способе обработки возможных ошибок времени выполнения. В VBScript для этой цели предназначен оператор On Error Resume Next — При ВОЗНИКНОВеНИИ ОШИбкИ ПОСЛе ВЫПОЛНе- ния этого оператора сценарий не прервется, а просто перейдет к выполнению следующей строки кода. Проанализировать же возникшую ошибку МОЖНО С ПОМОЩЬЮ специального Объекта Err, В ПОЛЯХ Number И Description которого будет соответственно содержаться код и описание ошибки. Листинг 4.51. Отключение и подключение сетевых ресурсов (VBScript) «••••••••••••••••••••••••••••••••••••••••••^ ' Имя: MapResources.vbs ' Язык: VBScript ' Описание: Отключение и подключение сетевых дисков и принтеров ••••••*•••••••••••••••••••••••••••••*••••••••••••••••••• Option Explicit ' Объявляем переменные Dim WshNetwork,Drive,NetPath,Port,NetPrinter Drive="K:" ' Буква диска NetPath="\\RS_NT_Server\d" ' Сетевой путь для подключения диска Port="LPTl" ' Название локального порта ' Сетевой путь для подключения принтера NetPrinter="\\104_Stepankova\HP" 1 Создаем объект WshNetwork Set WshNetwork = WScript.CreateObject("WScript.Network") 1 Создаем объект WshShell Set WshShell = WScript.CreateObject("WScript.Shell") On Error Resume Next ' Включаем обработку ошибок времени выполнения * ************* Отключение сетевого лиска +•****■*•*■*•********■*•***•***■ ' Отключаем сетевой диск WshNetwork.RemoveNetworkDrive Drive If Err.Number<>0 Then Mess="0mn6Ka при отключении диска " & Drive & vbCrLf & _ "Код ошибки: " & е.number & vbCrLf &+ _ "Описание: " & е.description
WshShell.Popup Mess,0,"Отключение сетевого диска",vbCritical Else 1 Все в порядке Мезз="Диск " & Drive & " отключен успешно" WshShell.Popup Mess,0,"Отключение сетевого диска",vblnformation End If i************* Подключение сетевого лиска *********************** 1 Подключаем сетевой диск WshNe twork.MapNe tworkDrive Dr ive,Ne tPath If Err.Number<>0 Then Mess="0mn6Ka при подключении диска " & Drive & " к " & NetPath &_ "Код ошибки: " & е.number & "Описание: " & е.description WshShell.Popup Mess,0,"Подключение сетевого диска",vbCritical Else 1 Все в порядке Мезз="Диск " & Drive & " успешно подключен к " & NetPath WshShell.Popup Mess,0,"Подключение сетевого диска",vblnformation End If i************* Освобождение локального порта *********************** 1 Разрываем связь с сетевым принтером WshNetwork.RemovePrinterConnection Port If Err.Number<>0 Then Mess="0uin6Ka при отключении порта " & Port & "Код ошибки: " &_ е.number & "Описание: " & е.description WshShell.Popup Mess,0,"Отключение порта от сетевого ресурса",vbCritical Else 1 Все в порядке Mess="nopT " & Port & " отключен успешно" WshShell.Popup Mess,0,"Отключение порта от сетевого ресурса",_ vblnformation End If i***** Подключение локального порта к сетевому принтеру ********* 1 Подключаем сетевой принтер к локальному порту WshNetwork.AddPrinterconnection Port,NetPrinter If Err.Number<>0 Then Mess="0uin6Ka при переназначении порта " & Port & " на " & NetPrinter &_
"Код ошибки: " & е.number & "Описание: " & е.description WshShell.Popup Mess,0,"Подключение порта к сетевому ресурсу",vbCritical Else ' Все в порядке Mess="nopT " & Port & " успешно подключен к " & NetPrinter WshShell.Popup Mess,0,"Подключение порта к сетевому ресурсу", vblnformation End If • *••**•••**•** Конец ********************************************* Выполнение основных операций с файловой системой Для работы с файловой системой из сценариев WSH предназначены восемь объектов, главным из которых является FileSystemObject. С помощью методов объекта FileSystemObject можно выполнять следующие основные действия: G копировать или перемещать файлы и каталоги; G удалять файлы и каталоги; G создавать каталоги; G создавать или открывать текстовые файлы; □ создавать объекты Drive, Folder и File для доступа к конкретному диску, каталогу или файлу соответственно. С ПОМОЩЬЮ СВОЙСТВ Объектов Drive, Folder И File МОЖНО ПОЛуЧИТЬ деталь- ную информацию о тех элементах файловой системы, с которыми они ассоциированы. Объекты Folder и File также предоставляют методы для манипулирования файлами и каталогами (создание, удаление, копирование, перемещение); эти методы в основном повторяют соответствующие методы объекта FileSystemObject. Кроме ЭТОГО ИМеЮТСЯ три объекта-КОЛЛеКЦИИ: Drives, Folders И Files. Коллекция Drives содержит объекты Drive для всех имеющихся в системе дисков, Folders — объекты Folder для всех подкаталогов заданного каталога, Files — объекты File для всех файлов, находящихся внутри определенного каталога. Наконец, из сценария можно читать информацию из текстовых файлов и записывать в них данные. Методы для этого предоставляет объект Textstream. В табл. 4.1 кратко описано, какие именно объекты, свойства и методы могут понадобиться для выполнения наиболее часто используемых файловых операций.
Таблица 4.1. Выполнение основных файловых операций Операция Используемые объекты, свойства и методы Получение сведений об определенном диске (тип файловой системы, метка тома, общий объем и количество свободного места и т. д.) Получение сведений о заданном каталоге или файле (дата создания или последнего доступа, размер, атрибуты и т. д.) Проверка существования определенного диска, каталога или файла Копирование файлов и каталогов Перемещение файлов и каталогов Удаление файлов и каталогов Создание каталога Создание текстового файла Получение списка всех доступных дисков Получение списка всех подкаталогов заданного каталога Получение списка всех файлов заданного каталога Открытие текстового файла для чтения, записи или добавления Чтение информации из заданного текстового файла или запись информации в него Свойства объекта Drive. Сам объект Drive создается с помощью метода GetDrive объекта FileSystemObject Свойства объектов Folder и File. Сами эти объекты создаются с помощью методов GetFolder и GetFile объекта FileSystemObject Методы DriveExists, FolderExists и File- Exists объекта FileSystemObject Методы CopyFile и CopyFolder объекта FileSystemObject, а также методы File.Copy И Folder.Copy Методы MoveFile и MoveFolder объекта FileSystemObject, ИЛИ методы File.Move И Folder.Move Методы DeleteFile и DeleteFolder объекта FileSystemObject, ИЛИ методы File.Delete И Folder.Delete Методы FileSystemObj ect.CreateFolder или Folders.Add Методы FileSystemObject.CreateTextFile ИЛИ Folder.CreateTextFile Коллекция Drives, содержащаяся в свойстве FileSystemObject.Drives Коллекция Folders, содержащаяся в свойстве Folder.SubFolders Коллекция Files, содержащаяся в свойстве Folder.Files Методы FileSystemObject.CreateTextFile, FileSystemObj ect.OpenTextFile ИЛИ File.OpenAsTextStream Методы объекта Textstrearn
Далее приведены простые примеры сценариев, работающих с файловой системой (создание, копирование, удаление файлов и каталогов, чтение и запись строк в текстовом файле и т. д.). Получение сведений о диске Доступ к свойствам заданного локального или сетевого диска можно получить С ПОМОЩЬЮ Объекта Drive, КОТОрЫЙ ВОЗВращаеТСЯ меТОДОМ GetDrive объекта Fiiesystemobject, а также может быть получен как элемент коллекции Drives. В листинге 4.52 приведен сценарий Drivelnfo.js, который выводит на экран некоторые свойства диска С (рис. 4.32). Рис. 4.32. Свойства диска С Аналог этого сценария на языке VBScript приведен в листинге 4.53. Листинг 4.52. Вывод информации о диске (JScript) /••••••••••••••••••••••••••••••••••••••••• /* Имя: Drivelnfo.js */ /* Язык: JScript */ /* Описание: Вывод на экран свойств диска С */ /••••••••••••••••••••••••••••••••••••••••••••^ //Объявляем переменные var FSO,D,TotalSize,FreeSpace,s; //Создаем объект FileSystemObject FSO = WScript.CreateObject("Scripting.FileSystemObject"); //Создаем объект Drive для диска С D = FSO.GetDrive("C:"); з="Информация о диске С:\п"; //Получаем серийный номер диска з+="Серийный номер: "+D.SerialNumber+"\n";
//Получаем метку тома диска s+="MeTKa тома: "+D.VolumeName+"\n"; //Вычисляем общий объем диска в килобайтах TotalSize=D.TotalSize/1024; s+="06beM: "+TotalSize+" Kb\n"; //Вычисляем объем свободного пространства диска в килобайтах FreeSpace=D.FreeSpace/1024; s+="Свободно: "+FreeSpace+" Kb\n"; //Выводим свойства диска на экран WScript.Echo(s); /************* Коней *********************************************/ Листинг 4.53. Вывод информации о диске (VBScript) :- : г. : • *********************************************** 1 Имя: Drivelnfo.vbs ' Язык: VBScript 1 Описание: Вывод на экран свойств диска С |******************************************************************* 'Объявляем переменные Dim FSO,D,TotalSize,FreeSpace,s 'Создаем объект FileSystemObject Set FSO =. WScript.CreateObject("Scripting.FileSystemObject") 'Создаем объект Drive для диска С Set D = FSO.GetDriveC'C: ") s = "Информация о диске С:" & VbCrLf 'Получаем серийный номер диска s = s &"Серийный номер: " & D.SerialNumber & VbCrLf 'Получаем метку тома диска s = s & "Метка тома: " & D.VolumeName & VbCrLf 'Вычисляем общий объем диска в килобайтах TotalSize = D.TotalSize/1024 s = s & "Объем: " & TotalSize & " Kb" & VbCrLf 'Вычисляем объем свободного пространства диска в килобайтах FreeSpace = D.FreeSpace/1024 s = s & "Свободно: " & FreeSpace & " Kb" & VbCrLf 'Выводим свойства диска на экран WScript.Echo s » ************* Коней *********************************************
Получение сведений о каталоге Доступ к свойствам каталога обеспечивает объект Folder. Создать этот объект можно с помощью свойства RootFoider объекта Drive или методов GetFolder, GetParentFolder И GetSpecialFolder объекта FileSystemObject. Также объекты Folder могут быть получены как элементы коллекции Folders. В сценариях Folderlnfo.js и Folderlnfo.vbs на экран выводятся свойства каталога, из которого был запущен сценарий (листинги 4.54, 4.55). /* Имя: Folderlnfo.js */ /* Язык: JScript */ /* Описание: Вывод на экран даты создания текущего каталога */ /**************************************************^ var FSO,WshShell,FoldSize,s; //Объявляем переменные //Создаем объект FileSystemObject FSO = WScript.CreateObject("Scripting.FileSystemObject"); //Создаем объект WshShell WshShell=WScript.CreateObject("WScript.Shell"); //Определяем каталог, из которого был запущен сценарий //(текущий каталог) Folder = FSO.GetFolder(WshShell.CurrentDirectory); //Получаем имя текущего каталога з="Текущий каталог: "+Folder.Name+"\n"; //Получаем дату создания текущего каталога 3+="Дата создания: "-fFolder. DateCreated+"\n"; //Вычисляем размер текущего каталога в килобайтах FoldSize=Folder.Size/1024; 3+="0бъем: "+FoldSize+" Kb\n"; //Выводим информацию на экран WScript.Echo(s); /************* Конец *********************************************/ Листинг 4.54. Вывод информации о каталоге (JScript)
1 Имя: Folderlnfo.vbs 1 Язык: VBScript ' Описание: Вывод на экран даты создания текущего каталога I*************************************************** Dim FSO,WshShell,FoldSize,s 'Объявляем переменные 'Создаем объект FileSystemObject Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 'Создаем объект WshShell Set WshShell = WScript.CreateObject("WScript.Shell") 'Определяем каталог, из которого был запущен сценарий '(текущий каталог) Set Folder = FSO.GetFolder(WshShell.CurrentDirectory) 'Получаем имя текущего каталога s = "Текущий каталог: " & Folder.Name & VbCrLf 'Получаем дату создания текущего каталога s = s & '.'Дата создания: " & Folder. DateCreated & VbCrLf 'Вычисляем размер текущего каталога в килобайтах FoldSize=Folder.Size/1024 s = s & "Объем: " & FoldSize & " Kb" & VbCrLf 'Выводим информацию на экран WScript.Echo s • ************* Конец ********************************************* Получение сведений о файле Доступ ко всем свойствам файла обеспечивает объект File, создать который можно с помощью коллекции Files или метода GetFiie объекта FileSystemObject. В листинге 4.56 приведен JScript-сценарий Filelnfojs, в котором на экран выводятся некоторые свойства файла C:\boot.ini. Аналог этого сценария на языке VBScript приведен в листинге 4.57. Листинг 4.55. Вывод информации о каталоге (VBScript)
Листинг 4.56. Вывод информации о файле (JScript) У***********************************•••••***************^ /* Имя: Filelnfo.js */ /* Язык: JScript */ /* Описание: Вывод на экран некоторых свойств файла */ /•••••••••••••••••••••••••••••••••••а************ var FSO,F,s; //Объявляем переменные //Создаем объект FileSystemObject FSO = WScript.CreateObject("Scripting.FileSystemObject"); //Создаем объект File F=FSO.GetFile ("С: Wboot. ini") ; //Получаем имя файла з="Файл: "+F.Name+"\n"; //Получаем дату создания файла з+="Дата создания: "+F.DateCreated+"\n"; //Получаем тип файла s+="Tnn: "+F.Туре+"\п"; //Выводим информацию на экран WScript.Echo(s); /••••••••••а-*-**- Коней ***********************************■**■*"*'*'■*'■*'*'*'*'/ Листинг 4.57. Вывод информации о файле (VBScript) I*************************************************** ' Имя: Filelnfo.vbs 1 Язык: VBScript 1 Описание: Вывод на экран некоторых свойств файла i••••••••••••••••••••••••••••••••••••••••••••••••••••••••• Dim FSO, F, s 'Объявляем переменные 'Создаем объект FileSystemObject Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 'Создаем объект File Set F = FSO.GetFile("C:\boot.ini") 'Получаем имя файла
s = "Файл: " & F.Name & VbCrLf 'Получаем дату создания файла s = s & "Дата создания: " & F.DateCreated & VbCrLf 'Получаем тип файла s = s & "Тип: " & F.Type & VbCrLf 'Выводим информацию на экран WScript.Echo s • ••*•••*•***•• Коней ********************************************* Проверка существования диска, каталога или файла Для проверки существования диска, каталога и файла используются соответственно меТОДЫ DriveExists, FolderExists И FileExists. В ЛИСТИН- гах 4.58 и 4.59 приведены соответственно JScript- и VBScript-сценарии IsExistsFile.js и IsExistsFile.vbs, в которых проверяется наличие на диске С файла boot.ini. Листинг 4.58. Проверка существования файла (JScript) у************************************************** /* Имя: IsExistsFile.js */ /* Язык: JScript */ /* Описание: Проверка существования файла */ /************•*****************•********** var FSO,FileName; //Объявляем переменные //Создаем объект FileSystemObject FSO = WScript.CreateObject("Scripting.FileSystemObject"); FileName="C: Wboot. ini" ; if (FSO.FileExists(FileName) ) //Выводим информацию на экран WScript. Echo ("Файл "+FileName-f " существует"); else //Выводим информацию на экран WScript.Echo("Файл "+FileName-f " не существует"); /•к-к-к-к-к-к-к-к-к-к-к-к* КОНвЦ *********************************************/
Листинг 4.59. Проверка существования файла (VBScript) ' Имя: IsExistsFile.vbs 1 Язык: VBScript 1 Описание: Проверка существования файла • **************************************************** Dim FSO,FileName 'Объявляем переменные 'Создаем объект FileSystemObject Set FSO = WScript.CreateObjectCScripting.FileSystemObject") FileName = "C:\boot.ini" if FSO.FileExists(FileName) Then 'Выводим информацию на экран WScript.Echo "Файл " & FileName & " существует" else 'Выводим информацию на экран WScript.Echo "Файл " & FileName & " не существует" end if i ************* Конец ********************************************* Получение списка всех имеющихся дисков Каждому из дисков компьютера (включая подключенные сетевые диски и дисководы со сменными носителями) соответствует элемент коллекции Drives (объект Drive). Таким образом, для построения списка дисков компьютера нужно в цикле перебрать все элементы коллекции Drives. В листинге 4.60 приведен JScript-сценарий ListDrives.js, в котором на экран выводятся сведения обо всех доступных дисках (рис. 4.33). Рис. 4.33. Список всех дисков, имеющихся в системе
Аналогичный VBScript-сценарий приведен в листинге 4.61. /* Имя: ListDrives.js */ /* Язык: JScript */ /* Описание: Получение списка всех имеющихся дисков */ //Объявляем переменные var FSO,s,ss,Drives,D; //Создаем объект FileSystemObject FSO = WScript.CreateObject("Scripting.FileSystemObject"); //Создаем коллекцию дисков, имеющихся в системе Drives = new Enumerator(FSO.Drives); s="" ; //Цикл по всем дискам в коллекции for (;!Drives.atEnd();Drives.moveNext()) { //Извлекаем текущий элемент коллекции D=Drives.item(); //Получаем букву диска s+=D.DriveLetter; s+=" - "; if (D.DriveType == 3) //Проверяем, не является ли диск сетевым //Получаем имя сетевого ресурса ss=D.ShareName; else //Диск является локальным if (D.IsReady) //Проверяем готовность диска //Если диск готов, то получаем метку тома для диска s s=D. Vo 1 umeName ; else ss="Устройство не готово"; s+=ss+"\n"; } //Выводим полученные строки на экран WScript.Echo(s); /**•***+****** Конец ***************************************■*■*'*'*'*'*'/ l,|iJ^iJ!ll^J.l^,JJJ!|i|JJ.I!IJ'J:U:l|i|i|J!.!lll!i'iJJ.I!IJ'J.IJ^J.I,liM
Листинг 4.61. Построение списка всех имеющихся дисков (VBScript) '; ' Имя: ListDrives.vbs ' Язык: VBScript 1 Описание: Получение списка всех имеющихся дисков 'Объявляем переменные Dim FSO,s,ss,Drives, D 'Создаем объект FileSystemObject Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 'Создаем коллекцию дисков, имеющихся в системе Set Drives = FSO.Drives s = "" 'Перебираем все диски в коллекции For Each D In Drives 'Получаем букву диска s = s & D.DriveLetter s = s & " - " if (D.DriveType = 3) then 'Проверяем, не является ли диск сетевым 'Получаем имя сетевого ресурса ss = D.ShareName else 'Диск является локальным if (D.IsReady) then 'Проверяем готовность диска 'Если диск готов, то получаем метку тома для диска ss = D.VolumeName else ss = "Устройство не готово" end if s = s Sc ss Sc VbCrLf end if Next 'Выводим полученные строки на экран WScript.Echo s • •*** + ••••*••• Конец *************************************■*■*'**'*'*'*'*'
Получение списка всех подкаталогов заданного каталога Для построения списка всех подкаталогов определенного каталога можно воспользоваться коллекцией Folders, которая хранится в свойстве SubFolders соответствующего Объекта Folder И СОДерЖИТ Объекты Folder для всех подкаталогов. В листинге 4.62 приведен JScript-сценарий ListSubFold.js, в котором на экран выводятся названия всех подкаталогов каталога C:\Program Files (рис. 4.34). Рис. 4.34. Список всех подкаталогов каталога C:\Program Files Аналогичный сценарий на языке VBScript приведен в листинге 4.63. Листинг 4.62. Построение списка подкаталогов (JScript) У************************************************* /* Имя: ListSubFold.js */ /* Язык: JScript */ /* Описание: Получение списка всех подкаталогов заданного каталога */ у*************************************************
//Объявляем переменные var FSO,F,SFold,SubFolders,s; //Создаем объект FileSystemObject FSO=WScript.CreateObject("Scripting.FileSystemObj ect"); //Путь к каталогу SFold="C:\\Program Files"; s="Каталог "+SFold+"\n"; з+="Подкаталоги:\n"; //Создаем объект Folder для каталога C:\Program Files F=FSO.GetFolder(SFold); //Создаем коллекцию подкаталогов каталога C:\Program Files SubFolders= new Enumerator(F.SubFolders); //Цикл по всем подкаталогам for (; 'SubFolders.atEnd(); SubFolders.moveNext()) { s+=SubFolders.item()+"\n"; //Добавляем строку с именем подкаталога } //Выводим полученные строки на экран WScript.Echo(s); /************* Конец ******************************************-*:i'r*/ Листинг 4.63. Построение списка подкаталогов (VBScript) 1 Имя: ListSubFold.vbs 1 Язык: VBScript 1 Описание: Получение списка всех подкаталогов заданного каталога 'Объявляем переменные Dim FSO,F,SFold,SubFolders,Folder,s 'Создаем объект FileSystemObject Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 'Путь к каталогу SFold = "C:\Program Files" s = "Каталог " & SFold & VbCrLf s = s & "Подкаталоги:" & VbCrLf 'Создаем объект Folder для каталога C:\Program Files
Set F=FSO.GetFolder(SFold) 'Создаем коллекцию подкаталогов каталога C:\Program Files Set SubFolders = F.SubFolders 'Цикл по всем подкаталогам For Each Folder In SubFolders 'Добавляем строку с именем подкаталога s = s & Folder & VbCrLf Next 'Выводим полученные строки на экран WScript.Echo s »****•*•*****• Конец *********************************************/ Получение списка всех файлов заданного каталога В свойстве Files объекта Folder, соответствующего определенному каталогу, хранится коллекция находящихся в этом каталоге файлов (объектов File). В листингах 4.64 и 4.65 приведены соответственно JScript- и VBScript- сценарии ListFiles.js и List Files, vbs, выводящие на экран названия всех файлов, которые содержатся в специальной папке Мои документы (рис. 4.35). Рис. 4.35. Список всех файлов в специальной папке Мои документы г Листинг 4.64. Построение списка файлов в каталоге (JScript) /* Имя: ListFiles.js */ /* Язык: JScript */ /* Описание: Получение списка всех файлов заданного каталога */ /••*•****•••***••••••••••*•*•**••**•**•* //Объявляем переменные
var FSO,F,Files,WshShell,PathList, s; //Создаем объект FileSystemObject FSO=WScript.CreateObj ect("Scripting.FileSystemObj ect"); //Создаем объект WshShell WshShell=WScript.CreateObject("Wscript.Shell"); //Создаем объект WshSpecialFolders WshFldrs=WshShell.SpecialFolders; //Определяем путь к папке Мои документы PathList=WshFldrs.item( "MyDocuments")+"\\"; //Создаем объект Folder для папки Мои документы F=FSO.GetFolder(PathList); //Создаем коллекцию файлов каталога Мои документы Files=new Enumerator(F.Files); s = "Файлы из каталога "+PathList+"\n"; //Цикл по всем файлам for (; 'Files.atEnd(); Files.moveNext()) //Добавляем строку с именем файла s+=Files.item().Name+M\n"; //Выводим полученные строки на экран WScript.Echo(s); l-k-k-k-k-k-k-k-k-k-k-k-k-k КОНвЦ *********************************************/ Листинг 4.65. Построение списка файлов в каталоге (JScript) ■ ********•••••*•••••••*••*•••*••**•****••••*•*•••*••••*•*•••••*••••* ' Имя: ListFiles.vbs ' Язык: VBScript 1 Описание: Получение списка всех файлов заданного каталога i******************************************************************* 'Объявляем переменные Dim FSO,F,File,FilesWshShell,PathList,s 'Создаем объект FileSystemObject Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 'Создаем объект WshShell Set WshShell = WScript.CreateObject("Wscript.Shell")
'Создаем объект WshSpecialFolders Set WshFldrs = WshShell.SpecialFolders 'Определяем путь к папке Мои документы PathList = WshFldrs.item("MyDocuments") & "\" 'Создаем объект Folder для папки Мои документы Set F = FSO.GetFolder(PathList) 'Создаем коллекцию файлов каталога Мои документы Set Files = F.Files s = "Файлы из каталога " & PathList & VbCrLf 'Цикл по всем файлам For Each File In Files 'Добавляем строку с именем файла s = s & File.Name & VbCrLf Next 'Выводим полученные строки на экран WScript.Echo s i ************* Конец ********************************************* Создание каталога Создать новый каталог на диске можно либо с помощью метода CreateFolder объекта FileSystemObject, либо С ПОМОЩЬЮ метода Add КОЛ- лекции Folders. Оба эти метода используются в JScript- и VBScript- сценариях MakeFolder.js и MakeFolder.vbs для создания в каталоге С:\Мои документы подкаталогов Новая папка и Еще одна новая папка (листинги 4.66, 4.67). Листинг 4.66. Создание нового каталога (JScript) /*******************************************************^ /* Имя: MakeFolder.js */ /* Язык: JScript */ /* Описание: Создание нового каталога */ //Объявляем переменные var FSO, F, SubFolders; //Создаем объект FileSystemObject FSO=WScript.CreateObject("Scripting.FileSystemObject");
//Создаем каталог C:\Program Files\HoBan папка FSO.CreateFolder ("С: WProgram FilesWHoBan папка"); //Создаем объект Folder для каталога C:\Program Files F=FSO.GetFolder("С:\\Program Files"); //Создаем коллекцию подкаталогов каталога C:\Program Files SubFolders=F.SubFolders; //Создаем каталог C:\Program Files\Eщe одна новая папка SubFolders.Add("Еще одна новая папка"); /*****•*****•* Конец *********************************************/ Листинг 4.67. Создание нового каталога (VBScript, 7 "" ■*********************^ ' Имя: MakeFolder.vbs 1 Язык: VBScript 1 Описание: Создание нового каталога •••••••****•*****•*****•***•*•*•*****••••** 'Объявляем переменные Dim FSO, F, SubFolders 'Создаем объект FileSystemObject Set FSO = WScript.CreateObject(MScripting.FileSystemObject") 'Создаем каталог C:\Program П1ез\Новая папка FSO.CreateFolder("С:\Program Files\Новая папка") 'Создаем объект Folder для каталога C:\Program Files Set F = FSO.GetFolder("C:\Program Files") 'Создаем коллекцию подкаталогов каталога C:\Program Files Set SubFolders = F.SubFolders 'Создаем каталог C:\Program Files\Euje одна новая папка SubFolders.Add "Еще одна новая папка" »•*•*•******•• Конец ********************************************* Создание текстового файла Для создания текстового файла используется метод createTextFile объекта FileSystemObject, который имеет один обязательный текстовый параметр (путь к создаваемому файлу) и два необязательных логических параметра (Overwrite И Unicode). Параметр overwrite имеет значение в том случае, когда создаваемый файл уже существует. Если overwrite равно True, то такой файл перепишется
(старое содержимое будет утеряно), если же в качестве Overwrite указано False, то файл переписываться не будет. Если этот параметр вообще не указан, то существующий файл также не будет переписан. Параметр Unicode указывает, в каком формате (ASCII или Unicode) следует создавать файл. Если Unicode равно True, то файл создается в формате Unicode, если же Unicode равно False или этот параметр вообще не указан, то файл создается в режиме ASCII. В сценарии CreateTempFile.js (листинг 4.68) показано, каким образом можно создать файл со случайно выбранным именем (такие файлы часто используются для записи временных данных). Аналогичный сценарий CreateTempFile.vbs на языке VBScript приведен в листинге 4.69. Листинг 4.68. Создание временного файла со случайным именем (JScript) /* Имя: CreateTempFile.js */ /* Язык: JScript */ /* Описание: Создание временного файла со случайным именем */ var FSO,FileName,F, s; //Объявляем переменные //Создаем объект FileSystemObject FSO=WScript.CreateObj ect("Scripting.FileSystemObj ect"); //Генерируем случайное имя файла FileName=FSO.GetTempName () ; //Создаем файл с именем FileName F=FSO.CreateTextFile(FileName, true); //Закрываем файл F.Close(); //Сообщаем о создании файла WScript.Echo("Был создан файл",FileName); /****•**•***** Коней **************+******+***********************/ Листинг 4.69. Создание временного файла со случайным именем (VBScript) • ******************************************************************* 1 Имя: CreateTempFile.vbs 1 Язык: VBScript ' Описание: Создание временного файла со случайным именем • *******************************************************************
Dim FSO, FileName, F, s 'Объявляем переменные 'Создаем объект FileSystemObject Set FSO = WScript.CreateObject(nScripting.FileSystemObject") 'Генерируем случайное имя файла FileName = FSO.GetTempName 'Создаем файл с именем FileName Set F = FSO.CreateTextFile(FileName, true) 'Закрываем файл F. Close 'Сообщаем о создании файла WScript.Echo "Был создан файл " & FileName • ************* Коней ********************************************* Операции чтения и записи строк для текстового файла Последовательный (строка за строкой) доступ к текстовому файлу обеспечивает объект Textstream. Методы этого объекта позволяют читать информацию из файла и записывать ее в него. Создается объект Textstream при открытии или создании текстового файла с помощью следующих методов: □ CreateTextFile объектов FileSystemObject И Folder; □ OpenTextFile объекта FileSystemObject; □ OpenAsTextStream объекта File. Перечисленные ранее методы позволяют открывать файл в разных режимах ввода/вывода (за это отвечает параметр iomode) с использованием разных форматов (в соответствии со значением параметра Format) (см. табл. 4.2, 4.3) Таблица 4.2. Параметр iomode Константа Значение Описание ForReading 1 Файл открывается только для чтения, записывать информацию в него нельзя ForWriting 2 Файл открывается для записи. Если файл с таким именем уже существовал, то при новой записи его содержимое теряется ForAppending 8 Файл открывается для добавления. Если файл уже существовал, то информация будет дописываться в конец этого файла
Таблица 4.3. Параметр Format Константа Значение Описание TristateUseDefault -2 TristateTrue -l TristateFalse 0 Файл открывается в формате, используемом системой по умолчанию Файл открывается в формате Unicode Файл открывается в формате ASCII В листинге 4.70 приведен JScript-сценарий TextFilejs, в котором создается файл testl.txt и в него записывается строка текста. После этого файл открывается для чтения, строка считывается из него и выводится на экран (рис. 4.36). Рис. 4.36. Результат работы сценария TextFile.js Аналогичный сценарий TextFile.vbs на языке VBScript приведен в листинге 4.71. Листинг 4.70. Запись информации в текстовый файл и чтение из него (JScript) /* Имя: TextFile.js */ /* Язык: JScript */ /* Описание: Запись строк в текстовый файл и чтение из него */ var FSO,F,TextStream,s; //Объявляем переменные //Инициализируем константы var ForReading = 1, ForWriting = 2, TristateUseDefault = -2; //Создаем объект FileSystemObject FSO=WScript.CreateObject("Scripting.FileSystemObject");
//Создаем в текущем каталоге файл testl.txt FSO.CreateTextFile("testl.txt"); //Создаем объект File для файла testl.txt F=FSO.GetFile("testl.txt"); //Создаем объект TextStream (файл открывается для записи) TextStream=F.OpenAsTextStream(ForWriting/ TristateUseDefault); //Записываем в файл строку TextStream.WriteLine("Это первая строка"); //Закрываем файл TextStream.Close(); //Открываем файл для чтения TextStream=F.OpenAsTextStream(ForReading/ TristateUseDefault); . //Считываем строку из файла s=TextStream.ReadLine(); //Закрываем файл TextStream.Close(); //Отображаем строку на экране WScript.Echo("Первая строка из файла testl.txt:\n\n",s); /*••********** Конец *************+*******************************/ Листинг 4.71. Запись информации в текстовый файл и чтение из него (VBScript) • а********************************************* 1 Имя: TextFile.vbs 1 Язык: VBScript 1 Описание: Запись строк в текстовый файл и чтение из него Dim FSO,F,TextStream,s 'Объявляем переменные 1 Инициализируем константы Const ForReading = 1, ForWriting = 2, TristateUseDefault = -2 1 Создаем объект FileSystemObject Set FSO=WScript.CreateObject("Scripting.FileSystemObject") 1 Создаем в текущем каталоге файл testl.txt FSO.CreateTextFile "testl.txt" 1 Создаем объект File для файла testl.txt set F=FSO.GetFile("testl.txt") 1 Создаем объект TextStream (файл открывается для записи)
Set TextStream=F.OpenAsTextStream(ForWriting, TristateUseDefault) 1 Записываем в файл строку Textstream.WriteLine "Это первая строка" 1 Закрываем файл TextStream.Close 1 Открываем файл для чтения Set TextStream=F.OpenAsTextStream(ForReading/ TristateUseDefault) 1 Считываем строку из файла s=TextStream.ReadLine ' Закрываем файл TextStream.Close 1 Отображаем строку на экране WScript.Echo "Первая строка из файла testl.txt:" & vbCrLf & vbCrLf & s Копирование и перемещение файлов и каталогов Для копирования файлов/каталогов можно применять метод CopyFile/ CopyFolder объекта FileSystemObject ИЛИ метод Сору соответствующего этому файлу/каталогу объекта File/Folder. Перемещаются файлы/каталоги С ПОМОЩЬЮ методов MoveFile/MoveFolder объекта FileSystemObject ИЛИ Метода Move Соответствующего ЭТОМУ фаЙЛу/катаЛОГу объекта File/Folder. Отметим', что при использовании всех этих методов процесс копирования или перемещения прерывается после первой возникшей ошибки. Кроме того, нельзя перемещать файлы и каталоги с одного диска на другой. В листингах 4.72 и 4.73 приведены соответственно JScript- и VBScript- сценарии CopyFile.js и CopyFile.vbs, иллюстрирующие использование метода сору. В этих сценариях на диске С создается файл TestFile.txt. который затем копируется на рабочий стол. Листинг 4.72. Создание текстового файла и копирование его в другой каталог (JScript) У***************************************** /* Имя: CopyFile.js */ /* Язык: JScript */ /* Описание: Создание и копирование файла V //Объявляем переменные
var FSO,F,WshShell,WshFldrs,PathCopy; //Создаем объект FileSystemObject FSO=WScript.CreateObject("Scripting.FileSystemObject"); //Создаем файл F=FSO.CreateTextFile("С:WTestFile.txt", true); //Записываем в файл строку F.WriteLine("Тестовый файл"); //Закрываем файл F.Close(); //Создаем объект WshShell WshShell=WScript.CreateObject("Wscript.Shell"); //Создаем объект WshSpecialFolders WshFldrs=WshShell.SpecialFolders; //Определяем путь к рабочему столу PathCopy=WshFldrs.i tem("Desktop")+"\\"; //Создаем объект File для файла C:\TestFile.txt F=FSO.GetFile("С:WTestFile.txt"); //Копируем файл на рабочий стол F.Сору(PathCopy); /•k-kkkk-kkk-k-kkk-k КОНеП. *********************************************/ ; ■■•" ••" ' "\ —; ..,.._,..., ^ Листинг 4.73. Создание текстового файла и копирование его в другой каталог (VBScript) ■*********************************************^ 1 Имя: CopyFile.vbs 1 Язык: VBScript 1 Описание: Создание и копирование файла ■•**••••*••**•*•**•****••**•***•••**********• 'Объявляем переменные Dim FSO,F,WshShell,WshFldrs,PathCopy 'Создаем объект FileSystemObject Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 'Создаем файл Set F = FSO.CreateTextFile("C:\TestFile.txt", true) 'Записываем в файл строку
F.WriteLine "Тестовый файл" 'Закрываем файл F.Close 'Создаем объект WshShell Set WshShell = WScript.CreateObject("Wscript.Shell") 'Создаем объект WshSpecialFolders Set WshFldrs = WshShell.SpecialFolders 'Определяем путь к рабочему столу PathCopy = WshFldrs.item("Desktop")+"\" 'Создаем объект File для файла C:\TestFile.txt Set F = FSO.GetFile("C:\TestFile.txt") 'Копируем файл на рабочий стол F.Copy PathCopy • *•••****•*••* Конец ********************************************* Удаление файлов и каталогов ДЛЯ Копирования фаЙЛОв/каталОГОВ МОЖНО Применять МеТОД DeleteFile/ DeleteFolder объекта FileSystemObject ИЛИ метод Delete соответствующего этому файлу/каталогу объекта File/Folder. Отметим, что при удалении каталога неважно, является ли он пустым или нет — удаление будет произведено в любом случае. Если же заданный для удаления файл/каталог не будет найден, то возникнет ошибка. В листинге 4.74 приведен сценарий DeleteFile.js, в котором производится удаление предварительно созданного файла C:\TestFile.txt. Аналогичный сценарий на языке VBScript приведен в листинге 4.75. у************************************************** /* Имя: DeleteFile.js */ /* Язык: JScript */ /* Описание: Создание и удаление файла */ /*•••••••••••*••**•*•••*•••**•*•••••****•**** //Объявляем переменные var FSO,F,FileName; //Создаем объект FileSystemObject FSO=WScript.CreateObject("Scripting.FileSystemObject");
//Задаем имя файла FileName="C:\\TestFile.txt"; //Создаем файл F=FSO.CreateTextFile(FileName/ true); //Записываем в файл строку F.WriteLine("Тестовый файл"); //Закрываем файл F.Close(); WScript.Echo("Файл создан"); FSO.DeleteFile(FileName); WScript.Echo("Файл удален"); /************* Конец ***************************************■*'*■**■*■*■/ Листинг 4.75. Создание и удаление файла (VBScript) I******************************************************************* 1 Имя: DeleteFile.vbs ' Язык: VBScript ' Описание: Создание и удаление файла i*•••••**••*•*•*•****•**•*••**•***•***•**••••******•***•*•********** 'Объявляем переменные Dim FSO,F,FileName 'Создаем объект FileSystemObject Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 'Задаем имя файла FileName="C:\TestFile.txt" 'Создаем файл Set F = FSO.CreateTextFile(FileName, true) 'Записываем в файл строку F.WriteLine "Тестовый файл" 'Закрываем файл F.Close WScript.Echo "Файл создан" FSO.DeleteFile FileName WScript.Echo "Файл удален" i************* Конец *********************************************
Просмотр информации о пространствах имен и классахС1М В данном разделе мы рассмотрим примеры сценариев WSH, которые позволят получить доступ к объектной модели CIM. Отметим, что практически во всех этих сценариях нам постоянно придется работать с коллекциями различных объектов. Так как в языке VBScript доступ к коллекциям осуществляется напрямую в цикле For Each, а в JScript для этого нужно использовать дополнительный объект Enumerator, то далее в качестве основного языка для составления сценариев WMI мы будем использовать VBScript. Получение списка всех пространств имен В качестве первого примера напишем сценарий Namespaces.vbs, который будет выводить на экран список всех пространств имен WMI, лежащих на один уровень ниже корневого пространства имен Root (рис. 4.37). Рис. 4.37. Результат работы сценария Namespaces.vbs Для получения доступа к объектам WMI на локальном или удаленном компьютере используется функция Getobject, в качестве параметра которой мы укажем путь к пространству имен Root на локальном компьютере: strComputer = "." strBeginNamespace = "Root" 1 Подключаемся к пространству имен WMI Set objServices = Getobject("winmgmts:\\" & strComputer & "\" & strBeginNamespace)
После этого в переменной objservices будет храниться указатель на объект SWbemServices. С Замечание ^ Более подробно процесс подключения к службе WMI будет рассмотрен в главе 5. Для создания коллекции пространств имен используется метод instanceof объекта SWbemServices с параметром namespace: ' Создаем коллекцию объектов SWbemObject Set colNamespaces = obiServices.InstancesOf(" NAMESPACE") Затем элементы созданной коллекции colNamespaces перебираются в цикле For Each: For Each objNamespace In colNamespaces 'Формируем результирующую строку strResult=strResult & " " & objNamespaсе.Name & VbCrLf Next Здесь у каждого элемента коллекции (объекта swbemobject) выделяется свойство Name, в котором хранится имя соответствующего пространства имен. Значение свойства Name вместе с символом конца строки (предопределенная константа VbCrLf) добавляется к переменной strResuit, которая после выхода из цикла выводится на экран: WScript.Echo "Пространства имен в " & strBeginNamespace & _ " : " & VbCrLf & VbCrLf & strResuit Полностью сценарий Namespaces.vbs приведен в листинге 4.76, а его JScript- аналог Namespacesjs — в листинге 4.77. Листинг 4.76. Формирование списка пространств имен (без вложенных) (VBScript) i ••••••••••••••••••••••******************^ 1 Имя: Namespaces.vbs ' Язык: VBScript ' Описание: Просмотр пространств имен >*•*+••*******•***•*•**•********************* Option Explicit ' Объявляем переменные Dim strComputer ' Имя компьютера Dim strResuit ' Результат (текстовое сообщение) Dim strBeginNamespace ' Имя начального пространства имен
Dim obj Service ' Объект SWbemServices Dim colNamespaces ' Коллекция пространств имен WMI Dim objNamespace ' Элемент коллекции i•••••*••••••••••••*••• Начало ************************************* 1 Присваиваем начальные значения переменным strComputer = "." strResult = "" strBeginNamespace = "Root" 1 Подключаемся к пространству имен WMI Set objService = GetObject("winmgmts:\\" & strComputer &"\"&s trBeginNamespace) 1 Создаем коллекцию подпространств имен WMI Set colNamespaces = obiService.InstancesOf(" NAMESPACE") 1 Перебираем элементы коллекции For Each objNamespace In colNamespaces ' Формируем результирующую строку strResult=strResult & " " & objNamespace.Name & VbCrLf Next 1 Выводим результат на экран WScript.Echo "Пространства имен в " & strBeginNamespace & _ " : " & VbCrLf & VbCrLf & strResult i•**•*********•***••••••** Конец **********