/
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•**•*********•***••••••** Конец ***********************************
Листинг 4.77. Формирование списка пространств имен (без вложенных)
(JScript)
//•••••••••••••••••••••••••••••••••••••••••••••••***^
// Имя: Namespaces.js
// Язык: JScript
// Описание: Просмотр пространств имен
/у***********************************************
// Объявляем переменные
var
strComputer, // Имя компьютера
strResult, // Результат (текстовое сообщение)
strBeginNamespace, // Имя начального пространства имен
objService, // Объект SWbemServices
colNamespaces, // Коллекция пространств имен WMI
objNamespace; // Элемент коллекции
//■k-k-k-k-k-k-tc-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k Начало *************************************
// Присваиваем начальные значения переменным
strComputer = ".";
strResult = "" ;
strBeginNamespace = "Root";
// Подключаемся к пространству имен WMI
obj Service = GetObject ("winmgmts: WW" + strComputer + "\\" +
strBeginNamespace) ;
// Создаем коллекцию подпространств имен WMI
colNamespaces = new Enumerator(objService.InstancesOf(" NAMESPACE"));
//Цикл по всем элементам коллекции
while (IcolNamespaces.atEnd()) {
//Извлекаем текущий элемент коллекции
Namespace=colNamespaces.item();
//Формируем строку с именами пространств имен
strResult+= " " + Namespace.Name + "\r\n";
//Переходим к следующему элементу коллекции
colNamespaces .moveNext () ;
}
// Выводим результат на экран
WScript.Echo ("Пространства имен в " + strBeginNamespace +
" : " + "\r\n\r\n" + strResult)
//■k-k-k-k-k-k-k -k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k КоНеЦ ***********************************
Рассмотрим теперь сценарий AllNamespaces.vbs, с помощью которого можно
вывести на экран список всех пространств имен WMI, содержащихся в
пространстве имен Root\ciMV2, независимо от уровня вложенности (рис. 4.38).
Рис. 4.38. Результат работы сценария AIINamespaces.vbs
Достигается это с помощью рекурсивной (т. е. содержащей обращение к
самой себе) функции Namespaces!
Sub Namespaces(strNamespace)
' Объявляем локальные переменные функции
Dim obj Service ' Объект SWbemServices
Dim colNamespaces ' Коллекция пространств имен WMI
Dim objNamespace ' Элемент коллекции
1 Формируем результирующую строку
strResult = strResult & " " & strNamespace & VbCrLf
f Подключаемся к пространству имен WMI
Set objService = GetObject("winmgmts:\\" & strComputer & "\" &
strNamespace)
1 Создаем коллекцию подпространств имен WMI
Set colNamespaces = obiService.InstancesOf(" NAMESPACE")
1 Перебираем коллекцию
For Each objNamespace In colNamespaces
' Для каждого элемента коллекции вызываем функцию Namespaces
Call Namespaces (strNamespace & "\" & obj Namespace. Name)
Next
End Sub
Как мы видим, здесь происходит добавление к результирующей строке
strResult названий всех подпространств имен, причем делается это с
помощью обращения для каждого подпространства к той же функции
Namespaces.
Полностью сценарий AIINamespaces.vbs приведен в листинге 4.78, а его
JScript-аналог AllNamespacesjs — в листинге 4.79.
Листинг 4.78. Формирование списка пространств имен (включая вложенные)
(VBScript)
i •**•••*•***•**••**•***•**•**•*•*••••••**•*****
' Имя: AllNamespaces.vbs
' Язык: VBScript
' Описание: Просмотр всех пространств имен
•••••••••••••••••••••••••••••••^
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strResult ' Результат (текстовое сообщение)
Dim strBeginNamespace ' Имя начального пространства имен
' Функция для вывода всех подпространств имен в выбранном пространстве имен
Sub Namespaces (strNamespace)
1 Объявляем локальные переменные функции
Dim objService ' Объект SWbemServices
Dim colNamespaces ' Коллекция пространств имен WMI
Dim obj Namespace ' Элемент коллекции
' Формируем результирующую строку
strResult = strResult & " " & strNamespace & VbCrLf
' Подключаемся к пространству имен WMI
Set obj Service = GetObject("winmgmts:\\" & strComputer & "\" & strNamespace)
f Создаем коллекцию подпространств имен WMI
Set colNamespaces = objService.InstancesOf(" NAMESPACE")
1 Перебираем коллекцию
For Each objNamespace In colNamespaces
1 Для каждого элемента коллекции вызываем функцию Namespaces
Call Namespaces (strNamespace & "\" & obj Namespace. Name)
Next
End Sub
i ** + •** + ******•*•**•*** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strResult = ""
strBeginNamespace = "Root\CIMV2"
1 Вызываем функцию Namespaces
Call Namespaces(strBeginNameSpace)
1 Выводим результат на экран
WScript.Echo "Все пространства имен, начиная с "_
& StrBeginNameSpace & " : "&VbCrLf&VbCrLf&strResult
• *•••••••••••••••••••••••• Коней ***********************************
Листинг 4.79. Формирование списка пространств имен (включая вложенные)
(JScript)
//•••••••••••••••*****************************^
// Имя: AllNamespaces.js
// Язык: JScript
// Описание: Просмотр всех пространств имен
/у*********************************************
// Объявляем переменные
var
strComputer, // Имя компьютера
strResult, // Результат (текстовое сообщение)
strBeginNamespace; // Имя начального пространства имен
// Функция для вывода всех подпространств имен в выбранном пространстве имен
function Namespaces (strNamespace) {
// Объявляем локальные переменные функции
var
objService, // Объект SWbemServices
colNamespaces, // Коллекция пространств имен WMI
objNamespace; // Элемент коллекции
// Формируем результирующую строку
strResult += " " + strNamespace + "\n";
// Подключаемся к пространству имен WMI
objService = GetObject ("winmgmts: \\\\" + strCamputer + "\\" + strNamespaceJ ;
// Создаем коллекцию подпространств имен WMI
colNamespaces = new Enumerator(objService.InstancesOf("_NAMESPACE"));
//Цикл по всем элементам коллекции
while ('colNamespaces.atEnd()) {
//Извлекаем текущий элемент коллекции
Namespace = colNamespaces.item();
// Для каждого элемента коллекции вызываем функцию Namespaces
Namespaces(strNamespace + "\\" + Namespace.Name);
//Переходим к следующему элементу коллекции
colNamespaces.moveNext();
}
}
//kkkkkk-kkkkkkkkkkkkkkkk НаЧаЛО *************************************
// Присваиваем начальные значения переменным
strComputer = ".";
strResult = "";
strBeginNamespace = "Root\\CIMV2";
// Вызываем функцию Namespaces
Namespaces(strBeginNamespace);
// Выводим результат на экран
WScript.Echo ("Все пространства имен, начиная с " + strBeginNamespace +
" : " + "\n\n" + strResult);
//■k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k Конец ***********************************
Получение списка всех классов
в пространстве имен
В листинге 4.80 приведен сценарий Classes.vbs, в котором формируется
текстовый файл со списком всех классов из определенного пространства имен
WMI (JScript-версия этого сценария приведена в листинге 4.81).
Полученный файл автоматически открывается с помощью Блокнота (рис. 4.39).
Рис. 4.39. Результат работы сценария Classes.vbs
Как и в предыдущих сценариях, подключение к нужному пространству имен
WMI производится с помощью создания объекта swbemobject (переменная
obj Service):
strComputer = "."
strNamespace = "Root\CIMV2"
Set objService = GetObject("winmgmts:\\" & strComputer & "\" &
strNamespace)
Коллекция классов сздается путем вызова метода Subciassesof:
Set colClasses = objService.SubclassesOf()
Элементы коллекции перебираются в цикле For Each, где из них
извлекаются названия соответствующих классов, которые добавляются к
результирующей строке:
For Each objClass In colClasses
'Формируем результирующую строку
strResult=strResult & " " & objClass.Path_.Class & VbCrLf
Next
Сформированная строка записывается в текстовый файл путем вызова
предварительно описанной функции Textout:
TextOut (" Список классов в пространстве имен " + strNamespace +
" : \r\nH + strResult, "С:WClasses.txt");
В функции Textout для записи строки в файл используется объект
FileSystemObject!
Sub TextOut (Text, File)
' Объявляем переменные
Dim FSO, FOut
' Создаем объект FileSystemObject
Set FSO=WScript.CreateObject("Scripting.FileSystemObject")
' Открываем выходной файл для записи
Set FOut = FSO.OpenTextFile (File,ForWriting,true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
' Закрываем выходной файл
FOut.Close
End Sub
Полученный в результате текстовый файл C:\Classes.txt открывается в Блокноте:
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShe11.Exec("notepad " & "C:\Classes.txt" )
Листинг 4.80. Формирование списка всех классов в пространстве имен (VBScript)
I *******************************************************************
' Имя: Classes.vbs
' Язык: VBScript
1 Описание: Просмотр всех классов в пространстве имен
********************************************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strResult ' Результат (текстовое сообщение)
Dim strNamespace ' Имя пространства имен
Dim WshShell ' Объект WshShell
Dim objService ' Объект SWbemServices
Dim colClasses ' Коллекция классов
Dim objClass ' Элемент коллекции
Dim theNotepad ' Объект WshScriptExec
' Константа для задания режима открытия файла
Const ForWriting = 2
' Функция для записи информации в файл
Sub TextOut (Text, File)
' Объявляем переменные
Dim FSO, FOut
' Создаем объект FileSystemObject
Set FSO=WScript.CreateObj ect("Scripting.FileSystemObj ect")
' Открываем выходной файл для записи
Set FOut = FSO.OpenTextFile (File,ForWriting,true)
' Записываем текстовую строку в файл
FOut.WriteLine Text
' Закрываем выходной файл
FOut.Close
End Sub
i•••*••*••*•*•*•*•*•**• Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strResult = ""
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set obj Service = GetObject ("winmgmts: \\" & strComputer & "\" & strNamespace)
' Создаем коллекцию классов WMI
Set colClasses = objService.SubclassesOf()
1 Перебираем элементы коллекции
For Each objClass In colClasses
'Формируем результирующую строку
strResult=strResult & " " & objClass.Path_.Class & VbCrLf
Next
' Выводим результат в файл с помощью функции TextOut
TextOut " Список классов в пространстве имен " & strNameSpace &_
" : " & VbCrLf & strResult, "C:\Classes.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad " & "C:\Classes.txt" )
i ************************* Конец ***********************************
Листинг 4.81. Формирование списка всех классов в пространстве имен (JScript)
//*******************************************************************
// Имя: Classes.js
// Язык: JScript
// Описание: Просмотр всех классов в пространстве имен
//*******************************************************************
// Объявляем переменные
var
strComputer, // Имя компьютера
strResult, // Результат (текстовое сообщение)
strNamespace, // Имя пространства имен
WshShell, // Объект WshShell
objService, // Объект SWbemServices
colClasses, // Коллекция классов
objClass, // Элемент коллекции
theNotepad; // Объект WshScriptExec
// Константа для задания режима открытия файла
var ForWriting = 2;
// Функция для записи информации в файл
function TextOut (Text, File) {
// Объявляем переменные
var FSO, FOut ;
// Создаем объект FileSystemObject
FSO = WScript.CreateObject("Scripting.FileSystemObject");
// Открываем выходной файл для записи
FOut = FSO.OpenTextFile (File,ForWriting,true);
// Записываем текстовую строку в файл
FOut.WriteLine(Text);
// Закрьгоаем выходной файл
FOut.Close();
}
//••••••••••••••••••••••а- начало *************************************
// Присваиваем начальные значения переменным
strComputer = ".";
strResult = "";
strNamespace = "Root\\CIMV2";
// Подключаемся к пространству имен WMI
objService - GetObject("winmgmts:\\\\" + strCarputer + "\\" + strNamespace);
// Создаем коллекцию классов WMI
colClasses = new Enumerator(objService.SubclassesOf());
// Перебираем элементы коллекции
while (!colClasses.atEnd()) {
//Извлекаем текущий элемент коллекции
objClass = colClasses.item();
//Формируем результирующую строку
strResult += " " + objClass.Path_.Class + "\r\n";
//Переходим к следующему элементу коллекции
colClasses.moveNext();
}
// Выводим результат в файл с помощью функции TextOut
TextOut (" Список классов в пространстве имен " + strNamespace +
" : \r\n" + strResult, "С:WClasses.txt");
// Создаем объект WshShell
WshShell = WScript.CreateObject("WScript.Shell");
// Открываем созданный файл в Блокноте
theNotepad = WshShell.Exec("notepad С:\\Classes.txt" );
//•••*■•*■•••**•••*■•*•*■*■•••••••• Конец ***********************************
Получение списка классов определенного типа
Чтобы сформировать список всех классов того или иного типа (например,
ассоциативных), нужно проверить, имеется ли в коллекции квалификаторов
объекта (свойство .Qualifiers) квалификатор с соответствующим именем.
В листингах 4.82 и 4.83 приведены сценарии на языках VBScript и JScript
соответственно, в которых список всех ассоциативных классов открывается
для просмотра в Блокноте.
Листинг 4.82. Формирование списка всех ассоциативных классов
в пространстве имен (VBScript)
••••••••••••••••••••••••••••••••
Имя: AssocClasses.vbs
Язык: VBScript
Описание: Просмотр всех ассоциативных классов в пространстве имен
•*•••*•••*••••*••••••*****••••
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strResult ' Результат (текстовое сообщение)
Dim strNamespace ' Имя пространства имен
Dim WshShell ' Объект WshShell
Dim objService ' Объект SWbemServices
Dim colClasses ' Коллекция классов
Dim objClass ' Элемент коллекции
Dim colClassQualifiers ' Коллекция квалификаторов
Dim objClassQualifier ' Элемент коллекции квалификаторов
Dim theNotepad ' Объект WshScriptExec
' Константа для задания режима открытия файла
Const ForWriting = 2
' Функция для записи информации в файл
Sub TextOut (Text, File)
' Объявляем переменные
Dim FSO, FOut
' Создаем объект FileSystemObject
Set FSO=WScript.CreateObj ect("Scripting.FileSystemObj ect")
' Открываем выходной файл для записи
Set FOut = FSO.OpenTextFile (File,ForWriting,true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
1 Закрываем выходной файл
FOut.Close
End Sub
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strResult = ""
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("winmgmts:\\" & strComputer & "\" & strNamespace)
' Создаем коллекцию классов WMI
Set colClasses = objService.SubclassesOf()
' Перебираем элементы коллекции
For Each "objClass in colClasses
' Создаем для класса коллекцию квалификаторов
Set colClassQualifiers = objClass.Qualifiers_
' Перебираем коллекцию квалификаторов
For Each objClassQualifier In colClassQualifiers
' Ищем квалификатор с именем "association"
If LCase(objClassQualifier.Name) = "association" Then
'Формируем результирующую строку
strResult=strResult & " " & objClass.Path_.Class & VbCrLf
End If
Next
Next
' Выводим результат в файл с помощью функции TextOut
TextOut " Ассоциативные классы в пространстве имен " & strNamespace &_
" : " & VbCrLf &_
strResult, "С:\AssocClasses.txt"
' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
' Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad " & "C:\AssocClasses.txt" )
»************************* Конец ***********************************
Листинг 4.83. Формирование списка всех ассоциативных классов
в пространстве имен (JScript)
у/*******************************************************************
// Имя: AssocClasses.js
// Язык: JScript
// Описание: Просмотр всех ассоциативных классов в пространстве имен
/у*******************************************************************
// Объявляем переменные
var
strComputer, // Имя компьютера
strResult, // Результат (текстовое сообщение)
strNamespace, // Имя начального пространства имен
WshShell, // Объект WshShell
objService, // Объект SWbemServices
colClasses, // Коллекция классов
objClass, // Элемент коллекции
colClassQualifiers, // Коллекция квалификаторов
objClassQualifier, // Элемент коллекции квалификаторов
theNotepad; // Объект WshScriptExec
// Константа для задания режима открытия файла
var ForWriting = 2;
// Функция для записи информации в файл
function TextOut (Text, File) {
// Объявляем переменные
var FSO, FOut;
// Создаем объект FileSystemObject
FSO=WScript.CreateObject("Scripting.FileSystemObject");
// Открываем выходной файл для записи
FOut = FSO.OpenTextFile (File,ForWriting,true);
// Записываем текстовую строку в файл
FOut.WriteLine (Text);
// Закрываем выходной файл *
FOut.Close();
}
/у********************** Начало *************************************
// Присваиваем начальные значения переменным
strComputer = ".";
strResult = "";
strNamespace = "Root\\CIMV2";
// Подключаемся к пространству имен WMI
objService = GetObject ("winmgnits: WW" + strComputer + "\\" +
strNamespace) ;
// Создаем коллекцию классов WMI
colClasses = new Enumerator(objService.SubclassesOf());
// Перебираем элементы коллекции
while (!colClasses.atEnd()) {
//Извлекаем текущий элемент коллекции
objClass = colClasses.item();
// Создаем для класса коллекцию квалификаторов
colClassQualifiers = new Enumerator (objClass.Qualifiers..)
// Перебираем коллекцию квалификаторов
while (!colClassQualifiers.atEnd()) {
//Извлекаем текущий элемент коллекции
objClassQualifier = colClassQualifiers.item();
// Ищем квалификатор с именем association
if ((objClassQualifier.Name.toLowerCase()) == "association") {
// Формируем результирующую строку
strResult += " " + objClass.Path_.Class + "\r\n"
}
// Переходим к следующему элементу коллекции
colClassQualifiers.moveNext();
}
// Переходим к следующему элементу коллекции
colClasses.moveNext();
}
// Выводим результат в файл с помощью функции TextOut
TextOut (" Ассоциативные классы в пространстве имен " + strNameSpace +
" : \r\n" + strResult, "С:\\AssocClasses.txt");
// Создаем объект WshShell
wshShell = WScript.CreateObject("WScript.Shell");
// Открываем созданный файл в Блокноте
theNotepad = wshShell.Exec("notepad С:\\AssocClasses.txt" );
//•••••••••••••••••••••••••а- Конец ***********************************
Просмотр сведений о классе
Далее будут приведены сценарии на языках VBScript и Jscript, которые
позволяют увидеть отдельные списки всех свойств, методов и квалификаторов
заданного класса WMI. Кроме этого, на прилагаемом к книге диске
находятся сценарии Win32_Process.vbs и Win32_Process.js, в которых вся
информация о классе win32_Process выводится в один текстовый файл, который
затем открывается в Блокноте.
Просмотр свойств класса
В листингах 4.84 и 4.85 приведены VBScript- и JScript-сценарии
Properties.vbs и Properties.js, в которых формируется текстовый файл
C:\Properties.txt со списком всех свойств класса win32_Process. Полученный
файл затем автоматически открывается в Блокноте (рис. 4.40).
Для получения доступа к нужному нам классу win32_Process используется
функция Getobject, в качестве параметра которой мы укажем путь к этому
классу:
strResult = ""
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
Set objClass = GetObject("winmgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
После этого в переменной objclass будет храниться указатель на объект
SWbemObject. В СВОЙСТВе Properties. ЭТОЙ Переменной Хранится КОЛЛеКЦИЯ
всех свойств класса win32_Process (объект swbemPropertySet), указатель на
КОТОРУЮ занОСИТСЯ В Переменную colClassProperties!
Set colClassProperties = objClass.Properties.
Рис. 4.40. Результат работы сценария Properties.vbs
В свойстве Name каждого элемента коллекции хранится имя
соответствующего свойства. Эти имена в цикле For Each добавляются к результирующей
строке:
For Each objСlassProperty In colClassProperties
strResult = strResult & " " & objСlassProperty.Name & VbCrLf
Next
Полученная строка strResult с помощью функции Textout записывается
в текстовый файл C:\Properties.txt, который затем открывается в Блокноте.
' Имя: Properties.vbs
' Язык: VBScript
' Описание: Просмотр свойств класса Win32_Process
Листинг 4.84. Просмотр свойств класса win32_Proceee (VBScript)
I*******************************************************************
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strResult ' Результат (текстовое сообщение)
Dim strNamespace ' Имя пространства имен WMI
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colClassProperties ' Коллекция свойств класса
Dim objСlassProperty ' Элемент коллекции
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
' Константа для задания режима открытия файла
Const ForWriting = 2
' Функция для записи информации в файл
Sub TextOut (Text, File)
' Объявляем переменные
Dim FSO, FOut
' Создаем объект FileSystemObject
Set FSO=WScript.CreateObject("Scripting.FileSystemObject")
' Открываем выходной файл для записи
Set FOut = FSO.OpenTextFile(File,ForWriting,true)
' Записываем текстовую строку в файл
FOut.WriteLine Text
' Закрываем выходной файл
FOut.Close
End Sub
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strResult = ""
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
' Получаем указатель на класс WMI
Set objClass = GetObject("winmgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
' Создаем коллекцию свойств класса
Set colClassProperties = objClass.Properties_
' Перебираем элементы коллекции
For Each objСlassProperty In colClassProperties
'Формируем результирующую строку
strResult = strResult & " " & objСlassProperty.Name & VbCrLf
Next
' Выводим результат в файл с помощью функции TextOut
TextOut "Свойства класса " & strClass & ":" & VbCrLf & strResult,_
"С:\Properties.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShe11.Exec("notepad " & "C:\Properties.txt" )
»**••*•*****•••**••*•*•*** Коней **********************************''
//•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
// Имя: Properties.js
// Язык: JScript
// Описание: Просмотр свойств класса Win32_Process
//•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
// Объявляем переменные
var
strComputer, // Имя компьютера
strResult, // Результат (текстовое сообщение)
strNamespace, // Имя пространства имен WMI
strClass, // Имя класса
objClass, // Объект SWbemObject (класс WMI)
colClassProperties, // Коллекция свойств класса
objClassProperty, // Элемент коллекции
WshShell, // Объект WshShell
ишШПШш ШЖ ^шШШШ ттимдгаш
theNotepad; // Объект WshScriptExec
// Константа для задания режима открытия файла
var ForWriting = 2;
// Функция для записи информации в файл
function TextOut (Text, File) {
// Объявляем переменные
var FSO, FOut;
// Создаем объект FileSystemObject
FSO=WScript.CreateObject("Scripting.FileSystemObject");
// Открываем выходной файл для записи
FOut = FSO.OpenTextFile(File,ForWriting,true);
// Записываем текстовую строку в файл
FOut.WriteLine(Text);
// Закрываем выходной файл
FOut.Close();
}
/у********************** Начало *************************************
// Присваиваем начальные значения переменным
strResult = "";
strComputer = ".";
strNamespace = "Root\\CIMV2";
strClass = "Win32_Process";
// Получаем указатель на класс WMI
objClass = GetObject ("winmgmts: WW" + strComputer +
"\\" + strNamespace + ":" + strClass);
// Создаем коллекцию свойств класса
colClassProperties = new Enumerator(objClass.Properties_) ;
// Перебираем элементы коллекции
while (!colClassProperties.atEnd()) {
//Извлекаем текущий элемент коллекции
objClassProperty = colClassProperties.item();
//Формируем результирующую строку
strResult += " " + objClassProperty.Name + "\r\n";
//Переходим к следующему элементу коллекции
colClassProperties.moveNext();
}
// Выводим результат в файл с помощью функции TextOut
TextOut("Свойства класса " + strClass + ":" + "\r\n" + strResult,
"С: WProperties.txt") ;
// Создаем объект WshShell
WshShell = WScript.CreateObject("WScript.Shell");
// Открываем созданный файл в Блокноте
theNotepad = WshShell.Exec("notepad C:WProperties.txt" );
/у************************* Коней. **********************+***+********
Просмотр методов класса
Приведенные в листингах 4.86 и 4.87 сценарии Methods.vbs и Methods.js
позволяют сформировать и просмотреть список методов, имеющихся
В Классе Win32_Process (рИС. 4.41).
Рис. 4.41. Результат работы сценария Methods.vbs
Коллекция методов класса (объект swbemMethodSet) хранится в свойстве
Methods_ соответствующего объекта swbemobject (переменная objciass):
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
' Получаем указатель на класс WMI
Set objciass = GetObject("winmgmts:W" & strComputer & _
"\" & strNamespace & ":" & strClass)
' Создаем коллекцию методов класса
Set colClassMethods = objClass.Methods_
После этого элементы коллекции coiciassMethods перебираются в цикле
For Each, в котором имена методов класса добавляются к результирующей
строке:
For Each objClassMethod In coiciassMethods
strResult = strResult & " " & objClassMethod.Name & VbCrLf
Next
Сформированная строка выводится на экран с помощью метода Echo
объекта WScript:
WScript.Echo "Методы класса " & strClass & ":" & VbCrLf & strResult
Листинг 4.86. Просмотр методов класса Win32 .Process (VBScript)
»•*••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••*••••
' Имя: Methods.vbs
' Язык: VBScript
' Описание: Просмотр методов класса Win32_Process
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strResult ' Результат (текстовое сообщение)
Dim strNamespace ' Имя пространства имен WMI
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colClassMethods ' Коллекция методов класса
Dim objClassMethod ' Элемент коллекции
»*•*•**•**•***•••••••*• Начало *************************************
' Присваиваем начальные значения переменным
strResult = ""
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
' Получаем указатель на класс WMI
Set objClass = GetObject("winmgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
' Создаем коллекцию методов класса
Set colClassMethods = objClass.Methods_
1 Перебираем элементы коллекции
For Each objClassMethod In colClassMethods
'Формируем результирующую строку
strResult = strResult & " " & objClassMethod.Name & VbCrLf
Next
' Выводим результат на экран
WScript.Echo "Методы класса " & strClass & ":" & VbCrLf & strResult
• •••*••*•**•*•••••**••**•• Конец ***********************************
Листинг 4.87. Просмотр методов класса Win32 Process (JScript)
//••••••••••••••••••••••••••••••••••••••••••••••••^
// Имя: Methods.j s
// Язык: JScript
// Описание: Просмотр методов класса Win32_Process
//•••••••••••••••••••••••••••••••••••••••••••••••••••••••••
// Объявляем переменные
var
strComputer, // Имя компьютера
strResult, // Результат (текстовое сообщение)
strNamespace, // Имя пространства имен WMI
strClass, // Имя класса
objClass, // Объект SWbemObject (класс WMI)
colClassMethods, // Коллекция методов класса
objClassMethod; // Элемент коллекции
/у********************** Начало *************************************
// Присваиваем начальные значения переменным
strResult = ми;
strComputer = ".";
strNamespace = "Root\\CIMV2";
strClass = "Win32_Process";
// Получаем указатель на класс WMI
obj Class = GetObject ("winmgmts: WW" + strComputer + "\\" +
strName space +
+ strClass)
// Создаем коллекцию методов класса
colClassMethods = new Enumerator(objClass.Methods_);
// Перебираем элементы коллекции
while (!colClassMethods.atEnd()) {
//Извлекаем текущий элемент коллекции
objClassMethod = colClassMethods.item();
//Формируем результирующую строку
strResult += " " + objClassMethod.Name + "\r\n";
//Переходим к следующему элементу коллекции
colClassMethods.moveNext();
}
// Выводим результат на экран
WScript.Echo("Методы класса " + strClass + ":\r\n" + strResult);'
/у************************* Конец ***********************************
Просмотр квалификаторов класса
Квалификаторы класса являются элементами коллекции, хранящейся
в свойстве Qualifiers, соответствующего объекта swbemobject. Доступ
к этой коллекции (объекту swbemQualif ierSet) осуществляется так же, как
и к рассмотренным ранее коллекциям свойств и методов класса.
В листингах 4.88 и 4.89 приведены сценарии Qualifiers.vbs и Qualifiers.js на
языках VBScript и JScript соответственно, которые выводят на экран список
квалификаторов класса win32_Process (рис. 4.42).
Рис. 4.42. Результат работы сценария Qualifiers.vbs
Листинг 4.88. Просмотр квалификаторов класса win32_Procee. (VBScript)
I*********************************************************
' Имя: Qualifiers.vbs
' Язык: VBScript
' Описание: Просмотр квалификаторов класса Win32_Process
i •••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strResult ' Результат (текстовое сообщение)
Dim strNamespace ' Имя пространства имен WMI
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colClassQualifiers ' Коллекция квалификаторов класса
Dim objClassQualifier ' Элемент коллекции
i*••••••••••••••*•••*•• Начало *************************************
' Присваиваем начальные значения переменным
strResult = ""
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
1 Получаем указатель на класс WMI
Set objClass = GetObject("winmgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
' Создаем коллекцию квалификаторов класса
Set colClassQualifiers = objClass.Qualifiers_
' Перебираем элементы коллекции
For Each objClassQualifier In colClassQualifiers
'Формируем результирующую строку
strResult = strResult & " " & objClassQualifier.Name & " = " &
objClassQualifier.Value & VbCrLf
Next
' Выводим результат на экран
WScript.Echo "Квалификаторы класса " & strClass & ":" & VbCrLf &
strResult
i ************************* Коней ***********************************
Листинг 4.89. Просмотр квалификаторов класса Win32 _Proceee (JScript)
//•••••••••••••••••••••*•••••••*•••••••••••••••••••••••••••••••••••••
// Имя: Qualifiers.js
// Язык: JScript
// Описание: Просмотр квалификаторов класса Win32_Process
//•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
// Объявляем переменные
var
strComputer, // Имя компьютера
strResult, // Результат (текстовое сообщение)
strNamespace, // Имя пространства имен WMI
strClass, // Имя класса
objClass, // Объект SWbemObject (класс WMI)
colClassQualifiers, // Коллекция квалификаторов класса
objClassQualifier; // Элемент коллекции
/у********************** Начало *************************************
// Присваиваем начальные значения переменным
strResult = мм;
strComputer = ".";
strNamespace = "Root\\CIMV2";
strClass = "Win32_Process";
// Получаем указатель на класс WMI
objClass = GetObject("winmgmts:\\\\" + strComputer + "\\" +
strNamespace + ":" + strClass);
// Создаем коллекцию квалификаторов класса
colClassQualifiers = new Enumerator(objClass.Qualifiers_)
// Перебираем элементы коллекции
while (!colClassQualifiers.atEnd()) {
//Извлекаем текущий элемент коллекции
objClassQualifier = colClassQualifiers.item ();
//Формируем результирующую строку
strResult += " " + objClassQualifier.Name + " = " +
objClassQualifier.Value + "\r\n";
//Переходим к следующему элементу коллекции
colClassQualifiers.moveNext();
}
// Выводим результат на экран
WScript.Echo ("Квалификаторы класса " + strClass + ":\r\n" + strResult);
/у************************* Конец ***********************************
Вывод описания класса в MOF- и XML-файлы
Рассмотрим сценарий CreateMof.vbs, который записывает в текстовый файл
C:\Classes.mof описание класса win32_Process на языке MOF.
В отличие от рассмотренных ранее сценариев WMI, для получения
описания класса нужно получить ссылку на него с помощью метода Get объекта
swbemservices, посредством которого прозводилось подключение к
пространству имен WMI:
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("winmgmts:\\" & strComputer & "\" & strNamespace)
1 Получаем указатель на класс WMI
Set objClass = objService.Get(strClass, wbemFlagUseAmendedQualifiers)
В качестве второго параметра метода Get здесь указана константа
wbemFlagUseAmendedQualifiers:
Const wbemFlagUseAmendedQualifiers = &h20000
Эта константа позволяет включать в описание класса все свойства, методы и
квалификаторы, в том числе наследованные от родительских классов.
Текстовая строка с MOF-кодом, описывающим класс, возвращается
методом GetObjectText_:
// Записываем описание класса в формате MOF в строку вывода
strResult = objClass.GetObjееtText_();
Полученная строка записывается в текстовый файл с помощью функции
TextOut:
TextOut strResult, "C:\Classes.mof"
Полностью сценарий Create МО F.vbs приведен в листинге 4.90, а его JScript-
аналог CreateMOF.js — в листинге 4.91.
Листинг 4.90. Вывод описания класса Win32 _Ргос... в MOF-файл (VBScript)
* Имя: CreateMOF.vbs
1 Язык: VBScript
1 Описание: Вывод описания класса Win32_Process в MOF-файл
I***********************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strResult ' Результат (текстовое сообщение)
Dim strNamespace ' Имя пространства имен WMI
Dim strClass ' Имя класса
Dim WshShell ' Объект WshShell
Dim obj Service ' Объект SWbemServices
Dim objClass ' Объект SWbemObject (класс WMI)
1 Константа для задания режима открытия файла
Const ForWriting = 2
1 Константа для определения режима работы метода GET
Const wbemFlagUseAmendedQualifiers = &h20000
1 Функция для записи информации в файл
Sub TextOut (Text, File)
1 Объявляем переменные
Dim FSO, FOut
1 Создаем объект FileSystemObject
Set FSO=WScript.CreateObject("Scripting.FileSystemObject")
1 Открываем выходной файл для записи
Set FOut = FSO.OpenTextFile (File,ForWriting,true)
' Записываем текстовую строку в файл
FOut.WriteLine Text
1 Закрываем выходной файл
FOut.Close
End Sub
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strResult = ""
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("winmgmts:\\" & strComputer & "\" &
strNamespace)
1 Получаем указатель на класс WMI
Set objClass = objService.Get(strClass, wbemFlagUseAmendedQualifiers)
1 Записываем описание класса в формате MOF в строку вывода
strResult = objClass.GetObjectText_
1 Выводим результат в файл с помощью функции TextOut
TextOut strResult, "С:\Classes.mof"
i************************* Коней ***********************************
Листинг 4.91. Вывод описания класса win32_Procee. в MOF-файл (JScript)
//••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••*••
// Имя: CreateMOF.js
// Язык: JScript
// Описание: Вывод описания класса Win32_Process в MOF-файл
//•••••••••••••••••••••••••••••••••••••••••••••••^
// Объявляем переменные
var
strComputer, // Имя компьютера
strResult, // Результат (текстовое сообщение)
strNamespace, // Имя пространства имен WMI
strClass, // Имя класса
WshShell, // Объект WshShell
objService, // Объект SWbemServices
objClass; // Объект SWbemObject (класс WMI)
// Константа для задания режима открытия файла
var ForWriting = 2;
// Константа для определения режима работы метода GET
var wbemFlagUseAmendedQualifiers = 0x20000;
// Функция для записи информации в файл
function TextOut (Text, File) {
// Объявляем переменные
var FSO, FOut;
// Создаем объект FileSystemObject
FSO=WScript.CreateObject("Scripting.FileSystemObject");
// Открываем выходной файл для записи
FOut = FSO.OpenTextFile (File,ForWriting,true);
// Записываем текстовую строку в файл
FOut.WriteLine (Text);
// Закрываем выходной файл
FOut.Close();
}
//•**•**•••*•••••••••••• Начало *************************************
// Присваиваем начальные значения переменным
strComputer = ".";
strResult = "";
s trNamespace = "Roo t\\СIMV2";
strClass = "Win32_Process";
// Подключаемся к пространству имен WMI
obj Service = GetObject ("winmgmts: WW" + strComputer + " \\" + strName-
space);
// Получаем указатель на класс WMI
objClass = objService.Get(strClass, wbemFlagUseAmendedQualifiers);
// Записываем описание класса в формате MOF в строку вывода
strResult = objClass.GetObjectText_();
// Выводим результат в файл с помощью функции TextOut
TextOut (strResult, "С:WClasses.mof" )
//••*••*•••••••••***•••••*•• конец ***********************************
В Windows XP и Windows Server 2003 можно получить описание класса не
только в MOF-, но и в XML-формате. Для этого используется метод
GetText_ объекта swbemobject, в качестве параметра которого указывается
константа wbemObjectTextFormatWMiDTD2 0, задающая версию описания типа
документа CIM:
f Константа для определения формата XML
Const wbemObjectTextFormatWMIDTD20 = 2
1 Записываем описание класса в формате XML в строку вывода
strResult = objClass.GetText_(wbemObjectTextFormatWMIDTD20)
В листингах 4.92 и 4.93 приведены сценарии CreateXML.vbs и CreateXML.js
на языках VBScript и JScript соответственно, в которых производится
формирование файла C:\Classes.xml с описанием класса win32_Process в
формате XML.
I •*•••*••••••*•••••*•*•••*•*••••••••••••*••*•••••*•••••••*•••*••••••••••*••••
1 Имя: CreateXML.vbs
1 Язык: VBScript
1 Описание: Вывод описания класса Win32_Process в XML-файл
1 (для Windows XP)
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strResult ' Результат (текстовое сообщение)
Dim strNamespace ' Имя пространства имен WMI
Dim strClass ' Имя класса
Dim WshShell ' Объект WshShell
Dim objService ' Объект SWbemServices
Dim objClass ' Объект SWbemObject (класс WMI)
1 Константа для задания режима открытия файла
Const ForWriting = 2
1 Константа для определения режима работы метода GET
Const wbemFlagUseAmendedQualifiers = &h20000
1 Константа для определения формата XML
Листинг 4.92. Вывод описания класса win32_Proceee в XML-файл (VBScript)
Const wbemObjectTextFormatWMIDTD20 = 2
1 Функция для записи информации в файл
Sub TextOut (Text, File)
1 Объявляем переменные
Dim FSO, FOut
1 Создаем объект FileSystemObject
Set FSO=WScript.CreateObject("Scripting.FileSystemObject")
1 Открываем выходной файл для записи
Set FOut = FSO.OpenTextFile (File,ForWriting,true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
1 Закрываем выходной файл
FOut.Close
End Sub
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strResult = ""
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("winmgmts:\\" & strComputer & "\" & strNameSpace)
1 Получаем указатель на класс WMI
Set objClass = objService.Get(strClass, wbemFlagUseAmendedQualifiers)
1 Записываем описание класса в формате XML в строку вывода
strResult = objClass.GetText_(wbemObjectTextFormatWMIDTD20)
1 Выводим результат в файл с помощью функции TextOut
TextOut strResult, "C:\Classes.xml"
i************************* конец ***********************************
Листинг 4.93. Вывод описания класса win32_Proc„. в XML-файл (JScript)
//••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••Ik*
// Имя: CreateXML.js
// Язык: JScript
// Описание: Вывод описания класса Win32_Process в XML-файл (только
// для Windows XP)
//•••••••••••••••••••••••••••••••••••••••••••••••••••^
// Объявляем переменные
var
strComputer, // Имя компьютера
strResult, // Результат (текстовое сообщение)
strNamespace, // Имя пространства имен WMI
strClass, // Имя класса
WshShell, // Объект WshShell
objService, // Объект SWbemServices
objClass; // Объект SWbemObject (класс WMI)
// Константа для задания режима открытия файла
var ForWriting = 2;
// Константа для определения режима работы метода GET
var wbemFlagUseAmendedQualifiers = 0x20000;
// Константа для определения формата XML
var wbemObjectTextFormatWMIDTD20 = 2
// Функция для записи информации в файл
function TextOut (Text, File) {
// Объявляем переменные
var FSO, FOut;
// Создаем объект FileSystemObject
FSO=WScript.CreateObject("Scripting.FileSystemObject");
// Открываем выходной файл для записи
FOut = FSO.OpenTextFile (File,ForWriting,true);
// Записываем текстовую строку в файл
FOut.WriteLine (Text);
// Закрываем выходной файл
FOut.Close();
у/********************** Начало *************************************
// Присваиваем начальные значения переменным
strComputer = ".";
strResult = "";
strNamespace = "Root\\CIMV2";
strClass = "Win32_Process11 ;
// Подключаемся к пространству имен WMI
obj Service = GetObject( "winmgmtsiWW" + strConputer + "\\" + strNameSpace) ;
// Получаем указатель на класс WMI
objClass = obj Service. Get (strClass, wbemFlagUseAmendedQualifiers) ;
// Записываем описание класса в формате XML в строку вывода
strResult = objClass.GetText_(wbemObjectTextFormatWMIDTD20)
// Выводим результат в файл с помощью функции TextOut
TextOut (strResult, "С:WClasses.xml" )
//•••••••*•••*••••••••••••• конец ***********************************
Глава 5
Механизм работы
и основные типы сценариев WMI
В предыдущей главе уже были приведены несколько сценариев, работающих
с различными объектами WMI. Здесь мы подробно остановимся на
механизме работы подобных сценариев, в основе которого лежит библиотека
поддержки сценариев WMI (WMI Scripting Library), а также рассмотрим на
примерах все основные типы сценариев WMI.
Сразу отметим, что все сценарии данной главы написаны на языке VBScript,
который позволяет напрямую работать с выходными параметрами методов
объектов WMI, а также обрабатывать элементы коллекций без создания
дополнительного объекта Enumerator.
Объектная модель библиотеки поддержки
сценариев WMI
Итак, для того чтобы получить доступ к WMI с помощью сценариев,
необходима специальная библиотека поддержки сценариев WMI (WMI Scripting
Library), которая располагается в файле wbemdisp.dll в каталоге %SystemRoot%\
System32\Wbem (в Windows Server 2003, Windows XP, Windows 2000 и Windows NT)
или в каталоге %WinDir%\System\Wbem (в Windows Me и Windows 9x).
В этой библиотеке определяются несколько связанных друг с другом
объектов-серверов автоматизации (например, в Windows XP и Windows Server 2003
число этих объектов равно двадцати четырем), позволяющих из сценария
осуществить авторизованное подключение к службе WMI на локальном или
удаленном компьютере и получить доступ к классам и объектам из
определенного пространства имен.
При этом связь между репозиторием CIM и объектами библиотеки
поддержки сценариев WMI реализована следующим образом: после
подключения к службе WMI и получения с помощью этих объектов доступа к
экземпляру управляемого ресурса WMI, из сценария становится возможным
напрямую использовать все свойства и методы, описанные в
соответствующем этому ресурсу классе CIM, как если бы эти свойства и методы были
частью библиотеки поддержки сценариев WMI. Это достигается с помощью
полиморфного объекта swbemobject, который может представлять либо
экземпляр управляемого ресурса WMI, либо определение класса WMI.
Полиморфным этот объект называется из-за того, что набор его свойств зависит
от управляемого ресурса (класса CIM), которому он сопоставлен. Например,
для класса win32_Process объект swbemobject будет среди прочих иметь
СВОЙСТВа Handle И ExecutionState, а ДЛЯ Класса Win32_Service — СВОЙСТВа
ServiceType И StartMode.
В таблице 5.1 кратко описаны основные объекты библиотеки поддержки
сценариев WMI, которые мы будем наиболее часто использовать в наших
примерах.
Таблица 5.1. Основные объекты библиотеки поддержки сценариев WMI
Объект
Описание
SWbemLocator
SWbemServices
SWbemObj ееtSet
SWbemObject
SWbemMe thodS e t
SWbemMethod
Используется для установления связи с пространством
имен WMI на локальном или удаленном компьютере.
В языке VBScript создается с помощью функции
CreateObject, в Jscript — с помощью конструкции new
ActiveXObject, в WSH — с помощью метода
CreateObject объекта WScript
Позволяет выполнять действия над классами и объектами
в пространстве имен WMI (создание, получение доступа,
изменение и удаление классов или экземпляров классов).
В языках VBScript и JScript создается с помощью функции
GetObject, в WSH — с помощью метода Getobject
объекта WScript
Коллекция объектов SWbemObject, которая может быть
получена путем вызова методов других объектов
библиотеки поддержки сценариев WMI (например, методов
ExecQuery или InstancesOf объекта SWbemServices)
Представляет либо экземпляр управляемого ресурса WMI,
либо определение класса WMI. В языках VBScript и JScript
создается с помощью функции Getobject, в WSH—
с помощью метода Getobject объекта WScript
Коллекция объектов SWbemMethod. Хранится в свойстве
Methods_ соответствующего объекта SWbemObject, не
может быть создана в сценарии напрямую с помощью
CreateObject или Getobject
Позволяет получить описание метода объекта WMI. Этот
объект не может быть создан в сценарии напрямую с
помощью CreateObject или Getobject
Таблица 5.1 (продолжение)
Объект
Описание
Коллекция объектов swbemProperty. Хранится в свойстве
Properties, соответствующего объекта SWbemObject, не
может быть создана в сценарии напрямую с помощью
CreateObject или GetObject
Представляет одно свойство управляемого объекта WMI.
Этот объект не может быть создан в сценарии напрямую
с помощью CreateObject или GetObject
Коллекция объектов swbemQualif ier. Хранится в
свойстве Qualif iers_ соответствующего объекта SWbemObject,
swbemProperty или SWbemMethod. Эта коллекция не
может быть создана в сценарии напрямую с помощью
CreateObject ИЛИ GetObject
Представляет либо квалификатор класса или экземпляра
класса WMI, либо квалификатор свойства или метода
объекта WMI. Этот объект не может быть создан в сценарии
напрямую с помощью CreateObject или GetObject
Позволяет построить и проверить путь к объекту WMI.
В языке VBScript создается с помощью функции
CreateObject, в JScript — с помощью конструкции new
ActiveXObject, в WSH — с помощью метода CreateObject
объекта wscript
Коллекция объектов SWbemNamedValue. В языке VBScript
создается с помощью функции CreateObject, в JScript —
с помощью конструкции new ActiveXObject, в WSH —
с помощью метода CreateObject объекта WScript
Используется для передачи дополнительной информации
при некоторых вызовах WMI. Этот объект не может быть
создан в сценарии напрямую с помощью CreateObject
ИЛИ GetObject
Содержит расширенную информацию о произошедшей
ошибке WMI. В языке VBScript создается с помощью
функции CreateObject, в JScript— с помощью конструкции
new ActiveXObject, в WSH— с помощью метода
CreateObject объекта WScript
Позволяет читать или записывать информацию об
установках безопасности для определенного объекта WMI.
Хранится в свойстве Security_ объектов SWbemLocator,
SWbemServices, SWbemObjectSet, SWbemObject,
SWbemObject Path, SWbemLastError, SWbemEventSource
Коллекция объектов swbemPrivilege. Хранится в
свойстве Privileges объекта WbemSecurity
SWbemPropertySet
SwbemProperty
SWbemQualifierSet
SWbemQualifier
SWbemObj ectPath
SWbemNamedVa1ueSet
SWbemNamedVa1ue
SWbemLastError
SWbemSecurity
SWbemPrivilegeSet
Таблица 5.1 (окончание)
Объект Описание
swbemPrivilege Позволяет установить или удалить привилегию,
необходимую для доступа к объекту WMI. Этот объект не может быть
создан в сценарии напрямую с помощью CreateObject
ИЛИ GetObject
swbemEventSource Соответствует событию WMI, которое задается с помощью
метода ExecNotif icationQuery объекта SWbemServices.
Этот объект не может быть создан в сценарии напрямую
с помощью CreateObject или GetObject
swbemsink Используется для получения результатов выполнения
асинхронных методов. В языке VBScript создается с
помощью функции CreateObject, в JScript — с помощью
конструкции new ActiveXObject, в WSH — с помощью
метода CreateObject объекта WScript
Соединение с подсистемой WMI
Первым шагом при работе с WMI из сценария является получение доступа
к подсистеме WMI на локальном или удаленном компьютере. Для этого
существуют два различных варианта: с использованием объекта swbemLocator
и с помощью так называемого WMI-моникера (WMI moniker) "winMgmts: \
Соединение с помощью объекта SWbemLocator
Объект swbemLocator позволяет установить соединение с определенным
пространством имен WMI на удаленном компьютере от имени заданной
учетной записи (на локальном компьютере соединение с WMI всегда
производится от имени текущей учетной записи). Использование этого объекта
бывает необходимо, если в сценарии нужно явно задать имя пользователя и
пароль для подключения к пространству имен WMI либо сценарий
используется внутри HTML-страницы.
Для создания объекта swbemLocator в сценарии VBScript нужно вызвать
функцию CreateObject() и указать в качестве ее аргумента программный
идентификатор WbemScripting.SWbemLocator, например:
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Единственный Имеющийся у SWbemLocator Метод ConnectServer ПОЗВОЛЯеТ
подключиться к службе WMI на указанном компьютере и получить ссылку
на соответствующий объект swbemServices. Имя компьютера, с которым
следует произвести соединение, указывается в качестве первого параметра
этого метода, а имя пространства имен WMI — в качестве второго. Напри-
мер, чтобы подключиться к пространству имен Root\ciMV2 на компьютере
Shikin, в сценарии следует выполнить следующие строки:
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer("Shikin", "Root\CIMV2")
При этом будет произведена попытка соединения от имени текущей
учетной записи. В качестве третьего и четвертого параметров метода
ConnectServer можно при необходимости указать имя пользователя и
пароль для связи с нужным пространством имен. Например, для подключения
к пространству имен Root\ciMV2 на компьютере Shikin от имени учетной
записи Popov домена Domain 1 с паролем My Password, в сценарии нужно
выполнить следующие строки:
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer("Shikin", "Root\CIMV2",
"DomainlXPopov", "MyPassword")
Естественно, можно не указывать явно пароль в тексте сценария, а вводить
его с клавиатуры в какую-либо переменную, которую затем подставить
в метод ConnectServer. Напомним, что для ввода строки с клавиатуры
в консольном режиме выполнения сценариев используются стандартные
входной и выходной потоки wscript.stdin и wscript.stdout, а в графиче-
ском режиме — функция inputBoxO языка VBScript (соответствующие
примеры описаны в главе 4). Кроме этого, в Windows XP и Windows
Server 2003 имеется объект scriptpw, позволяющий выполнять ввод текста
с клавиатуры в консольном режиме без дублирования вводимых символов
на экране. В листинге 5.1 приведен сценарий InputPassw.vbs (запускать этот
сценарий нужно обязательно с помощью cscript.exe), в котором запрашивается
Рис. 5.1. Результат выполнения сценария InputPassw.vbs
пароль пользователя и производится соединение со службой WMI на
удаленном компьютере с использованием этого пароля, после чего на экран
выводится описание роли компьютера в домене (рис. 5.1).
Как мы видим, сам введенный пароль на экране не отображается.
Листинг 5.1. Ввод пароля без отображения на экране для соединения с WMI
на удаленном компьютере
i •••*•*•••••••••••••••••
' Имя: InputPassw.vbs
' Язык: VBScript
' Описание: Ввод пароля без отображения на экране для соединения
' с WMI на удаленном компьютере
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim strUser ' Имя пользователя
Dim strPassw ' Пароль пользователя
Dim objPassw ' Объект ScriptPW
Dim objLocator ' Объект SWbemLocator
Dim objService ' Объект SWbemServices
Dim collnstances ' Коллекция экземпляров класса WMI
Dim objInstance ' Элемент коллекции
Dim strComputerRole ' Роль компьютера в домене
t ***•**•*•******••***•*•* Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "Shikin"
strNamespace = "Root\CIMV2"
strClass = "Win32_ComputerSystem"
strUser = "Shikin\404_Popov"
'Создаем объект ScriptPW
Set objPassw = CreateObject("ScriptPW.Password")
' Выводим подсказку для ввода пароля
WScript.StdOut.Write "Введите пароль для " & strUser & ": "
'Вводим пароль
strPassw = objPassw.GetPassword()
'Создаем объект SWbeinLocator
Set objLocator = CreateObject("WbemScripting.SWbeinLocator")
'Соединяемся с пространством имен WMI от имени заданной учетной записи
Set objService = objLocator.ConnectServer(strComputer, strNamespace,
s trUser, s trPas sw)
' Создаем коллекцию экземпляров класса Win32_ComputerSystem
Set collnstances = objService.InstancesOf(strClass)
' Перебираем элементы коллекции
For Each objInstance In collnstances
' Определяем описание роли
Select Case objInstance.DomainRole
Case 0
strComputerRole = "Standalone Workstation"
Case 1
strComputerRole = "Member Workstation"
Case 2
strComputerRole = "Standalone Server"
Case 3
strComputerRole = "Member Server"
Case 4
strComputerRole = "Backup Domain Controller"
Case 5
strComputerRole = "Primary Domain Controller"
End Select
' Выводим результат на экран
Wscript.Echo "Роль компьютера " & strComputer & ": " &
strComputerRole
Next
t ************************* Конец ***********************************
Соединение посредством моникера WMI
Альтернативным вариантом получения доступа к подсистеме WMI на
локальном или удаленном компьютере является использование WMI-
моникеров. Понятие моникер относится к СОМ-объектам, где под этим
термином понимается строка (отображаемое имя, display name), задающая
путь к объекту, экземпляр которого должен быть создан в клиентском
приложении. В контексте сценариев VBScript моникер WMI — это строка
определенной структуры, передаваемая в качестве параметра функции
Getobject, в результате выполнения которой возвращается ссылка на
определенный объект или конкретный экземпляр объекта библиотеки
поддержки сценариев WMI.
Например, можно задать WMI-моникер, извлекающий, как и при
использовании метода ConnectServer объекта SWbemLocator, ССЫЛКУ на объект
swbemservices. Можно построить моникер, обеспечивающий доступ к
объекту swbemobjectset, содержащему набор объектов WMI. Наконец, с
помощью моникера можно получить ссылку на конкретный экземпляр объекта
SWbemObject.
Такая гибкость делает WMI-моникеры очень полезными для упрощения
структуры сценария, однако следует иметь в виду следующие ограничения
при работе с моникерами:
□ WMI-моникеры по соображениям безопасности нельзя использовать
внутри сценариев, встроенных в HTML-страницы;
□ обращение к подсистеме WMI с помощью моникеров происходит всегда
от имени текущей учетной записи, т. е. здесь нельзя явно указать имя
пользователя и пароль, как это было возможно при использовании
метода ConnectServer объекта SWbemLocator.
Формат строки WMI-моникера похож на стандартный путь к объектам
WMI. При этом моникеры могут состоять из трех частей:
□ Обязательный префикс "WinMgmts: ";
□ необязательные параметры, определяющие настройки безопасности при
работе с WMI ;
□ необязательный путь к нужному объекту WMI.
Рассмотрим каждую из частей моникера более подробно.
Префикс "WinMgmts:"
Все моникеры WMI должны начинаться со строки "WinMgmts:", причем
регистр символов здесь неважен, т. е. в сценарии можно писать "winmgmts:",
"winmgmts:" и т. д. Самый простой WMI-моникер совпадает
с этой строкой, позволяя получить доступ к пространству имен по умолчанию
на локальном компьютере (как правило, таким пространством является
Root\CIMV2):
Sem objService = GetObject("WinMgmts:")
В переменной obj service после выполнения этой строки сценария будет
храниться ссылка на объект swbemservices, причем методы объекта swbem-
services можно вызывать в той же строке, в которой записан моникер,
например:
Sem colProcess = GetObject("WinMgmts:").InstancesOf("Win32_Process")
Естественно, того же результата (формирование коллекции всех запущенных
в системе процессов), можно добиться с помощью двух строк:
Sem objService = GetObject("WinMgmts:")
Sem colProcess = objService.InstancesOf("Win32_Process")
Если перед нами стоит задача перебора коллекции, построенной с помощью
WMI-моникера, то функцию GetObject о можно использовать внутри цикла
For Each ... in. Например, для вывода на экран названий всех процессов,
запущенных в системе, достаточно выполнить сценарий, состоящий всего
из трех строк:
For Each objProcess In
GetObject ("WinMgmts:").InstancesOf("Win32_Process")
WScript.Echo obj Process.Name
Next
Ре;ШКМф p»'i'ri|i.i
: - x
Рис. 5.2. Раздел реестра hkey_classes_root\winmgmts
Связь WMI-моникера "winMgmts:" с библиотекой поддержки сценариев
WMI осуществляется с помощью раздела hkey_classes_root\winmgmts,
в подразделе clsid которого записан идентификатор, указывающий, в свою
очередь, на раздел hkey_classes_root\clsid\{172bddf8-ceea-hdi-8b05-
00600806D9B6} (рис. 5.2).
Раздел Же HKEY_CLASSES_ROOT\CLSID\{172BDDF8-CEEA-11D1-8B05-00600806D9B6>
содержит подраздел inProcserver32, значением которого по умолчанию
является полный путь к файлу wbemdisp.dll, содержащему библиотеку
поддержки сценариев WMI и реализующему объект swbemservices.
Настройки безопасности в моникере
После префикса "WinMgmts:" в моникере WMI можно указать следующие
параметры безопасности, которые будут применяться при работе с
подсистемой WMI:
□ уровень олицетворения DCOM (DCOM Impersonation Level), например,
"WinMgmts:{impersonationLevel=Impersonate}"J
□ уровень проверки подлинности DCOM (DCOM Authentication Level),
например, "WinMgmts:{authenticationLevel=pktPrivacy}";
□ источник проверки подлинности (Authority), например,
"WinMgmts: {author ity=NTLMDoma in : Domainl} "',
П назначенные или отозванные привилегии, например,
"WinMgmts:{(Shutdown, 'RemoteShutdown)}".
( Замечание )
Смысл и значение параметров, задающих уровень олицетворения и проверки
подлинности DCOM, был объяснен ранее в разделе "Безопасность при работе
с WMI" главы 1.
Параметр authority определяет протокол безопасности (NT LAN
Manager — NTLM, или Kerberos), который будет использоваться WMI при
выполнении проверки подлинности. В случае NTLM в качестве значения
параметра authority задается ключевое слово NTLMDomain и имя нужного
домена, например:
"WinMgmts:{authority=NTLMDomain:Domainl}"
Для перехода к Kerberos в моникере указыватся ключевое слово Kerberos и
путь к нужному серверу, например:
"WinMgmts:{authority=Kerberos:Domainl\Serverl}"
( Замечание )
Параметр authority нельзя указывать в WMI-моникерах, устанавливающих
связь с подсистемой WMI на локальном компьютере
Последняя составная часть параметров безопасности в строке WMI-
моникера позволяет назначать и отменять привилегии, необходимые для
выполнения определенных задач (например, для удаленного выключения
рабочей станции). Для того чтобы назначить ту или иную привилегию
сценарию, нужно указать имя этой привилегии в списке. Для отмены
привилегии перед ее именем ставится восклицательный знак (!). С помощью мони-
кера WMI можно назначить или отменить следующие привилегии:
CreateToken, PrimaryToken, LockMemory, IncreaseQuota, MachineAccount,
Tcb, Security, TakeOwnership, LoadDriver, SystemProfile, SystemTime,
Prof ileSingleProcess, IncreaseBasePriority, CreatePagef ile, CreatePermanent,
Backup, Restore, ShutDown, Debug, Audit, SystemEnvironment, ChangeNotify,
RemoteShutDown, Udock, SyncAgent И EnableDelegation.
Все параметры безопасности в строке WMI-моникера следуют
непосредственно за префиксом "winMgmts:" и заключаются в фигурные скобки.
Несколько параметров следует разделять запятыми, например:
"WinMgmts:{impersonationLevel=Impersonate/ authenticationLevel=
pktPrivacy,authority=NTLMDomain:Domainl}"
Назначаемые или отменяемые привилегии заключаются в дополнительные
круглые скобки и отделяются друг от друга запятыми, например:
"WinMgmts:{impersonationLevel=Impersonate/ authenticationLevel=
pktPrivacy, (Shutdown, 'RemoteShutdown)}"
Путь к объекту WMI в моникере
Напомним сначала, что любой класс или экземпляр класса WMI
определяется путем к объекту WMI, который может состоять из сетевого имени
компьютера, имени пространства имен, имени класса и набора ключевых
свойств объекта вместе с их значениями (см. раздел "Путь к классам и
объектам СШ" главы 1).
Для получения с помощью моникера WMI ссылки на нужный объект WMI,
нужно в качестве третьего параметра WMI-моникера указать путь к данному
объекту. При этом формат строки моникера зависит от наличия в ней
параметров безопасности.
Если параметры безопасности указаны, то путь к объекту следует за
закрывающей скобкой параметров безопасности и отделяется от нее
восклицательным знаком. Например, следующий моникер будет в сценарии
определять путь к экземпляру класса win32_service, у которого в ключевом
свойстве Name записана строка Alerter и который расположен в
пространстве cimv2 на компьютере с именем shikin:
"WinMgmts:{impersonationLevel=Impersonate}'\\Shikin\Root\CIMV2:Win32
_Service.Name='Alerter'"
Если же параметры безопасности в моникере опущены, то путь к объекту
записывается после двоеточия в префиксе "WinMgmts:" без
восклицательного знака:
"WinMgmts:\\Shikin\Root\CIMV2:Win32_Service.Name='Alerter'"
( Замечание }
Для правильной идентификации объектов в пути к ним должны указываться
имена и значения ключевых свойств (например, в классе win32_Service
таковым является свойство Name, а в классе win32_Process — свойство Handle).
Для того чтобы узнать, какое свойство у класса является ключевым, можно
воспользоваться тестером WMI (wbemtest.exe) или утилитой WMI CIM Studio.
В принципе, в WMI-моникере можно указывать не полный путь к объекту,
а ЛИШЬ Нужные фрагменты, например "WinMgmts:\Root\CIMV2",
"WinMgmts :\\shikin" и т. п. При этом если опущено имя компьютера или
вместо него стоит точка (.), то будет производиться обращение к подсистеме
WMI локального компьютера. Если опущено пространство имен, то WMI
будет работать с пространством имен по умолчанию, которое извлекается из
Подраздела HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\WBEM\Scripting\
Default Namespace системного реестра рабочей станции, к которой
производится обращение.
( Замечание ^
Рекомендуется в WMI-моникере всегда явно указывать нужное пространство
имен WMI, не полагаясь на значение, которое хранится в реестре.
Практически во всех приведенных далее сценариях соединение с
подсистемой WMI будет ПРОИЗВОДИТЬСЯ С ПОМОЩЬЮ МОНИКера "WinMgmts: ".
Основные типы сценариев WMI
Здесь мы рассмотрим простые примеры, которые иллюстрируют основные
типы сценариев, применяемых при практической работе с WMI:
□ получение экземпляров управляемых ресурсов (объектов WMI);
□ чтение значений свойств объекта WMI;
□ изменение значений свойств объекта WMI;
□ вызов метода объекта WMI;
□ создание нового экземпляра управляемого ресурса;
□ удаление экземпляра управляемого ресурса;
□ создание временных потребителей событий WMI;
□ создание постоянных потребителей событий WMI.
Приведенные сценарии можно использовать в качестве шаблона для
составления других сценариев, т. к. обычно достаточно просто поменять имена
классов, свойств и методов WMI, чтобы получить сценарий, который
пригодится в практической деятельности конкретного администратора Windows.
Прежде чем приступить к изучению примеров сценариев, рассмотрим
возможные режимы выполнения операций над объектами WMI.
Синхронный, полусинхронный
и асинхронный режимы выполнения методов WMI
Большинство операций в сценариях WMI можно выполнять в трех
различных режимах: синхронном, полусинхронном или асинхронном.
При запуске метода в синхронном режиме выполнение сценария
приостанавливается до тех пор, пока этот метод не будет полностью выполнен. Все
данные (например, результат выполнения WQL-запроса), которые WMI при
этом динамически формирует или извлекает из CIM, накапливаются в
оперативной памяти и передаются в сценарий целиком. Другими словами, пока
в памяти не сформируется полностью весь блок данных (например;
коллекция swbemobjectset), выполнение сценария приостанавливается. Ясно, что
выполнение в синхронном режиме таких длительных и возвращающих
большой объем информации операций, как, скажем, извлечение всех строк
из журнала операций Windows, может значительно снизить
производительность запущенного сценария и всей операционной системы в целом.
Поэтому в синхронном режиме рекомендуется выполнять лишь те методы,
которые не возвращают больших объемов данных (например, создание или
удаление объектов).
В асинхронном режиме, в отличие от синхронного, после вызова метода
управление сразу передается обратно в сценарий, который продолжает свою
работу. Для использования в сценарии асинхронных методов нужно
создавать специальный объект swbemsink и обрабатывать события, возникающие
в этом объекте при выполнении и завершении асинхронной операции.
Подробнее этот процесс рассмотрен далее при описании асинхронного режима
получения экземпляров управляемого ресурса WMI.
Для большинства операций, выполняемых в сценариях WMI, наиболее
предпочтительным является полусинхронный режим выполнения, который,
с одной стороны, обеспечивает лучшую производительность, чем синхронный,
а с другой стороны, реализуется проще, чем асинхронный, не требуя
использования дополнительных объектов и обработки событий. В
полусинхронном режиме после вызова метода управление сразу возвращается в
сценарий, который продолжает выполняться, т. е. можно начать работать
с возвращаемыми данными, не дожидаясь полного завершения их
формирования. Однако и при выполнении полусинхронных методов могут возникнуть
проблемы с производительностью, которые связаны с расходованием памяти
при формировании больших коллекций объектов в результате выполнения
WQL-запросов (например, при выборке всех записей из журнала событий
Windows), т. к. по умолчанию для каждого экземпляра управляемого ресурса
в памяти создается объект swbemobject. Для решения этой проблемы
полусинхронные методы Следует ВЫПОЛНЯТЬ С параметром WbemFlagForwardOnly,
который указывает на то, что возвращаемые коллекции объектов
swbemobjectset будут поддерживать только навигацию вперед. При
перемещении в такой коллекции к следующему элементу происходит автоматическое
удаление из памяти предыдущего элемента, что и является решением проблемы
хранения больших коллекций swbemobjectset в оперативной памяти.
Получение экземпляров управляемых ресурсов
Из сценария WMI доступ к отдельному экземпляру управляемого ресурса
(объект swbemobject) или к коллекции таких экземпляров (объект
swbemobjectset) можно получить несколькими способами с помощью
различных методов (синхронных, полусинхронных или асинхронных) объекта
swbemservices, а также с помощью моникера WMI (примеры составления
WMI-моникеров были приведены ранее и здесь рассматриваться не будут).
В листингах 5.2 и 5.9 приведены сценарии, в которых создается объект
swbemoject для процесса с заданным идентификатором, а в листингах 5.3—5.8,
5.10—5.12— Сценарии, В КОТОРЫХ формируется КОЛЛеКЦИЯ SWbemOjectSet,
каждый элемент которой (объект swbemobject) соответствует процессу,
запущенному в системе. На экран выводится информация о процессах,
имеющих приоритет больше 10 (рис. 5.3).
Рис. 5.3. Список процессов, имеющих приоритет больше 10
Синхронный режим получения экземпляров
Получить экземпляры управляемых ресурсов в синхронном режиме
позволяют меТОДЫ Get, ExecQuery И InstancesOf объекта SWbemServices, а также
метод Instances, объекта SWbemObject.
Метод SWbemServices.Get
Для получения доступа к экземпляру управляемого ресурса с помощью
метода SWbemServices.Get (листинг 5.2), нужно в качестве параметра этого
метода указать строку с путем к нужному экземпляру (напомним, что путь
к объекту WMI задается путем перечисления значений ключевых свойств
соответствующего класса WMI).
Листинг 5.2. Получение экземпляра управляемого ресурса с помощью метода
SWbemServices.Get (синхронный режим)
**************************************************
* Имя: Process_Get.vbs
1 Язык: VBScript
1 Описание: Получение экземпляра класса с помощью Get
' (синхронный режим получения экземпляров)
■****************************************^
Option Explicit
On Error Resume Next
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass * Имя класса
Dim objService * Объект SWbemServices
Dim colProcess ' Коллекция экземпляров класса WMI
Dim objProcess ' Элемент коллекции
Dim strHandle ' Идентификатор процесса
Dim strResult ' Результат запроса
»********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2n
strClass = "Win32_Process"
strHandle ="492"
strResult = "Процесс с идентификатором Handle = " &_
strHandle & VbCrLf
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & strComputer & _
" \" & strNamespace)
' Получаем указатель на объект
Set objProcess = objService.Get("Win32_Process.Handle=" & strHandle)
1 Обрабатываем ошибки
If Err.Number <> 0 then
1 Выводим сообщение об ошибке
strResult = "Ошибка при обращении к процессу с идентификатором " &_
"Handle = " & strHandle
1 Очищаем свойства объекта Err
Err.Clear
Else
1 Формируем строку для вывода на экран
strResult = strResult & "Идентификатор процесса : " &
objProcess .Processld & _
VbCrLf & "Имя процесса : " & objProcess.Name & VbCrLf &_
"Приоритет : " & objProcess.Priority
End If
1 Вывод на экран
WScript.Echo strResult
»************************* Коней ***********************************
Метод SWbemServices.ExecQuery
Метод ExecQuery объекта swbemservices позволяет использовать для отбора
экземпляров управляемых ресурсов значения любых свойств
соответствующего класса WMI, а не только ключевых, как это было в случае метода Get.
В сценарии ProcessList_ExecQuery.vbs (листинг 5.3) при выполнении
соответствующего WQL-запроса с помощью метода ExecQuery формируется
коллекция экземпляров класса Win32_Process.
Листинг 5.3. Получение экземпляров управляемых ресурсов с помощью
метода swbamServicee. ExecQuery (синхронный режим)
• *************************************************
1 Имя: ProcessList_ExecQuery.vbs
' Язык: VBScript
1 Описание: Создание коллекции экземпляров с помощью ExecQuery
1 (синхронный режим получения экземпляров)
I*******************************************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemServices
Dim colProcess ' Коллекция экземпляров класса WMI
Dim objProcess ' Элемент коллекции
Dim strResult ' Результат запроса
»********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Список процессов, у которых приоритет больше 10 :" & VbCrLf
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace)
' Создаем коллекцию
Set colProcess = objService.ExecQuery("Select * from Win32_Process " &_
"Where Priority > '10'")
1 Перебираем элементы коллекции
For Each objProcess In colProcess
1 Формируем строку для вывода
strResult = strResult & "Имя процесса: " & objProcess.Name & vbtab &_
"Приоритет: " & objProcess.Priority & VbCrLf
Next
' Вывод на экран
WScript.Echo strResult
»************************* Конец ***********************************
Метод SWbemServices.InstancesOf
В сценарии ProcessList_InstancesOf.vbs (листинг 5.4) объект swbemobjectset,
содержащий экземпляры класса win3 2_Process, строится с помощью метода
InstancesOf объекта SWbemServices, КОТОРЫЙ ВОЗВращает КОЛЛекцИЮ Всех
экземпляров заданного класса.
Листинг 5.4. Получение экземпляров управляемых ресурсов с помощью
метода swbemServicea.InetoncasOf (синхронный режим)
1 Имя: ProcessList_InstancesOf.vbs
1 Язык: VBScript
1 Описание: Создание коллекции экземпляров с помощью InstancesOf
1 (синхронный режим получения экземпляров)
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objService ' Объект SWbemService
Dim colProcess ' Коллекция экземпляров класса WMI
Dim objProcess ' Элемент коллекции
Dim strResult ' Результат запроса
»********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
strResult = "Список процессов, у которых приоритет больше 10 :" & VbCrLf
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace)
1 Создаем коллекцию экземпляров класса
Set colProcess = objService.InstancesOf(strClass)
1 Перебираем элементы коллекции
For Each objProcess In colProcess
1 Проверяем свойство класса Priority
If objProcess.Priority > 10 then
1 Формируем строку для вывода
strResult = strResult & "Имя процесса: " & objProcess.Name & vbtab &_
"Приоритет: " & objProcess.Priority & VbCrLf
End If
Next
1 Выводим результат на экран
WScript.Echo strResult
t************************* Конец ***********************************
Метод SWbemObjectlnstances_
В сценарии ProcessList_Instances_.vbs (листинг 5.5) объект swbemobjectset,
содержащий экземпляры класса win32_process, строится с помощью метода
instances, объекта swbemobject, который возвращает коллекцию всех
экземпляров соответствующего класса.
Листинг 5.5. Получение экземпляров управляемых ресурсов с помощью
метода SWbemObject. instancee (синхронный режим)
I*******************************************************************
1 Имя: ProcessList_Instances_.vbs
' Язык: VBScript
1 Описание: Создание коллекции экземпляров с помощью Instances_
1 (синхронный режим получения экземпляров)
i*******************************************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colProcess ' Коллекция экземпляров класса WMI
Dim objProcess ' Элемент коллекции
Dim strResult ' Результат запроса
»********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer =
strNamespace = "Root\CIMV2"
strClass = "Win32 Process"
strResult = "Список процессов, у которых приоритет больше 10 :" & VbCrLf
1 Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace & ": " & strClass)
1 Создаем коллекцию экземпляров класса
Set colProcess = objClass.Instances_()
1 Перебираем элементы коллекции
For Each objProcess In colProcess
1 Проверяем свойство класса Priority
If objProcess.Priority > 10 Then
1 Формируем строку для вывода
strResult = strResult & "Имя процесса: " & objProcess.Name & vbtab &_
"Приоритет: " & objProcess.Priority & VbCrLf
End If
Next
' Выводим результат на экран
Wscript.Echo strResult
• ************************* Коней ***********************************
Полусинхронный режим получения экземпляров
Для формирования коллекции экземпляров управляемого ресурса в
полусинхронном режиме Применяются Те же МеТОДЫ Get, ExecQuery И
InstancesOf объекта SWbemServices И метод Instances. объекта
swbemobject, что и в синхронном режиме, однако во всех этих методах
нужно указывать дополнительный числовой параметр, значение которого
равно сумме КОНСТанТ wbemFlagForwardOnly И wbemFlagReturnlmmediately.
Соответствующие примеры сценариев приведены в листингах 5.6—5.8.
Листинг 5.6. Получение экземпляров управляемых ресурсов с помощью
метода SWbexnServicee.ExecQuery (полусинхронный режим)
i***************************^
1 Имя: Semisync_ProcessList_ExecQuery.vbs
1 Язык: VBScript
1 Описание: Создание коллекции экземпляров с помощью ExecQuery
1 (полусинхронный режим получения экземпляров)
i**********************^
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim colProcess ' Коллекция экземпляров класса WMI
Dim objProcess ' Элемент коллекции
Dim strResult ' Результат запроса
1 Объявляем константы
Const wbemFlagForwardOnly =32
Const wbemFlagReturnlmmediately = 16
»********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Список процессов, у которых приоритет больше 10 :" & VbCrLf
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace)
1 Создаем коллекцию объектов класса Win32_Process
Set colProcess = objService.ExecQuery("Select * from Win32_Process " &_
"Where Priority > '10'",,_
wbemFlagReturnlmmediately _
+ wbemFlagReturnlmmediately)
1 Перебираем элементы коллекции
For Each objProcess In colProcess
1 Формируем строку для вывода
strResult = strResult & "Имя процесса: " & objProcess.Name & vbtab &_
"Приоритет: " & objProcess.Priority & VbCrLf
Next
1 Выводим результат на экран
WScript.Echo strResult
• ************************* Коней ***********************************
Листинг 5.7. Получение экземпляров управляемых ресурсов с помощью
метода SWbemS«rvice«.instanceeof (полусинхронный режим)
•••••••••••••••••••••••••••••••••••••••••••••••••••••••
1 Имя: Semisync_ProcessList_InstancesOf.vbs
1 Язык: VBScript
' Описание: Создание коллекции экземпляров с помощью InstancesOf
' (полусинхронный режим получения экземпляров)
••••••••••••••••••••••••••••••••••••••••*••••••
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objService ' Объект SWbemService
Dim colProcess f Коллекция экземпляров класса WMI
Dim objProcess ' Элемент коллекции
Dim strResult f Результат запроса
1 Объявляем константы
Const wbemFlagForwardOnly =32
Const wbemFlagReturnlmmediately = 16
i ••••••••****•*••••*••• Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
strResult = "Список процессов, у которых приоритет больше 10 :" & VbCrLf
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace)
1 Создаем коллекцию экземпляров класса
Set colProcess = objService.InstancesOf(strClass,_
wbemFlagReturnlmmediately + wbemFlagReturnlmmediately)
1 Перебираем элементы коллекции
For Each objProcess In colProcess
1 Проверяем свойство класса Priority
If objProcess.Priority > 10 then
1 Формируем строку для вывода
strResult = strResult & "Имя процесса: " & objProcess.Name & vbtab &_
"Приоритет: " & objProcess.Priority & VbCrLf
End If
Next
1 Выводим результат на экран
WScript.Echo strResult
»•****••*•••**•*••**•*•**• конец ***********************************
!••••••••••••••••••••••••••••••••••
1 Имя: Semisync_ProcessList_Instance_.vbs
1 Язык: VBScript
1 Описание: Создание коллекции экземпляров с помощью Instances_
1 (полусинхронный режим получения экземпляров)
•••••••••••••••••••••••^
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colProcess ' Коллекция экземпляров класса WMI
Dim obj Process ' Элемент коллекции
Dim strResult ' Результат запроса
1 Объявляем константы
Const wbemFlagForwardOnly = 32
Const wbemFlagReturnlmmediately =16
i********************** начало *************************************
1 Присваиваем начальные значения переменным
Листинг 5.8. Получение экземпляров управляемых ресурсов с помощью
метода swbemob j ее t. instance в _ (полусинхронный режим)
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
strResult = "Список процессов, у которых приоритет больше 10 :" & VbCrLf
1 Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
1 Создаем коллекцию экземпляров класса
Set colProcess = objClass.Instances_( wbemFlagReturnlmmediately _
+ wbemFlagReturnlmmediately)
1 Перебираем элементы коллекции
For Each objProcess In colProcess
1 Проверяем свойство класса Priority
If objProcess.Priority > 10 Then
1 Формируем строку для вывода
strResult = strResult & "Имя процесса: " & objProcess.Name & vbtab &_
"Приоритет: " & objProcess.Priority & VbCrLf
End If
Next
1 Вывод на экран
WScript.Echo strResult
i ••••*********•****•***•*••** Конец ***********************************
Асинхронный режим получения экземпляров
Получить экземпляры управляемых ресурсов в асинхронном режиме
позволяют методы GetAsync, ExecQueryAsync И InstancesOfAsync объекта SWbem-
Services, а также метод InstancesAsync_ объекта SWbemObject. В любом
случае для работы с асинхронными методами в сценарии нужно создать
объект SWbemSink:
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink","Sink_")
Созданная таким образом переменная, содержащая ссылку на объект
swbemsink, должна быть затем указана в качестве параметра асинхронного
метода, например:
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace)
1 Выполняем метод ExecQueryAsync
objService.ExecQueryAsync objSink, "Select * from Win32_Process Where
Priority > '10'"
Параметр sink_ при создании объекта swbemsink означает, что названия
процедур-обработчиков событий, возникающих в объекте swbemsink, будут
начинаться с префикса sink_, например:
1 Процедура-обработчик события OnObjectReady объекта SWbemSink
Sub Sink_OnObj ectReady(obj Process, objAsyncContext)
' Формируем строку для вывода
strResult = strResult & "Имя процесса: " & objProcess.Name & vbtab &_
"Приоритет: " & objProcess.Priority & VbCrLf
End Sub
В процедуру sink_onObjectReady управление будет передано при
возникновении события OnObjectReady, которое происходит, когда в памяти
формируется один экземпляр объекта swbemobject. Также в сценарии нужно
обрабатывать событие oncompleted объекта swbemsink, которое возникает после
полного завершения асинхронной операции.
Метод SWbemServices.GetAsync
В сценарии Async_Process_Get.vbs, описанном в листинге 5.9, экземпляр
класса win32_Process извлекается с помощью метода GetAsync объекта
SWbemServices.
Листинг 5.9. Получение экземпляра управляемого ресурса с помощью метода
SWbemServicee.GetAeync (асинхронный режим)
•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
1 Имя: Async_Process_Get.vbs
1 Язык: VBScript
1 Описание: Получение экземпляра класса с помощью GetAsync
1 (асинхронный режим получения экземпляров)
i*************************************************••••••••••••••••••
Option Explicit
On Error Resume Next
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass f Имя класса
Dim objService ' Объект SWbemServices
Dim colProcess ' Коллекция экземпляров класса WMI
Dim objProcess ' Элемент коллекции
Dim strHandle • Идентификатор (handle) процесса
Dim strResult ' Результат запроса
Dim objSink ' Объект SWbemSink
Dim bdone ' Переменная для организации цикла
»•****••*••••••*•*••*••**•• Начало *************************************
1 Присваиваем начальные значения переменным
strComputer =
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
strHandle ="1452"
strResult = "Процесс с идентификатором Handle = " &_
strHandle & VbCrLf
bdone = false
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & strComputer &_
"\" & strNamespace)
• Создаем объект SWbemSink
Set obj Sink = WScript.CreateObj ect("WbemS crip ting.SWbemSink","Sink_")
1 Выполняем метод GetAsync
objService.GetAsync objSink, "Win32_Process.Handle=" & strHandle
• Обрабатываем ошибки
If Err.Number <> 0 Then
1 Выводим сообщение об ошибке
strResult = "Ошибка при обращении к процессу с идентификатором " &_
" Handle = " & strHandle
1 Очищаем свойства объекта Err
Err.Clear
Else
1 Приостанавливаем сценарий до завершения выполнения запроса
While Not bdone
WScript.Sleep 1000
Wend
End If
1 Процедура-обработчик события OnObjectReady объекта SWbemSink
Sub Sink_OnObjееtReady(objProcess, objAsyncContext)
1 Формируем строку для вывода на экран
strResult = strResult & "Идентификатор процесса : " &
objProcess. Processld & VbCrLf &_
"Имя процесса : " & objProcess.Name & VbCrLf &_
"Приоритет : " & objProcess.Priority & VbCr
End Sub
' Процедура-обработчик события OnCompleted объекта SWbemSink
Sub Sink_OnCompleted(iHResult, objErrorObject, objAsyncContext)
1 Вывод на экран
WScript.Echo strResult
1 Изменяем значение bdone для выхода из цикла
bdone = true
End Sub
i ************************* конец ***********************************
Метод SWbemServices.ExecQueryAsync
В сценарии Async_ProcessList_ExecQuery.vbs (листинг 5.10) с помощью
метода ExecQueryAsync объекта swbemservices извлекаются экземпляры класса
win32_Process, которые возвращаются в результате выполнения
соответствующего WQL-запроса.
Листинг 5.10. Получение экземпляров управляемых ресурсов с помощью
метода SWbemServiceB.ExecQueryAeync (асинхронный режим)
••*••••*•**•**••••••*•*••••••••••••••••••••••••^
1 Имя: Async_ProcessL.ist_ExecQuery.vbs
1 Язык: VBScript
1 Описание: Создание коллекции экземпляров с помощью ExecQueryAsync
1 (асинхронный режим получения экземпляров)
i ••••••••••••••••••••••••••••••••••••••••••••••••••••••*••••*••••••*
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace f Имя пространства имен
Dim objService ' Объект SWbemServices
Dim colProcess ' Коллекция экземпляров класса WMI
Dim objProcess f Элемент коллекции
Dim strResult f Результат запроса
Dim obj Sink ' Объект SWbemSink
Dim bdone ' Переменная для организации цикла
»*****•*•***•••••*•*••* Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Список процессов, у которых приоритет больше 10 :" & VbCrLf
bdone = false
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace)
1 Создаем объект SWbemSink
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink","Sink_")
1 Выполняем метод ExecQueryAsync
objService.ExecQueryAsync objSink, "Select * from Win32_Process Where
Priority > '10 *"
1 Приостанавливаем сценарий до завершения выполнения запроса
While Not bdone
WScript.sleep 1000
Wend
1 Процедура-обработчик события OnObjectReady объекта SWbemSink
Sub Sink_OnObjееtReady(objProcess, objAsyncContext)
1 Формируем строку для вывода
strResult = strResult & "Имя процесса: " & objProcess.Name & vbtab &_
"Приоритет: " & objProcess.Priority & VbCrLf
End Sub
1 Процедура-обработчик события OnCompleted объекта SWbemSink
Sub Sink_OnCompleted(iHResult, objErrorObject, objAsyncContext)
1 Выводим результирующую строку на экран
WScript.Echo strResult
1 Изменяем значение bdone для выхода из цикла
bdone = true
End Sub
i•••••••••••••••••••••*••• коней ***********************************
Метод SWbemServices.lnstancesOfAsync
В сценарии Async_ProcessList_InstancesOf.vbs (листинг 5.11) с помощью
метода instancesOfAsync объекта swbemservices извлекаются все
экземпляры класса Win32_Process.
^•••••••••••••••••••^
1 Имя: Async_ProcessList_InstancesOf.vbs
1 Язык: VBScript
1 Описание: Создание коллекции экземпляров с помощью InstancesOfAsync
1 (асинхронный режим получения экземпляров)
i ••*••••••••••••••••••••••••*•••••••••••••**•*••••*••••••
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim obj Service ' Объект SWbemService
Dim colProcess ' Коллекция экземпляров класса WMI
Dim objProcess f Элемент коллекции
Dim strResult ' Результат запроса
Dim objSink ' Объект SWbemSink
Dim bdone ' Переменная для организации цикла
i •••*•*•*••*•*•*****•** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32 Process"
Листинг 5.11. Получение экземпляров управляемых ресурсов с помощью
метода SWbemServices. InstancesOf Async (асинхронный режим)
strResult = "Список процессов, у которых приоритет больше 10 : " & VbCrLf
bdone = false
' Подключаемся к пространству имен WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace)
• Создаем объект SWbemSink
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink","Sink_")
1 Выполняем метод InstancesOfAsync
objClass.InstancesOfAsync objSink, strClass
1 Приостанавливаем сценарий до завершения выполнения запроса
While Not bdone
wscript.sleep 1000
Wend
1 Процедура-обработчик события OnObjectReady объекта SWbemSink
Sub Sink_OnObjееtReady(objProcess, objAsyncContext)
If objProcess.Priority > 10 Then
1 Формируем строку для вывода
strResult = strResult & "Имя процесса: " & objProcess.Name & vbtab &
"Приоритет: " & objProcess.Priority & VbCrLf
End If
End Sub
1 Процедура-обработчик события OnCompleted объекта SWbemSink
Sub SinkjOnCompletedUHResult, objErrorObject, objAsyncContext)
1 Вывод на экран
WScript.Echo strResult
1 Изменяем значение bdone для выхода из цикла
bdone = true
End Sub
i ••••••••••••••••••••••••• Коней ***********************************
Метод SWbemObject.lnstancesAsync_
Сценарий Async_ProcessList_Instances_.vbs (листинг 5.12) показывает, как
можно в асинхронном режиме извлечь все экземпляры класса
Win32_Process С ПОМОЩЬЮ метода InstancesAsync_ объекта SWbemObject.
Листинг 5.12. Получение экземпляров управляемых ресурсов с помощью
метода swbemobject. inetancesAeync (асинхронный режим)
I••••••••••••••*••••••••••••••••••••••••••••••••••••••••••••••••••••
1 Имя: Async_ProcessList_Instances_.vbs
1 Язык: VBScript
1 Описание: Создание коллекции экземпляров с помощью InstancesAsync_
1 (асинхронный режим получения экземпляров)
!•••••••••••••••••••••
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colProcess ' Коллекция экземпляров класса WMI
Dim objProcess f Элемент коллекции
Dim strResult ' Результат запроса
Dim obj Sink ' Объект SWbemSink
Dim bdone ' Переменная для организации цикла
i*•••*•***•*•••*•••••*• Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
strResult = "Список процессов, у которых приоритет больше 10 :" & VbCrLf
bdone = false
1 Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
' Создаем объект SWbemSink
Set objSink = WScript.CreateObject ("WbemScripting.SWbemSink", "Sink_")
' Выполняем метод InstancesAsync_
objClass.InstancesAsync_ objSink
' Приостанавливаем сценарий до завершения выполнения запроса
While Not bdone
WScript.sleep 1000
Wend
' Процедура-обработчик события OnObjectReady объекта SWbemSink
Sub Sink_OnObj ectReady(obj Process, objAsyncContext)
If objProcess.Priority > 10 then
' Формируем строку для вывода
strResult = strResult & "Имя процесса: " & objProcess.Name & vbtab &_
"Приоритет: " & objProcess.Priority & VbCrLf
End If
End Sub
' Процедура-обработчик события OnCompleted объекта SWbemSink
Sub Sink__OnCompleted(iHResult, obj Err or Object, obj AsyncContext)
' Вьюод на экран
WScript.Echo strResult
' Изменяем значение bdone для выхода из цикла
bdone = true
End Sub
»•••*****•************•••* Коней ******************************+****
Чтение свойств объекта WMI
После того как в сценарии создан объект swbemobject, соответствующий
какому-либо управляемому ресурсу, чаще всего требуется прочитать и
вывести на экран значения всех или некоторых свойств этого объекта.
Напомним, что наличие у объекта swbemobject тех или иных свойств зависит от
того, какому именно управляемому ресурсу соответствует этот объект.
Естественно, для того чтобы обратиться к определенному свойству управляемого
ресурса, нужно знать точное название этого свойства (см. листинг 5.13),
однако если требуется извлечь значения всех свойств, то можно даже не
задумываться об их именах (см. листинг 5.14).
Чтение определенных свойств с известными именами
Сценарий Read Properties, vbs, представленный в листинге 5.13, выводит на
Экран Значения некоторых СВОЙСТВ Экземпляра Класса Win32_LogicalDisk,
соответствующего логическому диску D (рис. 5.4).
Рис. 5.4. Некоторые свойства логического диска D
Листинг 5.13. Чтение заданных свойств объекта WMI
••••••••••••••••••••••••••••••***^
' Имя: ReadProperties.vbs
' Язык: VBScript
1 Описание: Чтение свойств объекта с известными именами
■••••*••••*••*••••*••••••*•••••*•••••••**•••••
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemServices
Dim colDisks ' Коллекция экземпляров класса WMI
Dim objDisks ' Элемент коллекции
Dim strResult ' Результат запроса
«•*••****••*•**•••*••*•••* Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace)
' Создаем коллекцию экземпляров класса Win32_LogicalDisk
Set colDisks = objService.ExecQuery( "Select * from Win32_LogicalDisk " &_
"Where DevicelD = 'D:' ")
' Перебираем элементы коллекции
For Each objDisks In colDisks
' Формируем строку вывода
strResult = strResult & "Свойства диска D: " & VbCrLf &_
" Name = " & objDisks.Name & VbCrLf &_
" Caption = " & objDisks.VolumeName & VbCrLf &_
" Description = " & objDisks.Description & VbCrLf &_
" FileSystem = " & objDisks.FileSystem & VbCrLf &_
11 Size = " & objDisks.Size & VbCrLf &_
" FreeSpace = " & objDisks.FreeSpace & VbCrLf &_
" VolumeName = " & objDisks.VolumeName & VbCrLf &_
" VolumeSerialNumber = " & objDisks.VolumeSerialNumber
Next
' Вывод на экран
WScript.Echo strResult
••*************•••*••••••* Конец ***********************************
Чтение всех свойств
(коллекция SWbemObject.PropertiesJ
В сценарии ReadAllProperties.vbs (листинг 5.14) на экран выводятся имена и
значения всех свойств экземпляра класса win32_LogicaiDisk,
соответствующего логическому диску D. Делается это путем перебора коллекции всех
свойств, которая хранится в свойстве Properties, соответствующего
объекта SWbemObject.
Листы
Листинг 5.14. Чтение всех свойств объекта WMI
' Имя: ReadAllProperties.vbs
' Язык: VBScript
' Описание: Чтение всех свойств объекта
i**********************************************
'Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim colDisks ' Коллекция экземпляров класса WMI
Dim objDisks ' Элемент коллекции
Dim strResult ' Результат запроса
i *•***•***•*•**•••***** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Свойства диска D: " & VbCrLf
' Подключаемся к пространству имен WMI
Set obj Service = GetObject ("WinMgmts: \\" & strComputer & _
"\" & strNamespace)
' Создаем коллекцию экземпляров класса Win32__LogicalDisk
Set colDisks = obj Service. ExecQuery( "Select * from Win32__LogicalDisk " &_
"Where DevicelD = 'D:' ")
1 Перебираем элементы коллекции
For Each objDisks In colDisks
Set colProperties = objDisks.Properties_
For Each objProperties In colProperties
' Формируем строку вывода
strResult = strResult & " " & objProperties.Name & " = " &_
objProperties.Value & VbCrLf
Next
Next
' Выводим результат на экран
WScript.Echo strResult
• ••••*•••••••••••••••••••• Конец **********************************
Изменение свойств объекта WMI
В настоящее время технология WMI подходит в основном только для чтения
свойств управляемых ресурсов, а не для их изменения. Однако в каждой
новой версии операционной системы Windows число свойств объектов WMI,
значения которых можно изменять, становится все больше. Напомним: для
того чтобы узнать, является ли свойство изменяемым, нужно проверить ква-
лификатор write этого свойства — если данный квалификатор имеется и
его значение равно True, то свойство доступно для записи.
В листинге 5.15 приведен сценарий Change_VolumeName.vbs, в котором
производится изменение метки диска D. Отметим здесь, что после
изменения значения свойства объекта swbemobject (в нашем примере это свойство
voiumeName), необходимо сохранить сделанные изменения в самом
управляемом ресурсе с помощью метода Put_:
' Устанавливаем новую метку
objDisks.VoiumeName = "Новая метка"
' Сохраняем измененное значение
objDisks.Put_
Листинг 5.15. Изменение свойства объекта WMI
••••••••••••••••••••••••••••••••••^
' Имя: Change_VolumeName. vbs
' Язык: VBScript
' Описание: Изменение метки диска
■••••••••••••••••••••••*•••••••••••••••*••••**
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim colDisks ' Коллекция экземпляров класса WMI
Dim objDisks ' Элемент коллекции
Dim strResult ' Результат запроса
•••••••••••••••••••••*• Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace)
1 Создаем коллекцию экземпляров класса Win32_LogicalDisk
Set colDisks = objService.ExecQuery("Select * from Win32_LogicalDisk " &_
"Where DevicelD = 'D:'")
1 Перебираем элементы коллекции
For Each objDisks In colDisks
' Формируем строку вывода
strResult = strResult &_
"Значение свойства до изменения " & VbCrLf &_
" VolumeName = " & obj Disks. VolumeName & VbCrLf & VbCrLf &_
"Значение свойства после изменения " & VbCrLf
' Устанавливаем новую метку
objDisks.VolumeName = "Новая метка"
' Сохраняем измененное значение
objDisks.Put_
' Добавляем в строку вывода новую метку
strResult = strResult & " VolumeName = " & obj Disks. VolumeName &
VbCrLf
Next
' Вывод результата на экран
WScript.Echo strResult
»**********•***•*•*•*•* + *• конец *****************•*••*■■*'■*'*■*'•*•■*'■*'•*•■*'■*'•*•*■*'■*'•*••*•
Вызов методов объекта WMI
Вызвать определенный метод объекта WMI можно либо путем создания
соответствующего объекта swbemobject (прямой доступ к объекту), либо с
помощью методов ExecMethod И ExecMethodAsync объекта SWbemServices.
Вызов метода при прямом доступе
к нужному объекту
Если для управляемого ресурса в сценарии создан объект swbemobject, то
нужный метод можно вызвать, просто указав его имя и нужные параметры
через точку после имени объекта. В сценарии ExecMethod.vbs (листинг 5.16)
422
Глава 5
подобным образом для класса win32_Process вызывается метод create,
с помощью которого запускается новый экземпляр Блокнота.
Листинг 5.16. Вызов метода при прямом доступе к объекту
••••••••••••••••••••••••••••••••••••***^
' Имя: ExecMethod.vbs
' Язык: VBScript
' Описание: Вызов метода при прямом доступе к объекту
i••••••••••••••••••••••••••••••*•••••*•••*••••••••••••*•••••••*•*•••
Option Explicit
On Error Resume Next
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objService ' Объект SWbemService
Dim colProcess ' Коллекция экземпляров класса WMI
Dim objProcess ' Элемент коллекции
Dim iError ' Значение, возвращаемое методом
Dim iProcessID ' Идентификатор созданного процесса
i ********'******•****••• Начало ************************************'*
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
' Подключаемся к пространству имен WMI
Set objService = GetObject ("WinMgmts: \\" & strComputer &_
"\" & strNamespace)
' Получаем указатель на класс Win32_Process
Set objProcess = objService.Get(strClass)
1 Запускаем метод Create
iError = objProcess.Create("Notepad.exe", null, null, iProcessID)
' Проверяем возвращенное методом значение
If iError <> 0 Then
' Выводим на экран сообщение об ошибке
WScript.Echo "При создании процесса NOTEPAD.EXE произошла ошибка"
Else
1 Выводим на экран сообщение об удачном запуске
WScript.Echo "Процесс NOTEPAD.EXE успешно создан. " & _
"Его идентификатор Handle = " & iProcessID
End If
• ••••••••••••••••••••••••• Коней ***********************************
Синхронный вызов метода
(метод SWbemServices.ExecMethod)
При вызове метода путем прямого доступа к объекту нужно указывать
входные параметры метода в строго определенном порядке, что в принципе
может послужить источником проблем при изменении соответствующего
класса WMI (например, при изменении и перекомпиляции MOF-файла
с описанием класса). Метод ExecMethod объекта swbemservices позволяет
идентифицировать параметры (как входные, так и выходные) вызываемого
метода по их имени, тем самым позволяя не задумываться о взаимном
расположении этих параметров.
Сценарий SyncExecMethod.vbs, приведенный в листинге 5.17, использует
метод ExecMethod для запуска нового экземпляра Блокнота и определения
идентификатора этого процесса.
Листинг 5.17. Синхронный вызов метода
1 Имя: SyncExecMethod.vbs
' Язык: VBScript
' Описание: Синхронный вызов метода
i*******************************************^
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim strMethod ' Имя метода
Dim objService ' Объект SWbemService
Dim colProcess ' Коллекция экземпляров класса WMI
Dim objProcess ' Элемент коллекции
Dim olnParams ' Коллекция входных параметров
Dim oOutParams ' Коллекция выходных параметров
• *••*•••••*****•••**••• Начало **************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
strMethod = "Create"
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & strComputer &_
"\" & strNamespace )
' Получаем указатель на класс Win32_Process
Set objProcess = objService.Get(strClass)
' Создаем коллекцию входных параметров метода
Set olnParams =
objProcess .Methods_(strMethod) . InParameters. Spawnlnstance_
1 Заполняем входной параметр CommandLine
olnParams.CommandLine = "Notepad.exe"
' Выполняем метод и получаем указатель на коллекцию выходных параметров
Set oOutParams = objService.ExecMethod(strClass, strMethod, olnParams)
1 Проверяем возвращаемое методом значение
If (oOutParams.ReturnValue <> 0) Then
' Выводим на экран сообщения об ошибке
Wscript.Echo "Ошибка при создании процесса NOTEPAD.EXE, код " &_
oOutParams.ReturnValue
Else
' Выводим на экран идентификатор запущенного процесса
Wscript.Echo "Процесс NOTEPAD.EXE успешно создан. " & _
"Его идентификатор Handle = " & oOutParams.ProcessId
End If
i••••****••••••••••••••••• конец ***********************************
Асинхронный вызов метода
(метод S WbemServices. ExecMethodAsync)
Рассмотрим сценарий AsyncExecMethod.vbs, в котором метод create класса
Win32_Process ВЫЗЫВаеТСЯ асинхронно С ПОМОЩЬЮ Метода ExecMethodAsync,
в качестве параметров которого нужно указать объект swbemsink
(переменная objsink), имена класса WMI и метода (переменные strciass и
strMethod соответственно), а также объект swbemobject, свойства которого
соответствуют входным параметрам запускаемого метода (переменная
olnParams):
' Выполняем метод ExecMethodAsync
objService.ExecMethodAsync objSink, strClass, strMethod, olnParams
Напомним, что объект swbemsink нужно создавать таким образом, чтобы
была возможность обрабатывать возникающие в нем события:
Set objSink = WScript.CreateObject ("WbemScripting.SWbemSink'', "Sink..")
Объект swbemobject, содержащий входные параметры, создается аналогично
синхронному случаю, для запуска процесса здесь достаточно заполнить
ТОЛЬКО СВОЙСТВО CoiranandLine!
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & strComputer &_
"\" & strNaitiespace)
' Получаем указатель на класс Win32_Process
Set objProcess = objService.Get(strClass)
1 Создаем коллекцию входных параметров метода
Set olnParams = bjProcess.Methods_(strMethod) . InParaitieters .Spawnlnstance_
' Заполняем входной параметр CommandLine
olnParams.CommandLine = "Notepad.exe"
После создания нового процесса возникает событие onobjectReady объекта
swbemsink, в обработчике которого мы выводим сообщение об успешном
запуске Блокнота:
' Процедура-обработчик события OnObjectReady объекта SWbemSink
Sub Sink_OnObjectReady(oOutParams, oContext)
1 Выводим на экран идентификатор запущенного процесса
Wscript.Echo "Процесс NOTEPAD.EXE успешно создан. " & _
"Его идентификатор Handle = " & oOutParams.ProcessId
End Sub
После полного завершения асинхронной операции возникает событие
OnCompleted объекта SWbemSink:
1 Процедура-обработчик события OnCompleted объекта SWbemSink
Sub Sink_OnCompleted(HResult/ LastErrorObj, oContext)
1 Выводим на экран сообщение об успешном выполнении метода
WScript.Echo "Выполнение метода завершено успешно, HResult = " &
Hex(HResult)
bdone = True
End Sub
Полностью сценарий Async Exec Met hod. vbs приведен в листинге 5.18.
I*******************************************************************
' Имя: AsyncExecMethod.vbs
1 Язык: VBScript
1 Описание: Асинхронный вызов метода
• **********•••***•••*••*********************************************
Option Explicit
On Error Resume Next
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim strMethod ' Имя метода
Dim obj Service ' Объект SWbemService
Dim colProcess ' Коллекция экземпляров класса WMI
Dim objProcess ' Элемент коллекции
Dim olnParams ' Коллекция входных параметров
Dim oOutParams ' Коллекция выходных параметров
Dim objSink ' Объект SWbemSink
Dim bdone f Переменная для организации цикла
i********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
strMethod = "Create"
bDone = false
1 Подключаемся к пространству имен WMI
*нЯХ7!ЯТ*итУЯШТШЧт*Я!П*П!ЯШ
Set objService = GetObject("WinMgmts:\\" & strComputer &_
"\" & strNamespace )
1 Получаем указатель на класс Win32_Process
Set objProcess = objService.Get(strClass)
1 Создаем коллекцию входных параметров метода
Set olnParams =
objProcess .Me thods_(strMethod ) .InParameters.SpawnInstance_
1 Заполняем входной параметр CommandLine
olnParams.CommandLine = "Notepad.exe"
' Создаем объект SWbemSink
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")
' Выполняем метод ExecMethodAsync
objService.ExecMethodAsync objSink, strClass, strMethod, olnParams
1 Приостанавливаем сценарий до завершения выполнения запроса
While Not bDone
WScript.Sleep 1000
Wend
' Процедура-обработчик события OnObjectReady объекта SWbemSink
Sub Sink_OnObjectReady(oOutParams, oContext)
1 Выводим на экран идентификатор запущенного процесса
Wscript.Echo "Процесс NOTEPAD.EXE успешно создан. " & _
"Его идентификатор Handle = " & oOutParams.ProcessId
End Sub
' Процедура-обработчик события OnCompleted объекта SWbemSink
Sub Sink_OnCompleted(HResult, LastErrorObj, oContext)
1 Выводим на экран сообщение об успешном выполнении метода
WScript.Echo "Выполнение метода завершено успешно, HResult = " & _
Hex(HResult)
bdone = True
End Sub
i ********•••••••••*••••••• Конец ***********************************
Создание нового экземпляра
управляемого ресурса
Создать новый экземпляр управляемого ресурса WMI (класса CIM) можно
с помощью метода spawninstance_() объекта swbemobject,
соответствующего данному классу. После заполнения свойств созданного экземпляра он
сохраняется в репозитории CIM с помощью метода Put_.
В сценарии CreateObject.vbs подобным образом создается новый фильтр
событий WMI (листинг 5.19).
Листинг 5.19. Создание объекта с помощью метода Spawninetance_ ()
<••••••••••••••••*•••••
1 Имя: CreateObject.vbs
1 Язык: VBScript
1 Описание: Создание постоянного фильтра событий
Option Explicit
On Error Resume Next
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemServices
Dim objEventFilterClass ' Указатель на класс EventFilter
Dim objEventFilter ' Объект класса EventFilter
i•*••**•*****••***••••* Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
1 Получаем указатель на класс EventFilter
Set objEventFilterClass = objService.Get(" EventFilter")
1 Создаем новый объект класса EventFiIter
Set objEventFiIter = objEventFilterClass.SpawnInstance_()
1 Заполняем свойства нового объекта
objEventFiIter.Name = "MonitoringServices"
objEventFilter.QueryLanguage = "WQL"
objEventFiIter.Query = _
"SELECT * FROM InstanceModificationEvent " & _
"WITHIN 5 WHERE TargetInstance ISA *Win32_Service'"
1 Сохраняем объект в репозитории CIM
objEventFiIter.Put_()
1 Обрабатываем ошибки
If Err.Number <> 0 Then
1 Выводим сообщение об ошибке
MsgBox "Ошибка при регистрации фильтра событий MonitoringServices"
Else
1 Выводим сообщение об успешной регистрации
MsgBox "Регистрация фильтра событий MonitoringServices прошла успешно"
End If
i •********•*••****•******• Конец ***********************************
Удаление экземпляра управляемого ресурса
Удалить экземпляр управляемого ресурса WMI можно либо с помощью
методов Delete. И DeleteAsync_ соответствующего объекта SWbemObject
(прямой доступ к объекту), либо с помощью методов Delete и DeieteAsync
объекта swbemservices. Отметим, что не у всякого динамического класса
можно удалять экземпляры. Признаком того, что провайдер динамического
класса поддерживает процедуру удаления своих экземпляров, является, как
правило, наличие у класса квалификатора supportsDeiete со значением
True.
В листингах 5.20—5.23 приведены сценарии, в которых путем выполнения
перечисленных методов производится удаление созданного с помощью
сценария CreateObject.vbs фильтра событий WMI с именем "MonitoringServices".
Все сценарии снабжены подробными комментариями и не нуждаются в
дополнительных пояснениях.
Листинг 5.20. Удаление объекта с помощью метода swbemobject.Delete,
(синхронный режим)
i•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
1 Имя: DeleteObject.vbs
1 Язык: VBScript
1 Описание: Удаление экземпляра при прямом доступе к нужному объекту
1 (метод Delete_ объекта SWbemObject)
• ••••••*••*•'* •••••••••••••••••••••••••••••••••••••••••••••••••••••••
Option Explicit
On Error Resume Next
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemServices
Dim objEventFiIter ' Объект класса EventFilter
i•••••******••****•**** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
1 Получаем указатель на объект objEventFilter
Set objEventFiIter = _
obj Service. Get (" EventFi lter.name=" "MonitoringServices )
1 Выполняем метод Delete_
obj EventFilter.Delete_()
1 Обрабатываем ошибки
If Err.Number <> 0 Then
1 Выводим сообщение об ошибке
MsgBox "Ошибка при удалении фильтра событий MonitoringServices"
Else
* Выводим сообщение об удалении объекта
MsgBox "Удаление фильтра событий MonitoringServices прошло успешно"
End If
• ************************* Конец ***********************************
Листинг 5.21. Удаление объекта с помощью метода
SWbmObject.DeleteAeync. (асинхронный режим)
********************************************************************
' Имя: Async_DeleteObject.vbs
1 Язык: VBScript
1 Описание: Удаление экземпляра управляемого объекта
1 (метод DeleteAsync_ объекта SWbemObject)
<*******************************************************************
Option Explicit
On Error Resume Next
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен WMI
Dim objServices ' Объект SWbemServices
Dim objEventFilter ' Объект SWbemObject
Dim objSink ' Объект SWbemSink
Dim bDone ' Переменная для организации цикла
i********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
bDone = False
1 Подключаемся к пространству имен WMI
Set objServices = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
' Создаем объект SWbemSink
Set objSink = WScript.CreateObject ("WbemScripting.SWbemSink", "Sink_")
1 Получаем указатель на объект objEventFiIter
Set objEventFilter = _
objServices.Get (" EventFilter.name=" "MonitoringServices )
1 Обрабатываем ошибки
If Err.Number <> 0 Then
1 Выводим сообщение об ошибке
MsgBox "Фильтр событий MonitoringServices не найден"
End If
1 Выполняем метод DeleteAsync
objEventFilter.DeleteAsync_ objSink
1 Приостанавливаем сценарий до завершения выполнения запроса
While Not bDone
WScript.Sleep 1000
Wend
' Процедура-обработчик события OnCompleted объекта SWbemSink
Sub Sink_OnCompleted(iHResult, objErrorObject, objAsyncContext)
1 Обрабатываем ошибки
If iHResult <> 0 Then
* Выводим сообщение об ошибке
MsgBox "Ошибка при удалении фильтра событий MonitoringServices"
Else
' Выводим сообщение об удалении объекта
MsgBox "Удаление фильтра событий MonitoringServices прошло успешно"
End If
1 Изменяем значение bDone для выхода из цикла
bDone = True
End Sub
i************************* Конец ***********************************
Листинг 5.22. Удаление объекта с помощью метода swbemservicee. Delete
(синхронный режим)
!•••••••••••••*••••••••••••••••••••••••••••••••
1 Имя: DeleteObject2.vbs
1 Язык: VBScript
1 Описание: Удаление экземпляра управляемого объекта
1 (метод Delete объекта SWbemService)
i •••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
Option Explicit
On Error Resume Next
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace * Имя пространства имен WMI
Dim objService ' Объект SWbemServices
i *•*••******•*******••* Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
* Подключаемся к пространству имен WMI
Set obj Service = GetObject ("WinMgmts: \\" &_
strComputer & "\" & strNamespace )
1 Выполняем метод Delete
obj Service. Delete " EventFilter.name=" "MonitoringServices '
1 Обрабатываем ошибки
If Err.Number <> 0 Then
1 Выводим сообщение об ошибке
MsgBox "Ошибка при удалении фильтра событий MonitoringServices"
Else
1 Выводим сообщение об удалении объекта
MsgBox "Удаление фильтра событий MonitoringServices прошло успешно"
End If
i *••*•••**•••********••*•• Конец ***********************************
Листинг 5.23. Удаление объекта с помощью метода
SWbemServices.DeleteAsync (асинхронный режим)
I********************************************************
1 Имя: Async_Delete0bject2.vbs
1 Язык: VBScript
1 Описание: Удаление экземпляра управляемого объекта
1 (метод DeleteAsync объекта SWbemService)
i •••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
Option Explicit
On Error Resume Next
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен WMI
Dim objService ' Объект SWbemServices
Dim objSink ' Объект SWbemSink
Dim bDone ' Переменная для организации цикла
i •****•*******•*•*•••** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
bDone = False
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
' Создаем объект SWbemSink
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink","Sink_")
1 Выполняем метод DeleteAsync
objService.DeleteAsync objSink ,_
" EventFilter.name=""MonitoringServices
1 Приостанавливаем сценарий до завершения выполнения запроса
While Not bDone
WScript.Sleep 1000
Wend
1 Процедура-обработчик события OnCompleted объекта SWbemSink
Sub Sink_OnCompleted(iHResult, objErrorObject, objAsyncContext)
1 Обрабатываем ошибки
If iHResult <> 0 Then
1 Выводим сообщение об ошибке
MsgBox "Ошибка при удалении фильтра событий MonitoringServices"
Else
' Выводим сообщение об удалении объекта
MsgBox "Удаление фильтра событий MonitoringServices прошло успешно"
End If
' Изменяем значение bDone для выхода из цикла
bDone = True
End Sub
• ••**•••••••*****•**•***•• Коней. ***********************************
Создание временных потребителей событий WMI
Напомним, что сценарии, являющиеся временными потребителями событий
WMI, сначала должны произвести подписку на нужные события, после чего
данные сценарии начнут получать извещения о наступлении этих событий.
После завершения работы временного потребителя событий ни одно из
зарегистрированных в нем событий больше не обрабатывается.
Подписка на события в синхронном режиме
Рассмотрим сценарий SyncMonitor.vbs, в котором производится подписка на
событие, состоящее в изменении состояний какой-либо службы,
зарегистрированной в Windows. Если запустить этот сценарий и остановить службу,
которая до этого была запущена, то на экран будет выведено сообщение,
содержащее дату и время наступления события, имя этой службы и
информацию об изменении состояния (рис. 5.5).
Рис. 5.5. Информация об изменении состояния службы
Данное сообщение о наступлении события будет также продублировано
в текстовый файл C:\LogService.txt (рис. 5.6).
Запрос на языке WQL, определяющий интересующее нас событие,
выполняется в сценарии с помощью метода ExecNotificationQuery объекта
SWbemServices, КОТОрЫЙ Возвращает ССЫЛКУ на объект SWbemEventSource
(переменная objEventSource):
* Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
f Выполняем запрос для подписки на извещения о событиях WMI
Set objEventSource = objService.ExecNotificationQuery _
("SELECT * FROM InstanceModificationEvent " & _
"WITHIN 5 WHERE Targetlnstance ISA 'Win32_Service'")
Рис. 5.6. Содержимое файла LogService.txt
После ЭТОГО НУЖНО вызвать метод NextEvent Объекта SWbemEventSource!
1 Записываем в переменную objEvent следующее событие
Set objEvent = objEventSource.NextEvent
Метод NextEvent ждет наступления события, которому соответствует
объект SWbemEventSource, после чего возвращает объект swbemobject с
описанием произошедшего события (переменная obj Event). В свойствах
Targetlnstance И Previouslnstance ЭТОГО объекта Хранятся, В СВОЮ ОЧереДЬ,
объекты swbemobject, описывающие соответственно текущее и предыдущее
состояние управляемого ресурса. Так как нас интересуют события,
связанные с изменением состояния службы, то мы проверяем, изменилось ли
значение СВОЙСТВа State В объекте objEvent.TargetInstance ПО Сравнению СО
значением свойства state в объекте objEvent.Previouslnstance. Если
значение этого свойства действительно изменилось, то формируется строка
strResuit с нужным нам описанием события, которая выводится на экран
с помощью метода wscript.Echo и в текстовый файл C:\LogService.txt
с помощью определенной заранее процедуры Textout:
If objEvent.Targetlnstance.State <> objEvent.Previouslnstance.State Then
1 Формируем строку для вывода
strResuit = Date & " " & Time & vbCrLf &_
-"Служба: " & objEvent.Targetlnstance.DisplayName &_
" . " & vbCrLf &_
"Текущее состояние: " & objEvent.TargetInstance.State &_
"." & vbCrLf &_
"Предьщущее состояние: " & objEvent.Previouslnstance.State &_
"." & vbCrLf
' Выводим результат на экран
WScript.Echo strResult
' Выводим результат в текстовый файл
TextOut "*****************************" Sc vbCrLf & strResult &_
"*****************************" "С • \LociService txt"
End If
Полностью сценарий SyncMonitor.vbs приведен в листинге 5.24.
Листинг 5.24. Создание временного потребителя событий WMI в синхронном
режиме
' Имя: SyncMon i tor. vbs
' Язык: VBScript
' Описание: Подписка на события WMI в синхронном режиме
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен WMI
Dim objService ' Объект SWbemServices
Dim objEventSource ' Объект SWbemEventSource
Dim objEvent ' Объект SWbemObject
Dim strResult ' Результат запроса
' Константа для задания режима открытия файла
Const ForAppend = 8
' Функция для записи информации в файл
Sub TextOut (Text, File)
' Объявляем переменные
Dim FSO, FOut
' Создаем объект FileSystemObject
Set FSO=WScript.CreateObject("Scripting.FileSystemObject")
' Открываем выходной файл для записи
Set FOut = FSO.OpenTextFile (File,ForAppend,true)
' Записываем текстовую строку в файл
FOut.WriteLine Text
' Закрываем выходной файл
FOut.Close
End Sub
i •••••*•••••••••••••••• Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
' Выполняем запрос для подписки на извещения о событиях WMI
Set objEventSource = objService.ExecNotificationQuery _
("SELECT * FROM InstanceModificationEvent " & _
"WITHIN 5 WHERE TargetInstance ISA 'Win32_Service'")
' Выводим сообщение о запуске сканера
WScript.Echo " Запущен сканер изменения состояния служб"
' Записываем в переменную objEvent следующее событие
Set objEvent = objEventSource.NextEvent
' Проверяем, изменилось ли состояние службы
If objEvent.TargetInstance.State <> objEvent.PreviousInstance.State Then
' Формируем строку для вывода
strResult = Date & " " & Time & vbCrLf &_
"Служба: " & objEvent.Targetlnstance.DisplayName &_
"." & vbCrLf &_
"Текущее состояние: " & objEvent.Targetlnstance.State &_
"." & vbCrLf &_
"Предьщущее состояние: " & objEvent.Previouslnstance.State &_
"." & vbCrLf
' Выводим результат на экран
WScript.Echo strResult
' Выводим результат в текстовый файл
TextOut и****************************** Sc vbCrLf & strResult &_
•• ***************************** •• "С • \LocrService txt"
End If
i **************•*•**•*•****•*•* Конец. ***********************************
Подписка на события в полусинхронном режиме
Подписка на события WMI в полусинхронном режиме производится также
при ПОМОЩИ метода ExecNotificationQuery С ДОПОЛНИТеЛЬНЫМ ЧИСЛОВЫМ
параметром, Значение КОТОРОГО равно сумме КОНСТанТ wbemFlagForwardOnly
И wbemFlagReturnlmmediately.
В листинге 5.25 приведен сценарий SemisyncMonitor.vbs, который является
полусинхронным аналогом рассмотренного ранее сценария SyncMonitor.vbs.
Листинг 5.25. Создание временного потребителя событий WMI
в полусинхронном режиме
' Имя: SemisyncMonitor.vbs
' Язык: VBScript
1 Описание: Подписка на события WMI в полусинхронном режиме
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен WMI
Dim objService ' Объект SWbemServices
Dim objEventSource ' Объект SWbemEventSource
Dim objEvent ' Объект SWbemObject
Dim strResult ' Результат запроса
' Объявляем константы
Const wbemFlagForwardOnly =32
Const wbemFlagReturnlmmediately =16
Const ForAppend = 8
' Функция для записи информации в файл
Sub TextOut (Text, File)
' Объявляем переменные
Dim FSO, FOut
' Создаем объект FileSystemObject
Set FSO=WScript.CreateObject("Scripting.FileSystemObject")
' Открываем выходной файл для записи
Set FOut = FSO.OpenTextFile (File,ForAppend,true)
' Записываем текстовую строку в файл
FOut.WriteLine Text
' Закрываем выходной файл
FOut.Close
End Sub
i ********************** Начало *************************************
f Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
f Выполняем запрос для подписки на извещения о событиях WMI
Set objEventSource = objService.ExecNotificationQuery _
("SELECT * FROM InstanceModificationEvent " & _
"WITHIN 5 WHERE Targetlnstance ISA 'Win32_Service'",,_
wbemFlagReturnlmmediately+wbemFlagForwardOnly)
' Выводим сообщение о запуске сканера
Wscript.Echo " Запущен сканер изменения состояния служб"
1 Записываем в переменную следующее событие
Set objEvent = objEventSource.NextEvent
f Проверяем, изменилось ли состояние службы
If objEvent.TargetInstance.State <> objEvent.PreviousInstance.State Then
1 Формируем строку для вывода
strResult = Date & " " & Time & vbCrLf &_
"Служба: " & objEvent.Targetlnstance.DisplayName &_
" . " & vbCrLf Sc__
"Текущее состояние: " & objEvent.Targetlnstance.State &_
" . " & vbCrLf &_
"Предыдущее состояние: " & objEvent.Previouslnstance.State &_
"." & vbCrLf
f Выводим результат на экран
WScript.Echo strResult
' Выводим результат в текстовый файл
TextOut ******************************* Sc vbCrLf & strResult &_
и ***************************** ii "С • \LocrService txt"
End If
»************************** Коней ***********************************
Подписка на события в асинхронном режиме
Для подписки на события WMI в асинхронном режиме, как и при
выполнении других асинхронных операций, требуется в сценарии создать объект
swbemsink и реализовать обработку его событий.
Рассмотрим сценарий AsyncMonitor.vbs, в котором аналогично двум
предыдущим сценариям будет производиться асинхронная обработка события WMI,
состоящего в изменении состояния любой службы Windows. Подписка на это
событие осуществляется С ПОМОЩЬЮ метода ExecNotificationQueryAsync
объекта swbemServices, где в качестве первого параметра указывается
переменная-объект swbemsink, а в качестве второго параметра — строка,
содержащая соответствующий WQL-запрос:
' Создаем объект SWbemSink
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")
' Выполняем запрос для подписки на извещения о событиях WMI
obj Service.ExecNotificationQueryAsync objSink, _
"SELECT * FROM InstanceModificationEvent " & _
"WITHIN 5 WHERE Targetlnstance ISA 'Win32_Service'"
Напомним: второй параметр в методе CreateObject объекта wscript
указывает на то, что названия процедур-обработчиков событий объекта swbemsink
должны начинаться с префикса sink_. После выполнения метода
ExecNotificationQueryAsync на экран выводится сообщение о начале
мониторинга изменения состояния служб и выполнение сценария
приостанавливается:
' Выводим сообщение о запуске сканера
Wscript.Echo " Запущен сканер изменения состояния служб"
' Приостанавливаем сценарий до наступления события
While Not bDone
WScript.Sleep 1000
Wend
При наступлении интересующего нас события управление будет передано
В процедуру Sink_OnObjectReady(oOutParams, oContext), Которая, В СООТ-
ветствии со своим префиксом sink_, является обработчиком события
onobjectReady объекта swbemsink. В качестве параметра ooutparams в
процедуру будет передан объект swbemobject с описанием произошедшего
события (напомним, что в рассмотренных ранее синхронном и
полусинхронном вариантах сценария этот объект записывался в переменную objEvent).
Сама Обработка произошедшего события В процедуре Sink_OnObjectReady
производится аналогично синхронному и полусинхронному случаю с
использованием СВОЙСТВ Targetlnstance И Previouslnstance, В КОТОРЫХ
Хранятся объекты swbemobject, описывающие соответственно текущее и
предыдущее состояние службы Windows. В конце процедуры переменной bDone
присваивается значение True, что позволяет выйти из цикла while и
завершить работу сценария:
' Процедура-обработчик события OnObjectReady объекта SWbemSink
Sub Sink_OnObjectReady(oOutParams, oContext)
' Формируем строку для вывода
strResult = Date & " " & Time & vbCrLf &_
"Служба: " & oOutParams.Targetlnstance.DisplayName &_
"." & vbCrLf &_
"Текущее состояние: " & oOutParams.Targetlnstance.State &_
"." & vbCrLf &_
"Предьщущее состояние: " & oOutParams.Previouslnstance.State &_
"." & vbCrLf
' Выводим результат на экран
Wscript.Echo strResult
' Выводим результат в текстовый файл
TextOut "*****************************" Sc vbCrLf & strResult &_
ii ***************************** •• iiq . \LoaService. txt"
' Изменяем значение bDone для выхода из цикла
bDone = True
End Sub
Полностью сценарий AsyncMonitor.vbs приведен в листинге 5.26.
Листинг 5.26. Создание временного потребителя событий WMI в асинхронном
режиме
I*******************************************************************
' Имя: AsyncMon i tor.vbs
' Язык: VBScript
' Описание: Подписка на события WMI в асинхронном режиме
i***•*•*•**•***•**•*********•****•***••*****••********•*****•**••*•*
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен WMI
Dim objService ' Объект SWbemServices
Dim objEventSource f Объект SWbemEventSource
Dim strResult ' Результат запроса
Dim obj Sink ' Объект SWbemSink
Dim bDone ' Переменная-флаг выхода из цикла
' Константа для задания режима открытия файла
Const ForAppend = 8
' Функция для записи информации в файл
Sub TextOut (Text, File)
' Объявляем переменные
Dim FSO, FOut
' Создаем объект FileSystemObject
Set FSO=WScript.CreateObject("Scripting.FileSystemObject")
' Открываем выходной файл для записи
Set FOut = FSO.OpenTextFile (File,ForAppend,true)
' Записываем текстовую строку в файл
FOut.WriteLine Text
' Закрываем выходной файл
FOut.Close
End Sub
i ••**••******••••*••••• Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
f Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
' Создаем объект SWbemSink
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")
f Выполняем запрос для подписки на извещения о событиях WMI
objService.ExecNotificationQueryAsync objSink, _
"SELECT * FROM InstanceModificationEvent " & _
"WITHIN 5 WHERE Targetlnstance ISA 'Win32_Service'"
' Выводим сообщение о запуске сканера
Wscript.Echo " Запущен сканер изменения состояния служб"
1 Приостанавливаем сценарий до наступления события
While Not bDone
WScript.Sleep 1000
Wend
' Процедура-обработчик события OnObjectReady объекта SWbemSink
Sub Sink_OnObjectReady(oOutParams, oContext)
' Формируем строку для вывода
strResult = Date & " " & Time & vbCrLf &_
"Служба: " & oOutParams.Targetlnstance.DisplayName &_
"." & vbCrLf &_
"Текущее состояние: " & oOutParams.Targetlnstance.State &_
"." & vbCrLf &_
"Предьщущее состояние: " & oOutParams.Previouslnstance.State &_
"." & vbCrLf
f Выводим результат на экран
Wscript.Echo strResult
' Выводим результат в текстовый файл
TextOut и*****************************" Sc vbCrLf & strResult &_
и а****************************" "С: \LocrService. txt"
' Изменяем значение bDone для выхода из цикла
bDone = True
End Sub
' Процедура-обработчик события OnObjectReady объекта SWbemSink
Sub Sink_OnObjectReady(oOutParams, oContext)
' Проверяем, изменилось ли состояние службы
If oOutParams.TargetInstance.State <> _
oOutParams.PreviousInstance.State Then
' Формируем строку для вывода
strResult = Date & " " & Time & vbCrLf &_
"Служба: " & oOutParams.Targetlnstance.DisplayName &_
"." & vbCrLf &_
"Текущее состояние: " & oOutParams.TargetInstance.State &_
"." & vbCrLf &_
"Предыдущее состояние: " & oOutParams.Previouslnstance.State &_
"." & vbCrLf
' Выводим результат на экран
Wscript.Echo strResult
' Выводим результат в текстовый файл
TextOut и****************************** Sc vbCrLf & strResult &_
и***************************** ■■ "С* \LocrService txt"
' Изменяем значение bDone для выхода из цикла
bDone = True
End If
End Sub
i ************************* Коней ***********************************
Создание постоянных потребителей событий WMI
Для постоянной обработки событий WMI нужно выполнить три операции.
1. Определить нужное событие WMI путем регистрации в репозитории CIM
соответствующего фильтра событий.
2. Зарегистрировать в CIM потребителя событий определенного типа.
3. Установить связь между фильтром и потребителем событий.
Создание фильтра событий
Для регистрации в репозитории CIM своего фильтра событий нужно создать
новый экземпляр класса EventFiiter, заполнить его свойства Query
(запрос На ЯЗЫКе WQL, КОТОРЫЙ Определяет Нужное Событие), QueryLanguage
(идентификатор языка запросов, здесь нужно записать строку wql) и Name
(имя создаваемого фильтра событий).
В листинге 5.27 приведен сценарий Filter.vbs, в котором создается фильтр
с именем Monitoringservices, реагирующий (как и рассмотренные ранее
временные потребители событий) на изменения состояний служб Windows.
Листинг 5.27. Создание постоянного фильтра событий WMI
i •••*•**••••••••••••*••*••••••*•*•**********************************
' Имя: Filter.vbs
' Язык: VBScript
' Описание: Создание постоянного фильтра событий
•••*••••***•*•*••*•••••*••••*•*********************•****************
Option Explicit
On Error Resume Next
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemServices
Dim objEventFilterClass ' Указатель на класс EventFilter
Dim objEventFilter ' Объект класса EventFilter
i********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
' Получаем указатель на класс EventFilter
Set objEventFilterClass = objService.Get(" EventFilter")
' Создаем новый объект класса EventFilter
Set objEventFilter = objEventFilterClass.Spawn!nstance_()
' Заполняем свойства нового объекта
obj EventFiIter.Name = "MonitoringServices"
objEventFilter.QueryLanguage = "WQL"
objEventFiIter.Query = "SELECT * FROM InstanceModificationEvent " & _
"WITHIN 5 WHERE Targetlnstance ISA 'Win32_Service'"
1 Сохраняем объект в репозитории CIM
objEventFilter.Put_()
' Обрабатываем ошибки
If Err.Number <> 0 Then
1 Выводим сообщение об ошибке
MsgBox "Ошибка при регистрации фильтра событий MonitoringServices"
Else
1 Выводим сообщение об успешной регистрации
MsgBox "Регистрация фильтра событий MonitoringServices прошла успешно"
End If
»•**••*••****•*••••*•*•••• Конец ***********************************
Создание потребителя событий
Напомним, что в WMI постоянный потребитель событий должен быть
представлен экземпляром одного из потомков класса Eventconsumer. Мы
рассмотрим сценарий Consumer.vbs, в котором в качестве постоянного
потребителя создается и регистрируется в репозитории CIM экземпляр класса
LogFiieEventconsumer, что позволяет при получении извещения о событии
производить запись строки с информацией об этом событии в
определенный текстовый файл (рис. 5.7).
Рис. 5.7. Содержимое файла LogService.txt с информацией о событиях
Создается экземпляр класса LogFiieEventconsumer обычным образом с
помощью метода Spawnlnstance_:
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
' Получаем указатель на класс LogFiieEventconsumer
Set objConsumerClass = objService.Get("LogFiieEventconsumer")
' Создаем новый экземпляр класса LogFiieEventconsumer
Set objConsumer = objConsumerClass.Spawnlnstance_()
У Объекта LogFiieEventconsumer НУЖНО заполнить СВОЙСТВа Name (ИМЯ
Потребителя), FileName (имя файла, в который будет записываться
информация) и Text (текст записываемого в файл сообщения):
objConsumer.Name = "ServiceLog"
objConsumer.Filename = "C:\LogService.txt"
objConsumer.Text = "Служба %TargetInstance.DisplayName% " &_
" перешла в состояние %TargetInstance.State%"
Обратим внимание, что в строке, записываемой в свойство Text,
присутствуют имена СВОЙСТВ Targetlnstance.DisplayName И Targetlnstance.State,
заключенные в шаблонные символы %...%. При записи в файл в это место
строки автоматически будут подставлены значения данных свойств для
объекта, соответствующего произошедшему событию (см. рис. 5.7).
С Замечание ^
Для того чтобы узнать, поддерживает ли какое-либо свойство объекта
шаблонные символы, нужно проверить, имеется ли у этого свойства квалификатор
Template. Если этот квалификатор имеется и значение его равно True, то
шаблонные символы внутри свойства использовать можно.
Созданный потребитель сохраняется в репозитории CIM с помощью метода
Put_:
objConsumer. Put_ ()
Полностью сценарий Consumer.vbs приведен в листинге 5.28.
Листинг 5.28. Создание постоянного потребителя событий WMI
■••••••••••••••••••••••••••••••••********^
' Имя: Consumer.vbs
' Язык: VBScript
' Описание: Создание постоянного потребителя событий
i ••••••••••••*•••*•••••••••••••••••*••*•••••••*••••••••••*•*•*•••••*
Option Explicit
On Error Resume Next
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен WMI
Dim objService ' Объект SWbemServices
Dim objConsumerClass ' Указатель на класс LogFileEventConsumer
Dim objConsumer ' Объект класса LogFileEventConsumer
i ****•••••***********•* Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
' Получаем указатель на класс LogFileEventConsumer
Set objConsumerClass = objService.Get("LogFileEventConsumer")
' Создаем новый экземпляр класса LogFileEventConsumer
Set objConsumer = objConsumerClass.SpawnInstance_()
1 Заполняем свойства нового объекта
obj Consumer. Name = "ServiceLog"
objConsumer.Filename = "C:\LogService.txt"
objConsumer.Text = "Служба %TargetInstance.DisplayName% " &_
" перешла в состояние %TargetInstance.State%"
' Сохраняем созданный объект в репозитории CIM
obj Consumer.Put_()
1 Обрабатываем ошибки
If Err.Number <> 0 Then
' Выводим сообщение об ошибке
MsgBox "Ошибка при регистрации потребителя ServiceLog"
Else
' Выводим сообщение об успешной регистрации
MsgBox "Регистрация потребителя ServiceLog прошла успешно"
End If
»•••*•••••*••••••*•••••*•• Конец ***********************************
Установка связи между фильтром и потребителем
После того как мы с помощью сценариев Filter.vbs и Consumer.vbs создали и
зарегистрировали в репозитории СШ соответственно фильтр и потребителя
событий WMI, необходимо установить связь между ними. Это делается
в сценарии FilterToConsumer.vbs путем создания экземпляра специального
ассоциативного класса FilterToConsumerBinding:
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
' Получаем указатель на класс FilterToConsumerBinding
Set objBindingClass = objService.Get(" FilterToConsumerBinding")
' Создаем новый экземпляр класса FilterToConsumerBinding
Set objBindinglnstance = objBindingClass.SpawnInstance_()
Для установки связи необходимо в свойство Filter объекта
FilterToConsumerBinding записать путь К Нужному фильтру событий,
а в свойство consumer — путь к потребителю событий. Узнать пути к
объектам можно с помощью свойства Path_ соответствующих объектов
SWbemObject (переменные objEventFilter И objConsumer):
1 Получаем указатель на фильтр событий (объект EventFilter)
Set objEventFilter = _
objService.Get(" EventFilter.name=""MonitoringServices""")
'Получаем указатель на потребитель событий (объект LogFileEventConsumer)
Set objConsumer = _
obj Service. Get (мLogFileEventConsumer.name=,, "ServiceLog""")
1 Заполняем свойства нового объекта
objBindinglnstance.Filter = objEventFilter.Path__
objBindinglnstance.Consumer = objConsumer.Path_
После ЭТОГО НОВЫЙ Объект FilterToConsumerBinding нужно сохранить
в репозитории CIM:
objBindinglnstance. Put_()
Полностью сценарий FilterToConsumer.vbs приведен в листинге 5.29.
Листинг 5.29. Установка связи между фильтром и потребителем событий WMI
•****************•**•***••****••****•***•****•*****•
1 Имя: FilterToConsumer.vbs
' Язык: VBScript
' Описание: Регистрация связи между фильтром и потребителем событий
Option Explicit
On Error Resume Next
• Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemServices
Dim objEventFilter ' Объект класса EventFilter
Dim objConsumer ' Объект класса LogFileEventConsumer
Dim objBindingClass ' Указатель на класс FilterToConsumerBinding
Dim objBindinglnstance ' Объект класса FilterToConsumerBinding
i ************■*•■*•*■*■*•****• Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
' Получаем указатель на фильтр событий (объект EventFilter)
Set objEventFilter = _
objService.Get(" EventFilter.name=""MonitoringServices""")
'Получаем указатель на потребитель событий (объект LogFileEventConsumer)
Set objConsumer = _
objService.Get("LogFileEventConsumer.name=""ServiceLog""")
' Получаем указатель на класс FilterToConsumerBinding
Set objBindingClass = objService.Get(" FilterToConsumerBinding")
1 Создаем новый экземпляр класса FilterToConsumerBinding
Set objBindinglnstance = objBindingClass.SpawnInstance_()
' Заполняем свойства нового объекта
objBindinglnstance.Filter = objEventFilter.Path_
objBindinglnstance.Consumer = objConsumer.Path_
' Сохраняем объект в репозитории CIM
objBindinglnstance.Put_()
' Обрабатываем ошибки FilterToConsumerBinding
If Err.Number <> 0 Then
1 Выводим сообщение об ошибке
MsgBox "Ошибка при связывании фильтра событий с потребителем"
Else
1 Выводим сообщение об успешной регистрации связи
MsgBox "Фильтр событий и потребитель связаны"
End If
i••*••••*•*•*•••••**•••••• Конец ***********************************
Глава 6
Типичные
администраторские сценарии WMI
В данной главе приведены различные сценарии WMI, каждый из которых
может оказаться полезным при решении определенной задачи
администратора Windows (удаленное управление работой рабочих станций,
централизованная инвентаризация установленного на компьютерах оборудования,
анализ журналов событий системы или приложений и т. д.). Проанализировав
эти сценарии и объекты WMI, которые в них используются, вы сможете без
труда составить более сложные сценарии, учитывающие специфику ваших
задач (примеры подобных сценариев рассматриваются в следующей главе).
Отметим, что практически все приведенные далее сценарии написаны по
аналогии с типичными сценариями, которые были рассмотрены в главе 5,
и снабжены подробными комментариями, поэтому детальное пошаговое
объяснение их работы в большинстве случаев опущено.
Управление компьютером
В листингах 6.1—6.3 приведены сценарии, которые с помощью
соответствующих методов класса win32_0peratingsystem позволяют принудительно
завершить сеанс активного пользователя, перезагрузить или выключить
компьютер.
Завершение сеанса пользователя
Для завершения сеанса активного пользователя необходимо вызвать метод
Win32Shutdown объекта Win32_OperatingSystem (ЛИСТИНГ 6.1).
вершение сеанса пользователя
••••••••••••••••••••*•••••••••*•*•*•
' Имя: LogOf f.vbs
' Язык: VBScript
1 Описание: Завершение сеанса пользователя
Листинг 6 1.3а
i *******************************************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colInstances ' Коллекция экземпляров класса WMI
Dim objInstance ' Элемент коллекции
i ********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = MRoot\CIMV2"
strClass = "Win32_OperatingSystern"
1 Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
" \" & strNamespace & ":" & strClass)
• Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set collnstances = objClass.Instances_
' Перебираем элементы коллекции
For Each objInstance In collnstances
1 Выводим на экран предупреждение
WScript.Echo "На компьютере " & objInstance.CSNAME & VbCrLf &_
"сеанс текущего пользователя будет завершен "
1 Для каждого экземпляра вызываем метод Win32Shutdown
objInstance.Win32Shutdown(0)
Next
i ************************* Конец ***********************************
Перезагрузка компьютера
Для перезагрузки компьютера необходимо использовать метод Reboot
Объекта Win32_OperatingSystem (ЛИСТИНГ 6.2).
Листинг 6.2. Перезагрузка компьютера
I ******•***********************************••**•••••••••*•••**•*****
' Имя: Reboot.vbs
' Язык: VBScript
' Описание: Перезагрузка компьютера
I*******************************************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim collnstances ' Коллекция экземпляров класса WMI
Dim objInstance ' Элемент коллекции
i ********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"
1 Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:{(Shutdown,RemoteShutdown)}\\" &_
strComputer & "\" & strNamespace & ":" & strClass)
' Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set collnstances = objClass.Instances_
' Перебираем элементы коллекции
For Each objInstance In collnstances
' Выводим на экран предупреждение
WScript.Echo "Компьютер " & objInstance.CSNAME &_
" будет перезагружен "
1 Для каждого экземпляра вызываем метод Reboot
objInstance.Reboot()
Next
i ************************* конец ***********************************
Выключение компьютера
В сценарии Shutdown.vbs (листинг 6.3) кроме непосредственного
выключения компьютера реализована обработка возможных ошибок.
Листинг 6.3. Выключение компьютера
• ***•*****•*•*****•••*••****•****••***•******^
' Имя: Shutdown.vbs
' Язык: VBScript
' Описание: Выключение компьютера
■••••••••••••••************^
Option Explicit
On Error Resume Next
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colInstances ' Коллекция экземпляров класса WMI
Dim objInstance ' Элемент коллекции
Dim iAnswer ' Код возврата функции MsgBox
t *•••*****••••••••*•*•• Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"
' Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:{(Shutdown,RemoteShutdown)}\\" &
strComputer & _
"\" & strNamespace & ":" & strClass)
1 Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set collnstances = objClass.Instances_
' Перебираем элементы коллекции
For Each objInstance In collnstances
1 Выводим на экран предупреждение
iAnswer = MsgBox("Выключить компьютер " & objInstance.CSNAME & " ?", _
vbQuestion + vbOKCancel, "Внимание!")
If iAnswer = vbOK Then
' Выводим сообщение о перезагрузке
WScript.Echo "Компьютер " & objInstance.CSNAME & " будет выключен"
' Вызываем метод Shutdown
obj Instance.Shutdown()
If Err.number <> 0 Then
WScript.Echo "Номер ошибки: " & Err.Number & vbNewLine & _
"Описание: " & Err.Description
End If
Else
' Выводим сообщение об отмене операции
WScript.Echo "He будем пока выключать"
End if
Next
t **•*••****•*•*******••*** Коней. *************************************
Получение и анализ системной информации
Листинги 6.4-6.10 содержат сценарии, позволяющие получить информацию
об операционной системе (серийный номер, номер сборки, номер
последнего обновления, дата установки, кодовая страница, список установленного
программного обеспечения, список команд, которые выполняются
автоматически при старте системы, и т. д.) и о BIOS компьютера (производитель,
серийный номер, номер сборки и т. д.).
Определение роли компьютера в домене
Определить роль, которую компьютер играет в домене, можно с помощью
свойства DomainRole соответствующего экземпляра класса
Win32_ComputerSystem (ЛИСТИНГ 6.4).
Листинг 6.4. Определение роли компьютера в домене
i••••••*••••*••••*•••••••••*•••*•••••*•••*•••*•••*•••••••*••••••••
' Имя: ComputerRole.vbs
' Язык: VBScript
' Описание: Определение роли компьютера в домене
I ••••••**•*••**••*•••**•••***••••••*•••••***•••*
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim collnstances ' Коллекция экземпляров класса WMI
Dim objInstance ' Элемент коллекции
Dim strComputerRole ' Роль компьютера в домене
»*••****•*•*****•****** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_ComputerSystem"
' Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
1 Создаем коллекцию экземпляров класса Win32_ComputerSystem
Set collnstances = objClass.Instances_
' Перебираем элементы коллекции
For Each objInstance In collnstances
' Выделяем описание роли компьютера
Select Case objInstance.DomainRole
Case 0
strComputerRole = "Standalone Workstation"
Case 1
strComputerRole = "Member Workstation"
Case 2
strComputerRole = "Standalone Server"
Case 3
strComputerRole = "Member Server"
Case 4
strComputerRole = "Backup Domain Controller"
Case 5
strComputerRole = "Primary Domain Controller"
End Select
' Выводим результат на экран
Wscript.Echo "Роль компьютера " & strComputer & ": " &
strComputerRole
Next
i ••*••••••*•**•••*•**•*••• Конец ***********************************
Вывод информации о BIOS
В сценарии BlOSInfo.vbs (листинг 6.5) на экран выводятся некоторые
свойства объекта win32_Bios, в котором хранятся параметры и характеристики
BIOS, установленной на компьютере.
Листинг 6.5. Вывод информации о BIOS
• ••*••••••••••*••••*•••••••••••*•••••••••••••••••••••••••••••••••••**••••
1 Имя: BlOSInfo.vbs
' Язык: VBScript
' Описание: Вывод информации о BIOS
i •••••••*•*•••*••••*••••**••••*••••*•••••••••*•••••*•••*■*••••••••••••
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim collnstances ' Коллекция экземпляров класса WMI
Dim objBIOS * Элемент коллекции
Dim strResult ' Результирующая строка
t *••••**•*•**•********* Начало ******************************+**++**
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_BIOS"
strResult = "Информация о BIOS :" & VbCrLf
1 Получаем указатель на класс WMI
Set objClass = GetObject("winmgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
1 Создаем коллекцию экземпляров класса Win32_BIOS
Set collnstances = objClass.Instances_
' Перебираем элементы коллекции
For Each objBIOS in collnstances
strResult = strResult & "Name: " & objBIOS.Name & VbCrLf
strResult = strResult & "Manufacturer: " & objBIOS.Manufacturer &_
VbCrLf
strResult = strResult & "Caption: " & objBIOS.Caption & VbCrLf
strResult = strResult & "Description: " & objBIOS.Description & VbCrLf
strResult = strResult & "Build Number: " & objBIOS.BuildNumber & VbCrLf
strResult = strResult & "Current Language: " & objBIOS.CurrentLanguage_
& VbCrLf
strResult = strResult & _
"Installable Languages: " & objBIOS.InstallableLanguages & VbCrLf
strResult = strResult & "Primary BIOS: " & objBIOS.PrimaryBIOS & VbCrLf
strResult = strResult & "Release Date: " & objBIOS.ReleaseDate & VbCrLf
strResult = strResult & "Serial Number: " & objBIOS.SerialNumber &_
VbCrLf
strResult = strResult & "SMBIOS Version: " & _
objBIOS.SMBIOSBIOSVersion & VbCrLf
strResult = strResult & _
"SMBIOS Major Version: " & objBIOS.SMBIOSMajorVersion & VbCrLf
strResult = strResult & _
"SMBIOS Minor Version: " & objBIOS. SMBIOSMinorVersioA & VbCrLf
strResult = strResult & "SMBIOS Present: " & objBIOS.SMBIOSPresent _
& VbCrLf
strResult = strResult & "Status: " & objBIOS.Status & VbCrLf
strResult = strResult & "Version: " & objBIOS.Version & VbCrLf
Next
'Выводим строку на экран
WScript.Echo strResult
!••****•*•••••••*••••••••* Конец ***********************************
Вывод списка команд, выполняемых
при загрузке системы
Все команды, которые выполняются автоматически при старте системы,
хранятся в WMI в виде экземпляров класса win32_startupCommand.
Сценарий StartupCommand.vbs, представленный в листинге 6.6, выводит эти
команды на экран.
Листинг 6.6. Определение команд, выполняемых при загрузке компьютера
■••••••••••••••••••••••*•••
' Имя: StartupCommand.vbs
' Язык: VBScript
' Описание: Вывод списка команд, выполняемых при загрузке компьютера
!•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colStartupCommands' Коллекция экземпляров класса WMI
Dim objStartupCommand ' Элемент коллекции
Dim strResult ' Строка для вывода на экран
t ••*•••*••*•••**•*•*••• Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_StartupCommand"
strResult = "Команды, выполняемые при загрузке компьютера :" & VbCrLf
' Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
1 Создаем коллекцию экземпляров класса Win32_StartupCommand
Set colStartupCommands = objClass.Instances_
' Перебираем элементы коллекции
For Each objStartupCoramand in colStartupCommands
strResult = strResult & objStartupCommand.Command & VbCrLf
Next
' Выводим результат на экран
WScript.Echo strResult
t ••••••••*••*•*•••*•••••*• Коней. ***********************************
Вывод свойств операционной системы
Основные свойства установленной операционной системы (загрузочное
устройство, номер сборки, дата установки и т. д.) можно получить с помощью
объекта Win32_OperatingSystem (ЛИСТИНГ 6.7).
Листинг 6.7. Вывод свойств операционной системы
■•••••*•*•••*•••*••••*••••*•*•**•••••
' Имя: OSProperty.vbs
1 Язык: VBScript
1 Описание: Вывод свойств операционной системы
•••••••••••*•••••••••••••••*•**•*•
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colOperatingSystems' Коллекция экземпляров класса WMI
Dim objOperatingSystem ' Элемент коллекции
Dim strResult ' Строка для вывода на экран
t ••**••••••*•••*■*■**•••*• Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"
strResult = " Свойства операционной системы: " & VbCrLf & VbCrLf
'^Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
' Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set colOperatingSystems = objClass.Instances_
' Перебираем элементы коллекции
For Each objOperatingSystem in colOperatingSystems
' Формируем строку для вывода на экран
strResult = strResult & "Boot Device: " & _
objOperatingSystern.BootDevice & VbCrLf
strResult = strResult & "Build Number: " & _
objOperatingSystern.BuildNumber & VbCrLf
strResult = strResult & "Build Type: " & _
objOperatingSystern.BuildType & VbCrLf
strResult = strResult & "Caption: " & _
objOperatingSystern.Caption & VbCrLf
strResult = strResult & "Code Set: " & _
objOperatingSystem.CodeSet & VbCrLf
strResult = strResult & "Country Code: " & _
objOperatingSystem.CountryCode & VbCrLf
strResult = strResult & "Install Date: " & _
objOperatingSystern.InstallDate & VbCrLf
strResult = strResult & "Licensed Users: " & _
objOperatingSystern.NumberOfLicensedUsers & VbCrLf
strResult = strResult & "Organization: " & _
objOperatingSystern.Organization & VbCrLf
strResult = strResult & "OS Language: " & _
objOperatingSystem.OSLanguage & VbCrLf
strResult = strResult & "OS Product Suite: " & _
objOperatingSystem.OSProductSuite & VbCrLf
strResult = strResult & "OS Type: " & _
objOperatingSystem.OSType & VbCrLf
strResult = strResult & "Primary: " & _
objOperatingSystern.Primary & VbCrLf
strResult = strResult & "Registered User: " & _
objOperatingSystem.RegisteredUser & VbCrLf
strResult = strResult & "Serial Number: " & _
objOperatingSystern.SerialNumber & VbCrLf
strResult = strResult & "Version: " & _
objOperatingSystem.Version & VbCrLf
Next
' Выводим результат на экран
WScript.Echo strResult
»*••••*••******••*•*•*••*• Коней ***********************************
Определение номера последнего обновления,
установленного на компьютере
Сценарий ServPack.vbs, приведенный в листинге 6.8, выводит на экран номер
последнего обновления (ServicePack), которое было установлено на
компьютере (свойства ServicePackMajorVersion И ServicePackMinorVersion объекта
Win32_OperatingSystem).
Листинг 6.8. Определение номера последнего обновления
I •••••*•••***•*•••••••••••••*•••••••••*•*•••••••••••••*•••••••••••••
1 Имя: ServPack. vbs
' Язык: VBScript
' Описание: Вывод номера ServicePack для операционной системы
■••••••а******************************************
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colOperatingSystems ' Коллекция экземпляров класса WMI
Dim objOperatingSystern ' Элемент коллекции
Dim strResult ' Строка для вывода на экран
t •••**•••*•••*••••••••• Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"
strResult = "ServicePack установленный на этом компьютере " & VbCrLf
' Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
1 Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set colOperatingSystems = objClass.Instances_
' Перебираем элементы коллекции
For Each objOperatingSystem in colOperatingSystems
' Формируем строку для вывода на экран
strResult = strResult & "N* " & _
objOperatingSystern.ServicePackMajorVersion & "." &_
objOperatingSystern.ServicePackMinorVersion & VbCrLf
Next
' Выводим результирующую строку на экран
Wscript.Echo strResult
t *••*•*••*•**•**•••*••*••• Конец ***********************************
Вывод списка
установленных программных продуктов
Сценарий InstalledSoftware.vbs (листинг 6.9) выводит в текстовый файл
C:\InstalledSoftware.txt список всех программ, которые были установлены на
компьютере с помощью Windows Installer (каждой такой программе
соответствует экземпляр класса win32_product). Сформированный файл затем
автоматически открывается в Блокноте.
Листинг 6.9. Вывод информации о программах, установленных с помощью
Windows Installer
!•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••*•••
' Имя: InstalledSoftware.vbs
' Язык: VBScript
' Описание: Вывод списка установленных программных продуктов
!•••••••••••••••••••••••••••••••••••••••••••••••••
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colSoftware ' Коллекция экземпляров класса WMI
Dim objSoftware ' Элемент коллекции
Dim strResult ' Результирующая строка
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
1 Константа для задания режима открытия файла
Const ForWriting = 2
1 Процедура для записи информации в файл
Sub TextOut (Text, File)
1 Объявляем переменные
Dim objFSO, FOut
1 Создаем объект FileSystemObject
Set objFSO=WScript.CreateObject("Scripting.FileSystemObject")
1 Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
1 Закрываем выходной файл
FOut.Close
End Sub
i ••••••*••***•••••*•••• Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_Product"
strResult = "Список установленных программных продуктов: " & VbCrLf
1 Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
' Создаем коллекцию экземпляров класса Win32_Product
Set colSoftware = objClass.Instances_
1 Перебираем элементы коллекции
For Each objSoftware in colSoftware
1 Формируем строку для вывода на экран
strResult = strResult &_
" Name: " & obj Software. Name & VbCrLf & _
vbTab & "Caption: " & objSoftware.Caption & VbCrLf & _
vbTab & "Description: " & objSoftware.Description & VbCrLf & _
vbTab & "IdentifyingNumber: " & objSoftware.IdentifyingNumber & __
VbCrLf & _
vbTab & "InstallLocation: " & objSoftware.InstallLocation & VbCrLf _
& vbTab & "InstallState: " & objSoftware.InstallState & VbCrLf & _
vbTab & "PackageCache: " & objSoftware.PackageCache & VbCrLf & _
vbTab & "SKUNumber: " & objSoftware.SKUNumber & VbCrLf & __
vbTab & "Vendor: " & objSoftware.Vendor & VbCrLf & _
vbTab & "Version: " & objSoftware.Version & VbCrLf & VbCrLf
Next
1 Выводим результат в файл с помощью функции TextOut
TextOut strResult, "C:\InstalledSoftware.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShel1.Exec("notepad " & "C:\InstalledSoftware.txt" )
t ************************* Конец ***********************************
Вывод списка установленных программных
продуктов со всеми компонентами
В сценарии Software Features, vbs (листинг 6.10) в файл C:\SoftwareFeatures.txt
выводится информация о всех компонентах программ (экземплярах класса
win32_softwareFeature), которые были установлены на компьютере с
помощью Windows Installer. Сформированный файл затем автоматически
открывается в Блокноте.
Листинг 6.10. Вывод информации о всех компонентах программ,
установленных с помощью Windows Installer
i********************************^
1 Имя: SoftwareFeatures.vbs
1 Язык: VBScript
1 Описание: Вывод списка установленных программных продуктов
1 со всеми компонентами
Option Explicit
1 Объявляем переменные
Dim strComputer * Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colFeatures ' Коллекция экземпляров класса WMI
Dim objFeature ' Элемент коллекции
Dim strResult ' Результирующая строка
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
1 Константа для задания режима открытия файла
Const ForWriting = 2
1 Процедура для записи информации в файл
Sub TextOut (Text, File)
1 Объявляем переменные
Dim obj FSO, FOut
1 Создаем объект FileSystemObject
Set objFSO=WScript.CreateObject("Scripting.FileSystemObject")
1 Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File.. ForWriting, true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
1 Закрываем выходной файл
FOut.Close
End Sub
»********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_SoftwareFeature"
strResult = "Компоненты установленных программных " &_
" продуктов:" & VbCrLf
1 Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
' Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set colFeatures = objClass.Instances_
1 Перебираем элементы коллекции
For Each objFeature in colFeatures
1 Формируем строку для вывода на экран
strResult = strResult &_
"Name: " & objFeature.Name & VbCrLf &_
"Product Name: " & objFeature.ProductName & VbCrLf &__
vbtab & "Accesses: " & objFeature.Accesses & VbCrLf &_
vbtab & "Attributes: " & objFeature.Attributes & VbCrLf &_
vbtab & "Caption: " & objFeature.Caption & VbCrLf &_
vbtab & "Description: " & objFeature.Description & VbCrLf &_
vbtab & "Identifying Number: " & objFeature.IdentifyingNumber _
& VbCrLf 8c_
vbtab & "Install Date: " & objFeature.InstallDate & VbCrLf &_
vbtab & "Install State: " & objFeature.InstallState & VbCrLf &_
vbtab & "Last Use: " & objFeature.LastUse & VbCrLf &_
vbtab & "Name: " & objFeature.Name & VbCrLf &_
vbtab & "Vendor: " & objFeature.Vendor & VbCrLf &_
vbtab & "Version: " & objFeature.Version & VbCrLf & VbCrLf
Next
1 Выводим результат в файл с помощью функции TextOut
TextOut strResult, "C:\SoftwareFeatures.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad " & "C:\SoftwareFeatures.txt" )
i ************************* Коней ***********************************
Сбор сведений
о подключенных устройствах
С помощью сценариев WMI можно быстро собрать информацию о
параметрах и характеристиках различных устройств компьютера (процессор, память,
клавиатура, мышь, параллельные и последовательные порты, звуковая и
видеокарта, сетевой адаптер и т. д.). В листингах 6.11—6.20 приведены
примеры таких сценариев.
Получение информации о процессоре
Каждому процессору в WMI соответствует экземпляр класса win32_Processor.
В сценарии Processorlnfo.vbs (листинг 6.11) наиболее важные свойства таких
экземпляров выводятся в текстовый файл C:\Processor.txt, который затем
открывается с помощью Блокнота.
I*******************************************
' Имя: Processorlnfo.vbs
1 Язык: VBScript
1 Описание: Вывод свойств установленных процессоров
****************************************************
Option Explicit
On Error Resume Next
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemServices
Dim colProcessors ' Коллекция экземпляров класса WMI
Dim objProcessor ' Элемент коллекции
Dim strResult ' Результирующая строка
Dim WshShell ' Объект WshShell
Листинг 6.11. Вывод информации о процессоре
Dim theNotepad ' Объект WshScriptExec
1 Объявляем константы
Const wbemFlagForwardOnly =32
Const wbemFlagReturnImmediately = 16
Const ForWriting = 2
1 Процедура для записи информации в файл
Sub TextOut (Text, File)
' Объявляем переменные
Dim objFSO, FOut
' Создаем объект FileSystemObject
Set objFSO=WScript.CreateObj ect("Scripting.FileSystemObj ect")
' Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
' Закрываем выходной файл
FOut.Close
End Sub
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Информация о процессорах " & VbCrLf & VbCrLf
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
' Создаем коллекцию экземпляров класса Win32_Processor
Set colProcessors = objService.ExecQuery(_
"SELECT * FROM Win32_Processor",,_
wbeniFlagReturnlmmediately+wbemFlagForwardOnly)
For Each objProcessor In colProcessors
strResult = strResult & "Address Width: " & _
objProcessor.AddressWidth & VbCrLf
strResult = strResult & "Architecture: " & _
objProcessor.Architecture & VbCrLf
strResult = strResult & "Caption: " & _
objProcessor.Caption & VbCrLf
strResult = strResult & "Cpu Status: " & _
objProcessor.CpuStatus & VbCrLf
strResult = strResult & "Current Clock Speed: " & _
objProcessor.CurrentClockSpeed & VbCrLf
strResult = strResult & "Current Voltage: " & _
objProcessor.CurrentVoltage & VbCrLf
strResult = strResult & "Data Width: " & _
objProcessor.DataWidth & VbCrLf
strResult = strResult & "Description: " & _
objProcessor.Description & VbCrLf
strResult = strResult & "Device ID: " & _
objProcessor.DevicelD & VbCrLf
strResult = strResult & "ExtClock: " & _
objProcessor.ExtClock & VbCrLf
strResult = strResult & "Family: " & _
objProcessor.Family & VbCrLf
strResult = strResult & "Install Date: " & _
objProcessor.InstallDate & VbCrLf
strResult = strResult & "L2 Cache Size: " & _
objProcessor.L2CacheSize & VbCrLf
strResult = strResult & "L2 Cache Speed: " & _
objProcessor.L2CacheSpeed & VbCrLf
strResult = strResult & "Level: " & _
objProcessor.Level & VbCrLf
strResult = strResult & "Manufacturer: " & _
objProcessor.Manufacturer & VbCrLf
strResult = strResult & "Maximum Clock Speed: " & _
objProcessor.MaxClockSpeed & VbCrLf
strResult = strResult & "Name: " & _
objProcessor.Name & VbCrLf
strResult = strResult & "Power Management Supported: " & _
objProcessor.PowerManagementSupported & VbCrLf
strResult = strResult & "Processor Id: " & _
objProcessor.Processorld & VbCrLf
strResult = strResult & "ProcessorType: " & _
objProcessor.ProcessorType & VbCrLf
strResult = strResult & "Revision: " & _
objProcessor.Revision & VbCrLf
strResult = strResult & "Socket Designation: " & _
objProcessor.SocketDesignation & VbCrLf
strResult = strResult & "Status: " & _
objProcessor.Status & VbCrLf
strResult = strResult & "Statuslnfo: " & _
objProcessor.Statuslnfо & VbCrLf
strResult = strResult & "Stepping: " & _
objProcessor.Stepping & VbCrLf
strResult = strResult & "Version: " & _
objProcessor.Version & VbCrLf
strResult = strResult & "********************************" & VbCrLf _
& VbCrLf
Next
1 Выводим результат в текстовый файл
TextOut strResult, "C:\Processor.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObjееt("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShel1.Exec("notepad " & "C:\Processor.txt" )
i ************************* Коней ***********************************
Получение информации о физической памяти
Получить информацию о банках физической памяти компьютера позволяют
экземпляры класса win32_physicaiMemory. Сценарий Memorylnfo.vbs
(листинг 6.12) выводит на экран наиболее важные свойства этих экземпляров.
Листинг 6.12. Вывод информации о физической памяти
' Имя: Memorylnfo.vbs
1 Язык: VBScript
1 Описание: Вывод информации о физической памяти
Option Explicit
1 Объявляем переменные
Dim strComputer * Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colPhysMemory ' Коллекция экземпляров класса WMI
Dim objPhysMemory ' Элемент коллекции
Dim strResult ' Результирующая строка
»********************** Начало **************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_PhysicalMemory"
strResult = "Информация о физической памяти:" & vbCrLf & vbCrLf
1 Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
1 Создаем коллекцию экземпляров класса Win32_PhysicalMemory
Set colPhysMemory = objClass.Instances_
1 Перебираем коллекцию
For Each objPhysMemory In colPhysMemory
strResult = strResult & "Bank Label: " & _
objPhysMemory.BankLabel & VbCrLf
strResult = strResult & "Capacity: " & _
objPhysMemory.Capacity & VbCrLf
strResult = strResult & "Data Width: " & _
objPhysMemory.DataWidth & VbCrLf
strResult = strResult & "Description: " & _
obj PhysMemory. Description & VbCrLf
strResult = strResult & "Device Locator: " & _
objPhysMemory.DeviceLocator & VbCrLf
strResult = strResult & "Form Factor: " & _
objPhysMemory.FormFactor & VbCrLf
strResult = strResult & "Hot Swappable: " & _
objPhysMemory.HotSwappable & VbCrLf
strResult = strResult & "Manufacturer: " & _
objPhysMemory.Manufacturer & VbCrLf
strResult = strResult & "Memory Type: " & _
obj PhysMemory. МешогуТуре & VbCrLf
strResult = strResult & "Name: " & _
obj PhysMemory. Name & VbCrLf
strResult = strResult & "Part Number: " & _
objPhysMemory.PartNumber & VbCrLf
strResult = strResult & "Speed: " & _
objPhysMemory.Speed & VbCrLf
strResult = strResult & "Tag: " & _
obj PhysMemory. Tag & VbCrLf
strResult = strResult & "Type Detail: " & _
objPhysMemory.TypeDetail & VbCrLf
Next
1 Выводим результат на экран
WScript.Echo strResult
i ************************* Коней ************************■*■***■**■*■*■'*■'*■'*■
Получение списка устройств Plug-and-Play
В сценарии PnPDevicelnfo.vbs (листинг 6.13) формируется текстовый файл
C:\PnP.txt с описанием всех установленных устройств Plug-and-Play (в WMI
им соответствуют экземпляры класса win32_PnPEntity). Полученный файл
затем открывается с помощью Блокнота.
Листинг 6.13. Вывод информации об устройствах Plug-and-Play
1*******************************************^
1 Имя: PnPDevicelnfo.vbs
1 Язык: VBScript
1 Описание: Вывод списка установленных РпР-устройств
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemServices
Dim colPnPEntities ' Коллекция экземпляров класса WMI
Dim objPnPEntity ' Элемент коллекции
Dim strResult ' Результирующая строка
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
1 Объявляем константы
Const wbemFlagForwardOnly =32
Const wbemFlagReturnlmmediately =16
Const ForWriting = 2
1 Процедура для записи информации в файл
Sub TextOut (Text, File)
1 Объявляем переменные
Dim obj FSO, FOut
1 Создаем объект FileSystemObject
Set objFSO=WScript.CreateObject("Scripting.FileSystemObject")
1 Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
1 Закрываем выходной файл
FOut.Close
End Sub
i ********************** начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Зарегистрированные PnP-устройства " & VbCrLf & VbCrLf
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
' Создаем коллекцию экземпляров класса Win32_PnPEntity
Set colPnPEntities=objService.ExecQuery("SELECT * FROM Win32_PnPEntity"_
,,wbemFlagReturnlmmediately+wbemFlagForwardOnly)
1 Перебираем элементы коллекции
For Each objPnPEntity In colPnPEntities
strResult = strResult & "Class GUID: " & _
objPnPEntity.ClassGuid & VbCrLf
strResult = strResult & "Description: " & _
objPnPEntity.Description & VbCrLf
strResult = strResult & "Device ID: " & _
objPnPEntity.DeviceID & VbCrLf
strResult = strResult & "Manufacturer: " & _
objPnPEntity.Manufacturer & VbCrLf
strResult = strResult & "Name: " & _
objPnPEntity.Name & VbCrLf
strResult = strResult & "PNP Device ID: " & _
objPnPEntity.PNPDevicelD & VbCrLf
strResult = strResult & "Service: " & _
objPnPEntity.Service & VbCrLf
strResult = strResult & и********************************* & VbCrLf & VbCrLf
Next
1 Выводим результат в текстовый файл
TextOut strResult, "C:\PnP.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShe11.Exec("notepad " & "C:\PnP.txt" )
t ■*■••■*■■*■•••••■*■*•■*■■*■■*■■*■■*■*•■*■■*■*••*•■*■■*■*• Коней ***********************************
Получение информации о клавиатуре
Сценарий Keyboard.vbs, представленный в листинге 6.14, выводит на экран
сведения о клавиатуре, которые хранятся в соответствующих свойствах
класса Win32_Keyboard.
Листинг 6.14. Вывод информации о клавиатуре
■ ***•*•****•••••••••••••••*••*••••**•*••••*••••*•**•••*•
' Имя: Keyboard.vbs
1 Язык: VBScript
1 Описание: Вывод информации о клавиатуре
»•*••••*••••••*••••••**•**••••*•••••**•**••••*•••*•••••••••*•••••*••
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colKeyboards ' Коллекция экземпляров класса WMI
Dim objKeyboard ' Элемент коллекции
Dim strResult ' Результирующая строка
i *********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = " „Keyboard"
strResult = "Информация о клавиатуре:" & vbCrLf & vbCrLf
' Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" Sc strNamespace & ":" & strClass)
' Создаем коллекцию экземпляров класса Win32_Keyboard
Set colKeyboards = objClass.Instances_
1 Перебираем элементы коллекции
For Each objKeyboard In colKeyboards
strResult = strResult & "Caption: " & _
objKeyboard.Caption & VbCrLf
strResult = strResult & "Description: " & _
objKeyboard.Description & VbCrLf
strResult = strResult & "Device ID: " & _
objKeyboard.DeviceID & VbCrLf
strResult = strResult & "Layout: " & _
objKeyboard.Layout & VbCrLf
strResult = strResult & "Name: " & _
objKeyboard.Name & VbCrLf
strResult = strResult & "Number of Function Keys: " & _
objKeyboard.NumberOfFunctionKeys & VbCrLf
strResult = strResult & "PNP Device ID: " & _
obj Keyboard.PNPDevicelD
Next
1 Выводим результат на экран
WScript.Echo strResult
»*************************** Коней ***********************************
Получение информации о мыши
Информацию о манипуляторе мышь можно получить с помощью свойств
экземпляра класса win32_PointingDevice. Данная операция реализована
в сценарии Mouse In fo.vbs (листинг 6.15).
Листинг 6.15. Вывод информации о мыши
'••••••••••••*•••*•••*••••••••••••••••*•••**••••**••
1 Имя: Mouselnfo.vbs
' Язык: VBScript
1 Описание: Вывод информации о мыши
■••••••***••••••••••**•••••••**•••***••**••••••*•••••••*•
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colMice ' Коллекция экземпляров класса WMI
Dim objMouse ' Элемент коллекции
Dim strResult ' Результирующая строка
t **••*•*•**••**••*•*••* Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_PointingDevice"
strResult = "Информация о мыши:" & vbCrLf & vbCrLf
' Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" Sc strNamespace & ":" & strClass)
1 Создаем коллекцию экземпляров класса Win32_PointingDevice
Set colMice = objClass.Instances_
1 Перебираем элементы коллекции
For Each objMouse In colMice
strResult = strResult & "Hardware Type: " & _
objMouse.HardwareType & VbCrLf
strResult = strResult & "Number of Buttons: " & _
objMouse.NumberOfButtons & VbCrLf
strResult = strResult & "Status: " & objMouse.Status & VbCrLf
strResult = strResult & "PNP Device ID: " & objMouse.PNPDeviceID
Next
1 Выводим результат на экран
WScript.Echo strResult
»••••••••••••****•*•*••••• Коней ************************■*''*'*''*''*•'*'•*•*'*■'*''*'
Получение информации о параллельных
и последовательных портах
Для хранения информации о параллельных и последовательных портах в WMI
ИСПОЛЬЗУЮТСЯ классы Win32_ParallelPort (ЛИСТИНГ 6.16) И Win32_SerialPort
(листинг 6.17) соответственно.
••••••••••••••••••••••••••••••••••••••^
1 Имя: ParallelPortlnfo.vbs
1 Язык: VBScript
1 Описание: Вывод информации о параллельных портах
i •••••••••••••••••••*••••••••••••••••••••••*••*••••••*••*••***•*****
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Листинг 6.16. Вывод информации о параллельнь.х портах
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colPorts ' Коллекция экземпляров класса WMI
Dim objPort ' Элемент коллекции
Dim strCapability ' Поддерживаемые режимы порта
Dim strResult ' Результирующая строка
t •••••*•*••**•••***••••• Начало ***************************************
1 Присваиваем начальные значения переменным
strComputer =
strNamespace = "Root\CIMV2"
strClass = "Win32_ParallelPort"
strResult = "Информация о параллельных портах:" & vbCrLf & vbCrLf
1 Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" Sc strNamespace & ":" & strClass)
' Создаем коллекцию экземпляров класса Win32_ParallelPort
Set colPorts = objClass.Instances_
1 Перебираем элементы коллекции
For Each objPort In colPorts
strResult = strResult & "Availability: " & _
objPort.Availability & VbCrLf
For Each strCapability In objPort.Capabilities
strResult = strResult & "Capability: " & _
strCapability & VbCrLf
Next
strResult = strResult & "Description: " & _
objPort.Description & VbCrLf
strResult = strResult & "Device ID: " & _
objPort.DevicelD & VbCrLf
strResult = strResult & "Name: " & _
objPort.Name & VbCrLf
strResult = strResult & "OS Auto Discovered: " & _
objPort.OSAutoDiscovered & VbCrLf
strResult = strResult & "PNP Device ID: " & _
objPort.PNPDevicelD & VbCrLf
strResult = strResult & "Protocol Supported: " & _
objPort.ProtocolSupported & VbCrLf
Next
1 Выводим результат на экран
WScript.Echo strResult
t •****•*•*******•*****•*** Коней ***********************************
••••••••••••••••••••••••*•••••••••*****•*••••••••*••••••••
1 Имя: SerialPortlnfo.vbs
' Язык: VBScript
' Описание: Вывод информации о последовательных портах
■•*•**••••*••*••*•*•••••••••••*••***•**•**••••••••
Option Explicit
On Error Resume Next
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colPorts ' Коллекция экземпляров класса WMI
Dim objPort ' Элемент коллекции
Dim strCapability ' Поддерживаемые режимы порта
Dim strResult ' Результирующая строка
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
1 Объявляем константы
Const wbemFlagForwardOnly =32
Const wbemFlagReturnlmmediately = 16
Const ForWriting = 2
1 Процедура для записи информации в файл
Sub TextOut (Text, File)
1 Объявляем переменные
Dim objFSO, FOut
1 Создаем объект FileSystemObject
Set objFSO=WScript.CreateObj ect("Scripting.FileSystemObj ect")
Листинг 6.17. Вывод информации о последовательных портах
' Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
' Записываем текстовую строку в файл
FOut.WriteLine Text
1 Закрываем выходной файл
FOut.Close
End Sub
t *********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_SerialPort"
strResult = "Информация о последовательных портах:" & vbCrLf & vbCrLf
1 Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" & strNamespace & ":" & strClass)
' Создаем коллекцию экземпляров класса Win32_ParallelPort
Set colPorts = objClass.Instances_
' Перебираем элементы коллекции
For Each objPort In colPorts
strResult = strResult & "Binary: " & _
objPort.Binary & VbCrLf
strResult = strResult & "Description: " & _
objPort.Description & VbCrLf
strResult = strResult & "Device ID: " & _
objPort.DevicelD & VbCrLf
strResult = strResult & "Maximum Baud Rate: " & _
objPort.MaxBaudRate & VbCrLf
strResult = strResult & "Maximum Input Buffer Size: " & _
objPort.MaximumlnputBufferSize & VbCrLf
strResult = strResult & "Maximum Input Buffer Size: " & _
objPort.MaximumlnputBufferSize & VbCrLf
strResult = strResult & "Maximum Output Buffer Size: " & _
objPort.MaximumOutputBufferSize & VbCrLf
strResult = strResult & "Name: " & _
objPort.Name & VbCrLf
strResult = strResult & "OS Auto Discovered: " & _
objPort.OSAutoDiscovered & VbCrLf
strResult = strResult & "PNP Device ID: " & _
objPort.PNPDevicelD & VbCrLf
strResult = strResult & "Provider Type: " & _
objPort.ProviderType & VbCrLf
strResult = strResult & "Settable Baud Rate: " & _
objPort.SettableBaudRate & VbCrLf
strResult = strResult & "Settable Data Bits: " & _
objPort.SettableDataBits & VbCrLf
strResult = strResult & "Settable Flow Control: " & _
objPort.SettableFlowControl & VbCrLf
strResult = strResult & "Settable Parity: " & _
objPort.SettableParity & VbCrLf
strResult = strResult & "Settable Parity Check: " & _
objPort.SettableParityCheck & VbCrLf
strResult = strResult & "Settable RLSD: " & _
objPort.SettableRLSD & VbCrLf
strResult = strResult & "Settable Stop Bits: " & _
objPort.SettableStopBits & VbCrLf
strResult = strResult & "Supports 16-Bit Mode: " & _
objPort.Supports16BitMode & VbCrLf
strResult = strResult & "Supports DTRDSR: " & _
objPort.SupportsDTRDSR & VbCrLf
strResult = strResult & "Supports Elapsed Timeouts: " & _
objPort.SupportsElapsedTimeouts & VbCrLf
strResult = strResult & "Supports Int Timeouts: " & _
objPort.SupportsIntTimeouts & VbCrLf
strResult = strResult & "Supports Parity Check: " & _
objPort.SupportsParityCheck & VbCrLf
strResult = strResult & "Supports RLSD: " & _
objPort.SupportsRLSD & VbCrLf
strResult = strResult & "Supports RTSCTS: " & _
objPort.SupportsRTSCTS & VbCrLf
strResult = strResult & "Supports Special Characters: " & _
objPort.SupportsSpecialCharacters & VbCrLf
strResult = strResult & "Supports XOn XOff: " & _
objPort.SupportsXOnXOff & VbCrLf
strResult = strResult & "Supports XOn XOff Setting: " & _
objPort.SupportsXOnXOffSet & VbCrLf
Next
' Выводим результат в текстовый файл
TextOut strResult, "C:\Ports.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShel1.Exec("notepad " & "C:\Ports.txt" )
»*••••••*•••••*••••***••*• Коней ***********************************
Получение информации о звуковой карте
Сценарий SoundCardlnfo.vbs (листинг 6.18) выводит на экран настройки
установленной в компьютере звуковой карты, доступ к которым
осуществляется С ПОМОЩЬЮ Экземпляра Класса Win32_SoundDevice.
Листинг 6.18. Вывод информации о звуковой карте
■ •*•*•*••**••••*•*••*•**•**••***••*••***•••*•••••*******•
• Имя: SoundCardlnfo.vbs
1 Язык: VBScript
' Описание: Вывод информации о звуковой карте
■••••••••••••••••••••••••••••••••••••••••••••••••••а*
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colSoundCards ' Коллекция экземпляров класса WMI
Dim objSoundCard ' Элемент коллекции
Dim strResult ' Результирующая строка
»-А-********************* Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_SoundDevice"
strResult = "Информация о звуковой карте:" & vbCrLf & vbCrLf
1 Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" Sc strNamespace & ":" & strClass)
' Создаем коллекцию экземпляров класса Win32_SoundDevice
Set colSoundCards = objClass.Instances_
1 Перебираем элементы коллекции
For Each objSoundCard in colSoundCards
strResult = strResult & "Description: " & _
objSoundCard.Description & VbCrLf
strResult = strResult & "Device ID: " & _
objSoundCard.DeviceID & VbCrLf
strResult = strResult & "DMA Buffer Size: " & _
objSoundCard.DMABufferSize & VbCrLf
strResult = strResult & "Manufacturer: " & _
objSoundCard.Manufacturer & VbCrLf
strResult = strResult & "MPU 401 Address: " & _
objSoundCard.MPU401Address & VbCrLf
strResult = strResult & "Name: " & _
objSoundCard.Name & VbCrLf
strResult = strResult & "PNP Device ID: " & _
objSoundCard.PNPDevicelD & VbCrLf
strResult = strResult & "Product Name: " & _
objSoundCard.ProductName & VbCrLf
strResult = strResult & "Status Information: " & _
objSoundCard.StatusInfo & VbCrLf
Next
1 Выводим результат на экран
WScript.Echo strResult
»************************* Конец ********** + ************************
Получение информации о видеокарте
В сценарии VideoCardlnfo.vbs (листинг 6.19) параметры и текущие
настройки видеокарты (экземпляр класса win32_yideoControiier) выводятся в файл
C:\video.txt, который затем открывается в Блокноте.
Листинг 6.19. Вывод информации о видеокарте
I••••••••••••••••••••••••••••••*••••••••••••••••••••••••••••••••••••
' Имя: VideoCardlnfо.vbs
1 Язык: VBScript
1 Описание: Вывод информации о видеокарте
••••••••••••••••••••••••••••••••••••••*••*••**••••••••••••••*•••••••
Option Explicit
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim colVideoCont ' Коллекция экземпляров класса WMI
Dim objVideoCont ' Элемент коллекции
Dim strResult ' Результирующая строка
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
1 Объявляем константы
Const ForWriting = 2
1 Процедура для записи информации в файл
Sub TextOut (Text, File)
1 Объявляем переменные
Dim obj FSO, FOut
1 Создаем объект FileSystemObject
Set objFSO=WScript.CreateObject("Scripting.FileSystemObject")
1 Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
1 Закрываем выходной файл
FOut.Close
End Sub
»********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_VideoController"
strResult = "Информация о видеокарте:" & vbCrLf & vbCrLf
1 Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\" & strComputer & _
"\" 6c strNamespace & " : " & strClass)
' Создаем коллекцию экземпляров класса Win32_VideoController
Set colVideoCont = objClass.Instances_
1 Перебираем элементы коллекции
For Each objVideoCont In colVideoCont
strResult = strResult & "Adapter Compatibility: " & _
objVideoCont.AdapterCompatibility & VbCrLf
strResult = strResult & "Adapter DAC Type: " & _
objVideoCont.AdapterDACType & VbCrLf
strResult = strResult & "Adapter RAM: " & _
objVideoCont.AdapterRAM & VbCrLf
strResult = strResult & "Color Table Entries: " & _
objVideoCont.ColorTableEntries & VbCrLf
strResult = strResult & "Current Bits Per Pixel: " & _
objVideoCont.CurrentBitsPerPixel & VbCrLf
strResult = strResult & "Current Horizontal Resolution: " & _
objVideoCont.CurrentHorizontalResolution & VbCrLf
strResult = strResult & "Current Number Of Colors: " & _
objVideoCont.CurrentNumberOfColors & VbCrLf
strResult = strResult & "Current Refresh Rate: " & _
objVideoCont.CurrentRefreshRate & VbCrLf
strResult = strResult & "Current Vertical Resolution: " & _
objVideoCont.CurrentVerticalResolution & VbCrLf
strResult = strResult & "Description: " & _
objVideoCont.Description & VbCrLf
strResult = strResult & "Device ID: " & _
objVideoCont.DevicelD & VbCrLf
strResult = strResult & "Device Specific Pens: " & _
objVideoCont.DeviceSpecificPens & VbCrLf
strResult = strResult & "Driver Date: " & _
objVideoCont.DriverDate & VbCrLf
strResult = strResult & "Driver Version: " & _
objVideoCont.DriverVersion & VbCrLf
strResult = strResult & "INF Filename: " & _
objVideoCont.InfFilename & VbCrLf
strResult = strResult & "INF Section: " & _
objVideoCont.InfSection & VbCrLf
strResult = strResult & "Installed Display Drivers: " & _
objVideoCont.InstalledDisplayDrivers & VbCrLf
strResult = strResult & "Name: " & _
objVideoCont.Name & VbCrLf
strResult = strResult & "PNP Device ID: " & _
objVideoCont.PNPDevicelD & VbCrLf
strResult = strResult & "Specification Version: " & _
objVideoCont.SpecificationVersion & VbCrLf
strResult = strResult & "Video Architecture: " & _
objVideoCont.VideoArchitecture & VbCrLf
strResult = strResult & "Video Memory Type: " & _
objVideoCont.VideoMemoryType & VbCrLf
strResult = strResult & "Video Mode Description: " & _
objVideoCont.VideoModeDescription & VbCrLf
Next
1 Выводим результат в текстовый файл
TextOut strResult, "C:\video.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad " & "C:\video.txt" )
i **•**********•••*****•*** Конец ***********************************
Получение информации о сетевом адаптере
В сценарии NetworkAdapterlnfo.vbs (листинг 6.20) свойства сетевых адаптеров
извлекаются С ПОМОЩЬЮ Класса Win32_NetworkAdapter. ОтмеТИМ, ЧТО С ПОМОЩЬЮ
сценариев WMI можно также изменять конфигурацию сетевых карт — для этого
следует ИСПОЛЬЗОВать класс Win32_NetworkAdapterConfiguration, КОТОрЫЙ Пре-
доставляет множество методов для настройки сетевых служб DNS, DHCP,
WINS.
Листинг 6.20. Вывод информации о сетевых адаптерах
I***********************************************^
' Имя: NetworkAdapterlnfo.vbs
1 Язык: VBScript
1 Описание: Вывод информации о сетевых адаптерах
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemServices
Dim colNetworkAdapters ' Коллекция экземпляров класса WMI
Dim objNetworkAdapter ' Элемент коллекции
Dim strResult ' Результирующая строка
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
1 Объявляем константы
Const wbemFlagForwardOnly =32
Const wbemFlagReturnlmmediately = 16
Const ForWriting = 2
1 Процедура для записи информации в файл
Sub TextOut (Text, File)
1 Объявляем переменные
Dim objFSO, FOut
1 Создаем объект FileSystemObject
Set obj FSO=WScript.CreateObj ect("Scripting.FileSystemObj ect")
1 Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
1 Закрываем выходной файл
FOut.Close
End Sub
»********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Зарегистрированные сетевые адаптеры " & VbCrLf & VbCrLf
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
Set colNetworkAdapters = objService.ExecQuery(_
"SELECT * FROM Win32_NetworkAdapterM,,_
wben^lagReturnlramediately+wbemFlagForwardOnly)
1 Перебираем элементы коллекции
For Each objNetworkAdapter In colNetworkAdapters
strResult = strResult & "Adapter Type: " & _
objNetworkAdapter.AdapterType & VbCrLf &_
"Description: " & objNetworkAdapter.Description & vbCrLf &_
"Installed: " & objNetworkAdapter.Installed & vbCrLf &_
"Manufacturer: " & objNetworkAdapter.Manufacturer & vbCrLf &_
"Product Name: " & objNetworkAdapter.ProductName & vbCrLf &_
"Net Connection ID: " & objNetworkAdapter.NetConnectionID & vbCrLf &_
"Net Connection Status: " & _
objNetworkAdapter.NetConnectionStatus & vbCrLf & _
"MAC Address: " & objNetworkAdapter.MACAddress & vbCrLf &_
"PNP Device ID" & objNetworkAdapter.PNPDevicelD
Next
1 Выводим результат в текстовый файл
TextOut strResult, "С:\NetworkAdapters.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad " & "C:\NetworkAdapters.txt" )
«************************* Коней ***********************************
Работа с журналом событий
В листингах 6.21—6.29 приведены сценарии WMI, которые позволяют
автоматизировать работу с журналами событий Windows: выполнять выгрузку
записей из журнала событий в таблицу базы данных или в файл с именем,
содержащим текущую дату, осуществлять поиск всех событий с
определенным кодом или заданной датой и т. п.
Резервирование и очистка
определенного журнала событий
Сценарий BackupAndClearLogApp.vbs, представленный в листинге 6.21,
производит резервирование журнала событий приложений в файл C:\application.evt
с последующей очисткой данного журнала.
Листинг 6.21. Резервирование и очистка журнала событий приложении
i •*•****.* ***********************************************************
' Имя: BackupAndClearLogApp.vbs
1 Язык: VBScript
1 Описание: Резервирование и очистка журнала событий приложений
********************************************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim colLogFiles ' Коллекция экземпляров класса WMI
Dim objLogFile ' Элемент коллекции
Dim iError ' Значение, возвращаемое методом
i*••**•**•*****••*••*•* Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:{(Backup)}\\" &_
strComputer & "\" & strNamespace)
1 Создаем коллекцию экземпляров класса Win32_NTEventLogFile
Set colLogFiles = objService.ExecQuery _
("SELECT * FROM Win32_NTEventLogFile WHERE LogFile-
Name='Application'")
1 Перебираем элементы коллекции
For Each objLogFile In colLogFiles
1 Резервируем журнал событий приложений в файле c:\application.evt
iError = objLogFile.BackupEventLog("c:\application.evt")
1 Обрабатываем ошибки, возвращенные методом BackupEventLog
If iError <> 0 Then
1 Выводим сообщение об ошибке
WScript.Echo "Журнал событий приложений не может быть сохранен."
Else
1 Очищаем журнал событий приложений
iError = objLogFile.ClearEventLog()
1 Обрабатываем ошибки, возвращенные методом ClearEventLog
If iError <> 0 Then
1 Выводим сообщение об ошибке
WScript.Echo "Журнал событий приложений не может быть очищен."
Else
1 Выводим сообщение об успешном выполнении
WScript.Echo "Журнал событий приложений сохранен и очищен."
End If
End If
Next
i ************************* Конец ***********************************
Резервирование и очистка журналов событий,
размер которых превышает заданный
Сценарий BackupAndClearLargeLog.vbs, приведенный в листинге 6.22,
производит резервирование и очистку всех журналов событий по критерию,
в качестве которого выбран размер журнала (500 Кбайт).
Листинг 6.22. Резервирование и очистка журналов событий по критерию
1 Имя: BackupAndClearLargeLog.vbs
1 Язык: VBScript
1 Описание: Резервирование и очистка журналов событий,
1 размер которых превышает 500 Кбайт
i********************************************^
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim colLogFiles ' Коллекция экземпляров класса WMI
Dim objLogFile ' Элемент коллекции
Dim iError ' Значение, возвращаемое методом
»********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:{(Backup,Security)}\\" &_
strComputer & "\" & strNamespace)
1 Создаем коллекцию экземпляров класса Win32_NTEventLogFile
Set colLogFiles = objService.ExecQuery _
("SELECT * FROM Win32_NTEventLogFile WHERE FileSize > 500000")
1 Перебираем элементы коллекции
For Each objLogFile In colLogFiles
1 Резервируем журнал событий приложений в файле c:\application.evt
iError = objLogFile.BackupEventLog("с:\" &_
obj LogF i1е.LogF i1eName & ".evt")
1 Обрабатываем ошибки, возвращенные методом BackupEventLog
If iError <> 0 Then
1 Выводим сообщение об ошибке
Wscript.Echo "Журнал событий " & objLogFile.LogFileName &_
" не может быть сохранен."
Else
1 Очищаем журнал событий
iError = objLogFile.ClearEventLog()
1 Обрабатываем ошибки, возвращенные методом ClearEventLog
If iError <> 0 Then
1 Выводим сообщение об ошибке
WScript.Echo "Журнал событий " & objLogFile.LogFileName &_
" не может быть очищен."
Else
1 Выводим сообщение об успешном выполнении
WScript.Echo "Журнал событий " & objLogFile.LogFileName &_
" сохранен и очищен."
End If
End If
Next
»************************* Конец ***********************************
Резервирование журнала событий
в файл с именем, содержащим текущую дату
Сценарий BackupAndClearLogApp_FileName.vbs, представленный в
листинге 6.23, производит резервирование журнала событий приложений в файл
C:\appl^Щ.ММ.ГТГТ.еу!:, где ДД.ММ.ГТГТ — текущая системная дата.
Листинг 6.23. Резервирование журнала событий приложений в файл вида
applJW.MM.rrrr.evt
i*************************************^
' Имя: BackupAndC1earLogApp_Fi1eName.vbs
1 Язык: VBScript
1 Описание: Резервирование журнала событий приложений в файл с именем,
1 содержащим текущую дату
••••******************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim colLogFiles ' Коллекция экземпляров класса WMI
Dim objLogFile ' Элемент коллекции
Dim iError ' Значение, возвращаемое методом
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = MRoot\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:{(Backup)}\\" &_
strComputer & "\" & strNamespace)
1 Создаем коллекцию экземпляров класса Win32_NTEventLogFile
Set colLogFiles = objService.ExecQuery _
("SELECT * FROM Win32_NTEventLogFile WHERE LogFile-
Name='Application *")
1 Перебираем элементы коллекции
For Each objLogFile In colLogFiles
1 Резервируем журнал событий приложений в файле c:\application.evt
iError = objLogFile.BackupEventLog("с:\appl_" & Date & ".evt")
' Обрабатываем ошибки, возвращенные методом BackupEventLog
If iError <> 0 Then
' Выводим сообщение об ошибке
Wscript.Echo "Журнал событий приложений не может быть сохранен"
Else
1 Выводим сообщение об успешном выполнении
WScript.Echo "Журнал событий приложений сохранен"
End If
Next
i************************* конец ***********************************
1 Имя: CopyLogToDB.vbs
' Язык: VBScript
1 Описание: Копирование записей из журнала событий в базу данных
i****************************************^
Option Explicit
On Error Resume Next
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim colEvents ' Коллекция экземпляров класса WMI
Dim objEvent ' Элемент коллекции
Dim strSQLCommand ' Строка для создания таблицы
Dim objConnect ' Объект ADODB.Connection
Dim objRecordset ' Объект ADODB.Recordset
1 Объявляем константы
const adExecuteNoRecords = &H80
const adUseClient = 3
const adOpenStatic = 3
const adLockOptimistic = 3
1 Функция для конвертации даты формата WMI в строку
Function WMIDateStr(WMIDate)
WMIDateStr = CDate(Mid(WMIDate, 5; 2) & "." & _
Mid(WMIDate, 1,2) &"."&_
Left(WMIDate, 4) & " " &_
Mid(WMIDate, 9,2) &":"&_
Копирование записей
из журнала событий в базу данных
Сценарий CopyLogToDB.vbs, представленный в листинге 6.24, позволяет
скопировать все записи из журналов событий в таблицу Eventlogs базы
данных, для которой в системе зарегистрирован источник данных (Data Source)
с именем EventLog_DBF.
Листинг 6.24. Копирование записей из журнала событий в таблицу базы данных
Mid(WMIDate, 11, 2) & ":" & _
Mid(WMIDate, 13, 2))
End Function
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 SQL-команда для создания таблицы записей из журналов событий
strSQLCommand = "CREATE TABLE EVENTLOGS ( " &_
" LogFile varchar (20), " &_
" Category varchar (20), " &_
" CompName varchar (50), " &_
" EventCode varchar (20) , " &_
" Message varchar(254) , " &_
" RecNumber varchar (10), " &_
" Source varchar (50), " &_
" TimeRec varchar (50), " &_
" Type varchar (20), " &_
" User varchar (50) " &_
и ) и
1 Создаем объект ADODB.Connection
Set objConnect = CreateObject("ADODB.Connection")
1 Создаем объект ADODB.Recordset
Set objRecordset = CreateObject("ADODB.Recordset")
1 Устанавливаем соединение с источником данных
objConnect.Open "DSN=EventLog_DBF;"
1 Создаем новую таблицу для хранения записей
objConnect.Execute strSQLCommand,,adExecuteNoRecords
1 Обрабатываем ошибки
if Err.Number = 0 then
1 Выводим сообщение о создании таблицы
MsgBox "Создана таблица EVENTLOGS "
end if
objRecordset.CursorLocation = adUseClient
' Открываем набор данных
objRecordset.Open "SELECT * FROM EVENTLOGS" , objConnect, _
adOpenStat iс, adLockOptimis t i с
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" &_
strComputer & "\" & strNamespace)
1 Создаем коллекцию экземпляров класса Win32_NTLogEvent
Set colEvents = objService.ExecQuery _
("SELECT * FROM Win32_NTLogEvent")
1 Перебираем элементы коллекции
For Each objEvent In colEvents
' Добавляем новую запись
objRecordset.AddNew
1 Заполняем поля записи
objRecordset("LogFile") = objEvent.LogFile
objRecordset("Category") = objEvent.Category
obj Recordset (" CompName") = obj Event. ComputerName
objRecordset("EventCode") = obj Event.EventCode
objRecordset("Message") = left (objEvent.Message,254)
obj Recordset ("RecNumber") = obj Event. RecordNumber
obj Recordset("Source") = obj Event.SourceName
objRecordset("TimeRec") = WMIDateStr(objEvent.TimeWritten)
obj Recordset("Type") = obj Event.Type
obj Recordset("User") = objEvent.User
' Сохраняем запись
objRecordset.Update
Next
1 Удаляем объект ADODB.Recordset
objRecordset.Close
1 Удаляем объект ADODB.Connection
objConnect.Close
1 Выводим сообщение о завершении копирования данных
WScript.Echo "Копирование данных успешно завершено"
i ************************* Конец ***********************************
Поиск в журнале всех событий краха системы
Сценарий ListEvent_Blue_Screen.vbs, представленный в листинге 6.25,
выводит на экран информацию о всех событиях, которые возникали при
аварийной остановке операционной системы.
Листинг 6.25. Поиск в журнале всех событий краха системы
1 Имя: ListEvent_Blue_Screen.vbs
1 Язык: VBScript
1 Описание: Поиск в журнале всех событий краха системы
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim colEvents ' Коллекция экземпляров класса WMI
Dim objEvent ' Элемент коллекции
Dim strResult ' Результат запроса
1 Функция для конвертации даты формата WMI в строку
Function WMIDateStr(WMIDate)
WMIDateStr = CDate(Mid(WMIDate, 5; 2) & "." & _
Mid(WMIDate, 1,2) &"."&_
Left(WMIDate, 4) & " " &_
Mid(WMIDate; 9, 2) &":"&_
Mid(WMIDate, 11, 2) & ":" & _
Mid(WMIDate; 13, 2))
End Function
i ********************** Начало ******************''*r'*r,ir*******"*r**,lr***ilr*
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "События краха системы: " & VbCrLf & VbCrLf
' Подключаемся к пространству имен WMI
Set obj Service = GetObj ect (" WinMgmts: \ \" &_
strComputer & "\" & strNamespace)
1 Создаем коллекцию экземпляров класса Win32_NTLogEvent
Set colEvents = objService.ExecQuery _
("SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'System'"
& " and SourceName = 'SaveDump'")
1 Перебираем элементы коллекции
For Each objEvent In colEvents
1 Формируем строку для вывода на экран
strResult = strResult & " Event date: " &_
WMIDateStr(objEvent.TimeGenerated) &_
" Description: " & objEvent.Message &_
VbCrLf 8c VbCrLf
Next
1 Выводим результат на экран
WScript.Echo strResult
• ************************* Коней ***********************************
Вывод всех событий из определенного журнала
Сценарий ListAllEvents.vbs, приведенный в листинге 6.26, копирует
содержимое всех записей журнала событий системы в текстовый файл
C:\ListAHEvent.txt, который затем открывается с помощью Блокнота.
1 Имя: ListAllEvents.vbs
1 Язык: VBScript
1 Описание: Вывод всех записей из журнала событий системы
i ******•*•********•••••*••********•***••******
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
|||'.Ц.!1!1Л*Шг1Р1:М.1Ш'1.М.1'.М:1'.1',4|1Л.1!М.>:».1.Ин!1'и!Ц^;|'.1И
Dim colEvents ' Коллекция экземпляров класса WMI
Dim objEvent ' Элемент коллекции
Dim strResult ' Результат запроса
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
1 Объявляем константы
Const ForWriting = 2
1 Процедура для записи информации в файл
Sub TextOut (Text, File)
' Объявляем переменные
Dim objFSO, FOut
1 Создаем объект FileSystemObject
Set objFSO=WScript.CreateObject("Scripting.FileSystemObject")
1 Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
1 Закрываем выходной файл
FOut.Close
End Sub
1 Функция для конвертации даты формата WMI в строку
Function WMIDateStr(WMIDate)
WMIDateStr = CDate(Mid(WMIDate, 5, 2) & "." & _
Mid(WMIDate, 1,2) &"."&_
Left(WMIDate, 4) & " " &_
Mid(WMIDate, 9, 2) &":"&_
Mid(WMIDate, 11, 2) & ":" & _
Mid(WMIDate, 13, 2))
End Function
i *****-*-•**************-*- Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Все события из журналов событий System: " & VbCrLf
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" &_
strComputer & "\" & strNamespace)
' Создаем коллекцию экземпляров класса Win32_NTLogEvent
Set colEvents = objService.ExecQuery _
("SELECT * FROM Win32_NTLogEvent WHERE (Logfile ='System')")
' Перебираем элементы коллекции
For Each objEvent in colEvents
' Формируем строку для вывода в файл
strResult = strResult & VbCrLf &_
" LogFile: " & objEvent.LogFile & VbCrLf &_
VbTab & " Category: " & objEvent.Category & VbCrLf &_
VbTab & " Computer Name: " & obj Event. ComputerName & VbCrLf &_
VbTab & " Event Code: " & objEvent.EventCode & VbCrLf &_
VbTab & " Message: " & objEvent.Message &_
VbTab & " Record Number: " & objEvent.RecordNumber & VbCrLf &_
VbTab & " Source Name: " & objEvent.SourceName & VbCrLf &_
VbTab & " Time Written: " &_
WMIDateStr(objEvent.TimeWritten) & VbCrLf &_
VbTab & " Event Type: " & objEvent.Type & VbCrLf &_
VbTab Sc " User: " & objEvent .User & VbCrLf
Next
1 Выводим результат в текстовый файл
TextOut strResult, "C:\ListAllEvent.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad " & "C:\ListAllEvent.txt" )
i ************************* Конец ***********************************
Вывод всех событий за определенную дату
В сценарии ListAllEventsForDate.vbs (листинг 6.27) в файл C:\ListEvent.txt
копируются все записи из всех журналов событий, которые были занесены
23 августа 2003 года. Сформированный файл затем открывается в Блокноте.
Листинг 6.27. Вывод всех записей из журналов событий за определенную дату
i*********************************************
1 Имя: ListAllEventsForDate.vbs
1 Язык: VBScript
1 Описание: Вывод всех событий за определенную дату
Option Explicit
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim colEvents ' Коллекция экземпляров класса WMI
Dim objEvent ' Элемент коллекции
Dim QueryDate ' Дата, за которую выводим события
Dim dtmStartDate ' Объект SWbemDateTime
Dim dtmEndDate ' Объект SWbemDateTime
Dim DateToCheck ' Переменная типа Variant
Dim strResult ' Результат запроса
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
1 Объявляем константы
Const ForWriting = 2
Const CONVERT_TO_LOCAL_TIME = True
1 Процедура для записи информации в файл
Sub TextOut (Text, File)
1 Объявляем переменные
Dim objFSO, FOut
1 Создаем объект FileSystemObject
Set obj FSO=WScript.CreateObj ect("Scripting.FileSystemObj ect")
1 Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
' Закрываем выходной файл
FOut.Close
End Sub
' Функция для конвертации даты формата WMI в строку
Function WMIDateStr(WMIDate)
WMIDateStr = CDate(Mid(WMIDate, 5, 2) & "." & _
Mid(WMIDate, 7, 2) &".'*&_
Left(WMIDate, 4) & " " &_
Mid(WMIDate, 9; 2) &":"&_
Mid(WMIDate, 11, 2) & ":" &
Mid(WMIDate, 13, 2))
End Function
i •**•************••**•* Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
QueryDate = "23.08.2003"
strResult = "События журнала System за " & QueryDate & ": " & VbCrLf
1 Создаем объект SWbemDateTime
Set dtmStartDate = CreateObject("WbemScripting.SWbemDateTime")
1 Создаем объект SWbemDateTime
Set dtmEndDate = CreateObject ("WbemScripting.SWbemDateTime")
1 Преобразуем дату к типу Variant
DateToCheck = CDate(QueryDate)
1 Устанавливаем начальную дату
dtmStartDate.SetVarDate DateToCheck, CONVERT_TO_LOCAL_TIME
1 Устанавливаем конечную дату
dtmEndDate. SetVarDate DateToCheck + 1, CONVERT_TO_LOCAL_TIME
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" &_
strComputer & "\" & strNamespace)
1 Создаем коллекцию экземпляров класса Win32_NTLogEvent
Set colEvents = objService.ExecQuery _
("SELECT * FROM Win32_NTLogEvent WHERE TimeWritten >= '" _
& dtmStartDate & "' and TimeWritten < '" & dtmEndDate & "*")
' Перебираем элементы коллекции
For Each objEvent In colEvents
' Формируем строку для вывода в файл
strResult = strResult & VbCrLf &_
Logfile: " & objEvent.Logfile & VbCrLf &_
VbTab & " Category: " & objEvent.Category & VbCrLf &_
VbTab & " Computer Name: " & obj Event. Computer Name & VbCrLf &_
VbTab & " Event Code: " & objEvent.EventСode & VbCrLf &_
VbTab & " Message: " & objEvent.Message &_
VbTab & " Record Number: " & objEvent.RecordNumber & VbCrLf &_
VbTab & " Source Name: " & objEvent.SourceName & VbCrLf &_
VbTab & " Time Written: " &_
WMIDateStr(objEvent.TimeWritten) & VbCrLf &_
VbTab & " Event Type: " & objEvent.Type & VbCrLf &_
VbTab & " User: " & objEvent.User & VbCrLf
Next
' Выводим результат в текстовый файл
TextOut strResult, "C:\ListEvent.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad " & "C:\ListEvent.txt" )
»****•**•*••******•••••••• Коней ******************************■*■*•*''*•*•
Вывод всех событий с определенным кодом
В сценарии ListAHEventsWithCode.vbs (листинг 6.28) в файл C:\ListEvent.txt
копируются все записи с кодом 7036 из журнала событий системы.
Сформированный файл затем открывается в Блокноте.
Листинг 6.28. Вывод всех записей с определенным кодом из журнала событий
системы
' Имя: ListAHEventsWithCode.vbs
' Язык: VBScript
' Описание: Вывод всех записей с кодом 7036 из журнала событий системы
■ ••••*•**••••••••••••••••••••*•*••••••••*••••*•••••••
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim QueryDate ' Запрашиваемая дата
Dim objService ' Объект SWbemService
Dim colEvents ' Коллекция экземпляров класса WMI
Dim objEvent ' Элемент коллекции
Dim strResult ' Результат запроса
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
' Объявляем константы
Const ForWriting = 2
' Процедура для записи информации в файл
Sub TextOut (Text, File)
1 Объявляем переменные
Dim objFSO, FOut
' Создаем объект FileSystemObject
Set objFSO=WScript.CreateObject("Scripting.FileSystemObject")
1 Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
' Закрываем выходной файл
FOut.Close
End Sub
' Функция для конвертации даты формата WMI в строку
Function WMIDateStr(WMIDate)
WMIDateStr = CDate(Mid(WMIDate, 5, 2) & "." & _
Mid(WMIDate, 7, 2) &"."&_
Left(WMIDate, 4) & " " &_
Mid(WMIDate, 9, 2) &":"&_
Mid(WMIDate, 11, 2) & ":" & _
Mid(WMIDate, 13, 2))
End Function
i********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "События журнала :" & VbCrLf
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" &_
strComputer & "\" & strNamespace)
' Создаем коллекцию экземпляров класса Win32_NTLogEvent
Set colEvents = objService.ExecQuery _
("SELECT * FROM Win32_NTLogEvent WHERE (Logfile =,System')" &_
" and (EventCode = '7036')")
' Перебираем элементы коллекции
For Each objEvent in colEvents
' Формируем строку для вывода в файл
strResult = strResult & VbCrLf &_
Logfile: " & objEvent.Logfile & VbCrLf &_
VbTab & " Category: " & objEvent.Category & VbCrLf &_
VbTab & " Computer Name: " & obj Event. ComputerName & VbCrLf &_
VbTab & " Event Code: " & objEvent.EventCode & VbCrLf &_
VbTab & " Message: " & objEvent.Message &_
VbTab & " Record Number: " & objEvent.RecordNumber & VbCrLf &_
VbTab & " Source Name: " & obj Event .Sour ceName & VbCrLf &_
VbTab & " Time Written: " &_
WMIDateStr(objEvent.TimeWritten) & VbCrLf &_
VbTab & " Event Type: " & objEvent.Type & VbCrLf &_
VbTab & " User: " & objEvent.User & VbCrLf
Next
' Выводим результат в текстовый файл
TextOut strResult, "C:\ListEvent.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShel1.Exec("notepad " & "C:\ListEvent.txt" )
»*************************
Конец **
• ••••••*••••••••••*••••*•••*••*•••••••
' Имя: ListLogProperties.vbs
' Язык: VBScript
' Описание: Вывод свойств журнала событий системы
■•••••••••••••••••••••••••••^
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim colLogFiles ' Коллекция экземпляров класса WMI
Dim objLogFile ' Элемент коллекции
Dim strResult ' Результат запроса
' Функция для конвертации даты формата WMI в строку
Function WMIDateStr(WMIDate)
WMIDateStr = CDate(Mid(WMIDate, 5, 2) & "." & _
Mid(WMIDate, 1,2) &"."&_
Left(WMIDate, 4) & " " &_
Mid(WMIDate, 9, 2) &":"&_
Mid(WMIDate, 11, 2) & ":" &_
Mid(WMIDate, 13, 2))
End Function
i ••••••••••••*•••••*•••• Начало ******************************i'ri'iri'iri'iri'ir*i'ir
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Свойства журнала событий System: " & VbCrLf
' Подключаемся к пространству имен WMI
Листинг 6.29. Вывод свойств журнала событий системы
Вывод свойств определенного журнала событий
В сценарии ListLogProperties.vbs, представленном в листинге 6.29, на экран
выводятся свойства журнала событий системы (заголовок, размер,
количество записей и т. д.).
Set objService = GetObject("WinMgmts:\\" &_
strComputer & "\" & strNamespace)
' Создаем коллекцию экземпляров класса Win32_NTEventLogFile
Set colLogFiles = objService.ExecQuery _
("SELECT * FROM Win32_NTEventLogFile WHERE LogFileName='System'")
1 Перебираем элементы коллекции
For Each objLogFile In colLogFiles
' Формируем строку для вывода в файл
strResult = strResult & VbCrLf &_
"Caption: " & objLogFile.Caption & VbCrLf &_
"Compressed: " & objLogFile.Compressed & VbCrLf &_
"CreationDate: " & WMIDateStr(objLogFile.CreationDate) & VbCrLf &_
"CSName: " & objLogFile.CSName & VbCrLf &_
"Description: " & objLogFile.Description & VbCrLf &_
"Drive: " & objLogFile.Drive & VbCrLf &_
"Extension: " & objLogFile.Extension & VbCrLf &_
"FileName: " & objLogFile.FileName & VbCrLf &_
"FileSize: " & objLogFile.FileSize & VbCrLf &_
"FileType: " & objLogFile.FileType & VbCrLf &_
"FSName: " & objLogFile.FSName & VbCrLf &_
"Hidden: " & objLogFile.Hidden & VbCrLf &_
"InstallDate: " & WMIDateStr(objLogFile.InstallDate) & VbCrLf &_
"LastAccessed: " & WMIDateStr(objLogFile.LastAccessed) & VbCrLf &_
"LastModified: " & WMIDateStr(objLogFile.LastModified) & VbCrLf &_
"LogfileName: " & objLogFile.LogfileName & VbCrLf &_
"MaxFileSize: " & objLogFile.MaxFileSize & VbCrLf &_
"Name: " & objLogFile.Name & VbCrLf &_
"NumberOfRecords: " & objLogFile.NumberOfRecords & VbCrLf &_
"OverwriteOutDated: " & objLogFile.OverwriteOutDated & VbCrLf &_
"OverWritePolicy: " & objLogFile.OverWritePolicy & VbCrLf &_
"Path: " & objLogFile.Path & VbCrLf &_
"Status: " & objLogFile.Status
Next
' Выводим результат на экран
WScript.Echo strResult
i *••**••*••••*••*•****•••• Конец ^**^^**^^**^^^*^^^**^^**'*'**,'г*'*'*'**'*'
Работа с системным реестром
Ранее в главе 4 мы уже рассматривали, каким образом из сценария WSH
можно работать с системным реестром с помощью объекта wshsheii.
Провайдер реестра WMI обеспечивает более мощные возможности, позволяя,
например, проверять права доступа пользователей к определенным разделам
реестра или работать с реестром на удаленном компьютере.
В листингах 6.30-6.35 приведены сценарии, иллюстрирующие выполнение
основных операций над системным реестром (проверка прав доступа к
разделам и параметрам реестра, создание, чтение, изменение и удаление
подразделов и параметров). Отметим, что при вызове метода провайдера реестра
в качестве первого параметра требуется указывать шестнадцатеричное
значение, определяющее корневой раздел реестра, на который должен
действовать этот метод. В таблице 6.1 указано соответствие этих значений каждому
из корневых разделов реестра.
Таблица 6.1. Корневые разделы реестра и соответствующие им числовые значения
Корневой раздел Значение
HKEY_CLASSES_ROOT &H80000000
HKEY_CURRENT_USER &H80000001
HKEY_LOCAL_MACHINE &H80000002
HKEY_USERS &Н8000 0003
HKEY_CURRENT_CONFIG &H80000005
Создание подразделов и параметров
В сценарии CreateRegistryElements.vbs (листинг 6.30) в разделе software
корневого раздела hkey_local_machine создается подраздел Example key,
внутри которого, в свою очередь, создаются два параметра: один Example
String Value Текстового ТИПа, а Другой Example DWORD Value ТИПа DWORD.
Отметим, что при создании параметров с помощью провайдера реестра
подраздел, в который будут записаны эти параметры, должен существовать.
Листинг 6.30. Создание в реестре нового подраздела и параметра
i***********************^
' Имя: CreateRegistryElements.vbs
' Язык: VBScript
' Описание: Создание в реестре нового подраздела и параметра
■••••••••••••••••••••••••••*••••••••••••••••••*•••••
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strKeyPath ' Имя подраздела реестра
Dim strValueName ' Имя параметра реестра
Dim strValue ' Значение текстового параметра реестра
Dim dwValue ' Значение параметра DWORD реестра
Dim objReg ' Объект SWbemObject для работы с реестром
Dim WshShell ' Объект WshShell
Dim Res
' Объявляем константы
const HKEY_LOCAL_MACHINE = &H80000002
»••*■**••••••••••*•*•*•• Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
' Задаем имя подраздела
strKeyPath = "SOFTWARE\Example key"
'Создаем объект WshShell
Set WshShell=WScript.CreateObject("WScript.Shell")
' Получаем указатель на класс StdRegProv
Set objReg = GetObject("WinMgmts:\\" & strComputer & _
"\Root\Default:StdRegProv")
'Запрос на создание нового ключа
Res=WshShell.Popup("Создать ключ " & strKeyPath & "?",0,_
"Работа с реестром",vbQuestion+vbYesNo)
If Res=vbYes Then 'Нажата кнопка Да
' Создаем подраздел в разделе HKEY_LOCAL_MACHINE
objReg.CreateKey HKEY_LOCAL_MACHINE,s trKeyPath
WshShell.Popup "Ключ " & strKeyPath & " создан!",0,_
"Работа с реестром",vblnformation+vbOkOnly
Else
WScript.Quit(O)
End If
' Задаем имя текстового параметра
strValueName = "Example String Value"
' Задаем значение текстового параметра
strValue = "string value"
'Запрос на запись нового параметра
Res=WshShell.Popup("Записать параметр" & strValueName & "?"/0/_
"Работа с реестром",vbQuestion+vbYesNo)
If Res=vbYes Then 'Нажата кнопка Да
' Вызываем метод SetStringValue
objReg.SetStringValue HKEY_hOCAL_MACHINE, strKeyPath, strValueName, strValue
WshShell.Popup "Параметр " & strValueName & _
" записан!",0,"Работа с реестром",vblnformation+vbOkOnly
Else
WScript.Quit(O)
End If
' Задаем имя параметра DWORD
strValueName = "Example DWORD Value"
' Задаем значение параметра DWORD
dwValue = 100
'Запрос на запись нового параметра
Res=WshShell.Popup("Записать параметр " & strValueName & "?",0,_
"Работа с реестром",vbQuestion+vbYesNo)
If Res=vbYes Then 'Нажата кнопка Да
' Вызываем метод SetDWORDValue
ob j Reg. SetDWORDValue HKEY_LOCAL_MACHINE, s trKeyPa th, s trValueName, dwValue
WshShell.Popup "Параметр " & strValueName & _
" записан!",0,"Работа с реестром",vblnformation+vbOkOnly
Else
WScript.Quit(O)
End If
»•••*••••••••*••**■••••***• Коней ***********************************
Проверка прав доступа к разделам и параметрам
Использующийся в WMI провайдер реестра позволяет проверить, имеет ли
пользователь, от имени которого запущен сценарий, определенное право
доступа на раздел или параметр реестра.
( Замечание )
Провайдер реестра не поддерживает возможность формирования полного
списка прав доступа на заданный раздел или параметр реестра и не позволяет
вносить какие-либо изменения в имеющиеся права доступа.
Для того чтобы указать в методах провайдера реестра нужные права доступа,
необходимо использовать соответствующие шестнадцатеричные значения,
которые описаны в табл. 6.2.
Таблица 6.2. Права доступа к реестру и соответствующие числовые значения
Право доступа к реестру
KEY_QUERY_VALUE
KEY_SET_VALUE
KEY_CREATE_SUB_KEY
KEY_ENUMERATE_SUB_KEYS
KEY_NOTIFY
KEY_CREATE_LINK
DELETE
READ_CONTROL
WRITE_DAC
WRITE OWNER
Значение
&H0001
&H0002
&H0004
&H0008
&H0010
&H0020
&H00010000
&H0002000
&H0004000
&H0008000
В листинге 6.31 приведен сценарий CheckAccessRights.vbs, который
производит проверку прав доступа к разделу hkey_local_machine\software\
Example key.
Листинг 6.31. Проверка прав доступа к подразделу реестра
i ******************************
' Имя: CheckAccessRights.vbs
' Язык: VBScript
' Описание: Проверка прав доступа к подразделу реестра
i*************************
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strKeyPath ' Имя подраздела реестра
Dim objReg ' Объект SWbemObject для работы с реестром
Dim bHasAccessRight ' Признак наличия определенного права доступа
Dim strResult ' Строка для вывода на экран
' Объявляем константы
const HKEY_LOCAL_MACHINE = &Н80000002
const KEY_QUERY_VALUE = &H0001
const KEY_SET_VALUE = &H0002
const KEY_CREATE_SUB_KEY = &H0004
const DELETE = &H00010000
i ****•*•*•*•*•*•**•**••*•*•*•*•• + *• Начало ****************************************
' Присваиваем начальные значения переменным
strComputer = "."
' Получаем указатель на класс StdRegProv
Set objReg = GetObject("WinMgmts:\\" & strComputer & _
"\Root\Default:StdRegProv")
' Задаем имя подраздела
strKeyPath = "SOFTWARE\Example key"
strResult = "Права доступа к подразделу " & strKeyPath & ":" & VbCrLf &
VbCrLf
' Выполняем метод CheckAccess
objReg.CheckAccess HKEY_LOCAL_MACHINE/ strKeyPath, KEY_QUERY_VALUE,
bHasAccessRight
1 Проверяем наличие права доступа
If bHasAccessRight = True Then
strResult = strResult & "Право на чтение значений: есть" & VbCrLf
Else
strResult = strResult & "Право на чтение значений: нет" & VbCrLf
End If
1 Выполняем метод CheckAccess
objReg.CheckAccess HKEY_LOCAL_MACHINE, StrKeyPath, KEY_CREATE_SUB_KEY,
bHasAccessRight
' Проверяем наличие права доступа
If bHasAccessRight = True Then
strResult = strResult & "Право на создание подразделов: есть" & VbCrLf
Else
strResult = strResult & "Право на создание подразделов: нет" & VbCrLf
End If
1 Выполняем метод CheckAccess
objReg.CheckAccess HKEY_LOCAL_MACHINE, strKeyPath, DELETE, bHasAccess-
Right
1 Проверяем наличие права доступа
If bHasAccessRight = True Then
strResult = strResult & "Право на удаление подраздела: есть" & VbCrLf
Else
strResult = strResult & "Право на удаление подраздела: нет" & VbCrLf
End If
1 Выводим сформированную строку на экран
WScript.Echo strResult
i ************************* Конец ***********************************
Чтение подразделов и параметров
В сценарии ReadRegistryElements.vbs (листинг 6.32) производится чтение
значений параметров Example String Value И Example DWORD Value,
которые • предварительно были созданы в реестре сценарием
CreateRegistryElements.vbs из листинга 6.30.
Листинг 6.32. Чтение из реестра текстового параметра и параметра типа dword
i ************************************************************
1 Имя: ReadRegistryElements.vbs
1 Язык: VBScript
1 Описание: Чтение из реестра текстового параметра и параметра DWORD
i*******************************************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strKeyPath ' Имя подраздела реестра
Dim strValueName ' Имя параметра реестра
Dim strValue ' Значение текстового параметра реестра
Dim dwValue ' Значение параметра DWORD реестра
Dim objReg ' Объект SWbemObject для работы с реестром
1 Объявляем константы
const HKEY_LOCAL_MACHINE = &Н80000002
t********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
1 Получаем указатель на класс StdRegProv
Set objReg = GetObject("WinMgmts:\\" & strComputer & _
"\Root\Default:StdRegProv")
1 Задаем имя подраздела
strKeyPath = "SOFTWARE\Example key"
1 Задаем имя текстового параметра
strValueName = "Example String Value"
1 Выполняем метод GetStringValue
objReg.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
1 Выводим значение параметра реестра
WScript.Echo "Значение параметра " & strKeyPath & "\" &_
strValueName & ": " & strValue
1 Задаем имя параметра DWORD
strValueName = "Example DWORD Value"
1 Выполняем метод GetDWORDValue
objReg.GetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, dwValue
1 Выводим значение параметра реестра
WScript.Echo "Значение параметра " & strKeyPath & "\" &_
strValueName & ": " & dwValue
»************************* Конец ***********************************
Изменение значений параметров
В сценарии ChangeRegistryValues.vbs (листинг 6.33) производится изменение
значений параметров Example String Value И Example DWORD Value, которые
предварительно были созданы в реестре сценарием CreateRegistryElements.vbs
из листинга 6.30.
Листинг 6.33. Изменение значений параметров реестра
i *********************************************
' Имя: ChangeRegistryValues.vbs
' Язык: VBScript
1 Описание: Изменение значений параметров реестра
*************************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strKeyPath ' Имя подраздела реестра
Dim strValueName ' Имя параметра реестра
Dim strValue ' Значение текстового параметра реестра
Dim dwValue ' Значение параметра DWORD реестра
Dim objReg ' Объект SWbemObject для работы с реестром
Dim WshShell ' Объект WshShell
Dim Res
1 Объявляем константы
const HKEY_LOCAL_MACHINE = &H80000002
»************************* Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
1 Задаем имя подраздела
strKeyPath = "SOFTWARE\Example key"
'Создаем объект WshShell
Set WshShell=WScript.CreateObj ect("WScript.Shell")
' Получаем указатель на класс StdRegProv
Set objReg = GetObject("WinMgmts:\\" & strComputer & _
"\Root\Default:StdRegProv")
1 Задаем имя текстового параметра
strValueName = "Example String Value"
1 Задаем новое значение параметра
strValue = "New string value"
'Запрос на изменение значения параметра
Res=WshShe11.Popup("Изменить значение параметра " & strValueName &_
"?",О,"Работа с реестром",vbQuestion+vbYesNo)
If Res=vbYes Then 'Нажата кнопка Да
' Выполняем метод SetStringValue
—objlCeg.SetStringValue HKEY_LOCAL_MACHINE/ strKeyPath, _
strValueName, strvalue
WshShell.Popup "Значение параметра " & strValueName & _
" изменено!",0,"Работа с реестром",vblnformation*vbOkOnly
End If
1 Задаем имя параметра DWORD
strValueName = "Example DWORD Value"
1 Задаем новое значение параметра
dwValue =300
'Запрос на изменение значения параметра
Res=WshShell.Popup("Изменить значение параметра " & strValueName &_
"?",0,"Работа с реестром",vbQuestion+vbYesNo)
If Res=vbYes Then 'Нажата кнопка Да
' Выполняем метод SetDWORDValue
objReg.SetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath, _
strValueName, dwValue
WshShell.Popup "Значение параметра " & strValueName & _
" изменено!",0,"Работа с реестром", vblnformation+vbOkOnly
End If
»************************* Конец ***********************************
Удаление подразделов и параметров
В сценарии DeleteRegistryValues.vbs (листинг 6.34) производится удаление
параметров Example String Value, Example DWORD Value, а В сценарии
DeleteRegistryKeys.vbs (листинг 6.35) — удаление подраздела Example key.
Эти элементы были предварительно созданы в реестре сценарием
Create Registry Elements, vbs (листинг 6.30).
Листинг 6.34. Удаление из реестра параметров
I************************************************
' Имя: DeleteRegistryValues.vbs
' Язык: VBScript
' Описание: Удаление из реестра текстового параметра и параметра DWORD
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strKeyPath ' Имя подраздела реестра
Dim strValueName ' Имя параметра реестра
Dim objReg ' Объект SWbemObject для работы с реестром
Dim WshShell ' Объект WshShell
Dim Res
1 Объявляем константы
const HKEY_LOCAL_MACHINE = &H80000002
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
'Создаем объект WshShell
Set WshShell=WScript.CreateObject("WScript.Shell")
1 Получаем указатель на класс StdRegProv
Set objReg = GetObject("WinMgmts:\\" & strComputer & _
"\Root\Default:StdRegProv")
1 Задаем"имя подраздела
strKeyPath = "SOFTWARE\Example key"
1 Задаем имя текстового параметра
strValueName = "Example String Value"
'Запрос на удаление параметра
Res=WshShell.Popup("Удалить параметр " & strKeyPath & "\" & _
strValueName & "?",О,"Работа с реестром", vbQuestion+vbYesNo)
If Res=vbYes Then 'Нажата кнопка Да
' Выполняем метод DeleteValue
objReg.DeleteValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName
WshShell.Popup "Параметр " & strValueName & " удален!",0,_
"Работа с реестром",vblnformation+vbOkOnly
End If
' Задаем имя параметра DWORD
strValueName = "Example DWORD Value"
'Запрос на удаление параметра
Res=WshShell.Popup("Удалить параметр " & strKeyPath & "\" & _
strValueName & "?",О,"Работа с реестром",vbQuestion+vbYesNo)
If Res=vbYes Then 'Нажата кнопка Да
' Выполняем метод DeleteValue
objReg.DeleteValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName
WshShe11.Popup "Параметр " & strValueName & " удален!",0,_
"Работа с реестром",vblnformation+vbOkOnly
End If
i************************* Конец ***********************************
Листинг 6.35. Удаление из реестра подраздела
1 Имя: DeleteRegistryKeys.vbs
1 Язык: VBScript
1 Описание: Удаление из реестра подраздела
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strKeyPath ' Имя подраздела реестра
Dim objReg ' Объект SWbemObject для работы с реестром
Dim WshShell ' Объект WshShell
Dim Res
1 Объявляем константы
const HKEY_LOCAL_MACHINE = &H80000002
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
'Создаем объект WshShell
Set WshShell=WScript.CreateObject("WScript.Shell")
1 Получаем указатель на класс StdRegProv
Set objReg = GetObject ("WinMgmts: \\" & strComputer & _
"\Root\Default:StdRegProv")
1 Задаем имя подраздела
strKeyPath = "SOFTWARE\Example key"
'Запрос на удаление параметра
Res=WshShell.Popup("Удалить параметр " & strKeyPath & _
strValueName & "?",О,"Работа с реестром", vbQuestion+vbYesNo)
If Res=vbYes Then 'Нажата кнопка Да
' Выполняем метод DeleteValue
objReg.DeleteKey HKEY_LOCAL_MACHINE, strKeyPath
WshShell.Popup "Раздел" & strKeyPath & " удален1",0,_
"Работа с реестром",vblnformation+vbOkOnly
End If
»************************* Коней ***********************************
Управление службами и процессами
В листингах 6.36-6.44 приведены сценарии, с помощью которых можно
управлять процессами и службами Windows. Подобные сценарии особенно
удобно применять для выполнения групповых операций, например, при
необходимости запустить все приостановленные службы или завершить все
процессы с определенным именем.
Получение информации
о свойствах и состоянии служб
Сценарий Serviceslnfo.vbs, приведенный в листинге 6.36, выводит
информацию о зарегистрированных службах в текстовый файл C:\Services.txt,
который затем открывается с помощью Блокнота.
t**************************************************
1 Имя: Serviceslnfo.vbs
' Язык: VBScript
1 Описание: Вывод информации о службах
>*******************************************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
|||'Ш'1!1ЛНИНГЯГ ■ •_.Г.:''■*
Dim objWMIService ' Объект SWbemServices
Dim col&ervices ' Коллекция экземпляров класса WMI
Dim objService ' Элемент коллекции
Dim strResult ' Результирующая строка
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
' Объявляем константы
Const wbemFlagForwardOnly =32
Const wbemFlagReturnlmmediately = 16
Const ForWriting = 2
1 Функция для записи информации в файл
Sub TextOut (Text, File)
1 Объявляем переменные
Dim objFSO, FOut
1 Создаем объект FileSystemObject
Set objFSO=WScript.CreateObject("Scripting.FileSystemObject")
' Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
1 Закрываем выходной файл
FOut.Close
End Sub
»********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Информация о службах " & VbCrLf & VbCrLf
' Подключаемся к пространству имен WMI
Set objWMIService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
Set colServices = objWMIService.ExecQuery("SELECT * FROM Win32_Service"
, , wbeinFlagReturnlmmediately+wbemFlagForwardOnly)
For Each objService In colServices
strResult = strResult & "Name: " & _
objService.Name & VbCrLf
strResult = strResult & "Display Name: " & _
objService.DisplayName & VbCrLf
strResult = strResult & "Caption: " & _
objService.Caption & VbCrLf
strResult = strResult & "Description: " & _
objService.Description & VbCrLf
strResult = strResult & "Path Name: " & _
objService.PathName & VbCrLf
strResult = strResult & "ServiceType: " & _
objService.ServiceType & VbCrLf
strResult = strResult & "Status: " & _
objService.Status & VbCrLf
strResult = strResult & "State: " & _
objService.State & VbCrLf
strResult = strResult & "Started: " & _
objService.Started & VbCrLf
strResult = strResult & "Start Mode: " & _
objService.StartMode & VbCrLf
strResult = strResult & "Start Name: " & _
objService.StartName & VbCrLf
strResult = strResult & "Accept pause: " & _
objService.AcceptPause & VbCrLf
strResult = strResult & "Accept stop: " & _
objService.Acceptstop & VbCrLf
strResult = strResult & ********************************** & VbCrLf &_
VbCrLf
Next
1 Выводим результат в текстовый файл
TextOut strResult, "C:\Services.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShel1.Exec("notepad " & "C:\Services.txt" )
»************************* Конец ************************** + **Vr**i,r*i,r
1 Имя: StartStoppedServices.vbs
1 Язык: VBScript
1 Описание: Запуск остановленных служб
i **************************************************
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objWMIService ' Объект SWbemServices
Dim colServices ' Коллекция экземпляров класса WMI
Dim objService ' Элемент коллекции
Dim strResult ' Результирующая строка
Dim WshShell ' Объект WshShell
Dim Res
i *********************** начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objWMIService = GetObject ("WinMgmts: \\" & _
strComputer & "\" & strNamespace)
1 Формируем коллекцию остановленных служб
Set colServices = objWMIService.ExecQuery _
("SELECT * FROM Win32_Service WHERE State = 'Stopped' and StartMode =
& "'Auto'")
1 Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
Запуск и восстановление работы служб
В сценарии StartStoppedServices.vbs, описанном в листинге 6.37,
производится запуск всех остановленных служб (с состоянием stopped), которые
должны стартовать автоматически при запуске системы.
Листинг 6.37. Запуск всех остановленных служб
' Запрос на запуск служб
Res = WshShell.Popup("Запустить все остановленные службы?",О, _
"Работа со службами Windows",vbQuestion+vbYesNo)
If Res=vbYes Then
' Запускаем каждую остановленную службу
For Each objService In colServices
obj Service.StartService()
Next
WScript.Echo "Все остановленные службы запущены"
End If
i ************************* коней ***********************************
Сценарий ResumePausedServices.vbs, приведенный в листинге 6.38,
восстанавливает работу всех приостановленных служб (с состоянием Paused),
которые должны стартовать автоматически при запуске системы.
Листинг 6.38. Продолжение работы всех приостановленных служб
********************************************************************
' Имя: ResumePausedServices.vbs
' Язык: VBScript
' Описание: Продолжение работы приостановленных служб
»••••••*■* ***********************************************************
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objWMIService ' Объект SWbemServices
Dim colServices ' Коллекция экземпляров класса WMI
Dim objService ' Элемент коллекции
Dim strResult ' Результирующая строка
Dim WshShell * Объект WshShell
Dim Res
i*•**••********••****** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
' Подключаемся к пространству имен WMI
Set objWMIService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
' Формируем коллекцию остановленных служб
Set colServices = objWMIService.ExecQuery _
("SELECT * FROM Win32_Service WHERE State = 'Paused' and StartMode = "
& "'Auto'")
' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
' Запрос на запуск служб
Res = WshShell.Popup("Возобновить работу всех приостановленных служб?"_
,0, "Работа со службами Windows",vbQuestion+vbYesNo)
If Res=vbYes Then
' Возобновляем каждую приостановленную службу
For Each objService In colServices
obj Service.ResumeService()
Next
WScript.Echo "Работа всех приостановленных служб возобновлена"
End If
»************************* Коней ***********************************
Изменение пароля учетной записи службы
Напомним, что служба в Windows может запускаться от имени
произвольной учетной записи, при этом пароль этой записи хранится в специальной
базе данных служб и не обновляется автоматически при изменении в
системе пароля учетной записи. Поэтому иногда может возникнуть задача
автоматического изменения пароля учетной записи службы. Сценарий Change-
ServicePassword.vbs, представленный в листинге 6.39, является примером
выполнения такой операции для службы Web-публикаций (W3SVC).
Листинг 6.39. Изменение пароля учетной записи службы
• *******************************************************************
' Имя: ChangeServicePassword.vbs
* Язык: VBScript
' Описание: Изменение пароля учетной записи, от имени которой работает
' служба
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strService ' Имя пространства имен
Dim objWMIService ' Объект SWbemServices
Dim colServices ' Коллекция экземпляров класса WMI
Dim objService ' Элемент коллекции
Dim intErr ' Код возврата
Dim strPassw ' Пароль
Dim WshShell ' Объект WshShell
t ********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strService = "W3SVC"
strPassw = "DerParol"
' Подключаемся к пространству имен WMI
Set objWMIService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
' Формируем коллекцию служб с именем W3SVC
Set colServices = objWMIService.ExecQuery _
("SELECT * FROM Win32_Service WHERE Name = '" & strService & )
' Перебираем коллекцию
For Each objService In colServices
' Запускаем метод Change для службы
intErr = objService.Change( ,,,,,,, strPassw)
If intErr=0 Then
' Выводим сообщение об удачном изменении пароля
WshShell.Popup "Пароль для запуска службы " & strService & "
изменен! " ,0,_
"Изменение пароля службы",vblnformation+vbOkOnly
Else
' Выводим сообщение об ошибке при изменении пароля
WshShell.Popup _
"Ошибка при изменении пароля для запуска службы " & strService _
& "!",0,"Изменение пароля службы",vbExclamation+vbOkOnly
End If
Next
• ••••••••••••••••••••••••• коней ***********************************
Создание процессов
С помощью сценариев WMI можно легко запускать процессы как на
локальной, так и на удаленной машине (отметим, что стандартный объект
wshcontroiier, имеющийся в WSH версии 5.6, также позволяет создавать
процессы на удаленной рабочей станции, однако для этого требуется
предварительная настройка обоих компьютеров и отсутствует возможность
принудительно прервать запущенный процесс). В сценарии StaitProcess.vbs
(листинг 6.40) приведен простейший пример создания нового процесса —
запуск новой копии Блокнота в стандартном окне с нормальным
приоритетом процесса.
Листинг 6.40. Запуск нового процесса с параметрами по умолчанию
••••••••••••••••••••••••••••••••••••••••^
1 Имя: StartProcess.vbs
' Язык: VBScript
' Описание: Запуск нового процесса
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Класс WMI
Dim intError ' Значение, возвращаемое методом
Dim intProcessID ' Идентификатор созданного процесса
t ********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "Shikin"
strNamespace = "Root\CIMV2"
strClass = "Win32_Process"
' Создаем ссылку на класс WMI
Set objClass = GetObject("WinMgmts:" & _
"{impersonationLevel=impersonate}'\\" &_
strComputer & "\" & strNamespace & ":" & strClass)
' Запускаем метод Create
intError = objClass.CreateCNotepad.exe", null, null, intProcessID)
' Проверяем возвращенное методом значение
If intError <> 0 Then
' Выводим на экран сообщение об ошибке
WScript.Echo "При создании процесса NOTEPAD.EXE произошла ошибка"
Else
' Выводим на экран сообщение об удачном запуске
WScript.Echo "Процесс NOTEPAD.EXE успешно запущен. "
End If
i•••••••*••**•*•••*••••••• конец ***********************************
Класс win32_Processstartup позволяет указать начальные параметры
запуска нового процесса. В сценарии StartProcessAdd.vbs (листинг 6.41) показано,
каким образом можно запустить процесс в скрытом окне с приоритетом
"Выше среднего".
Листинг 6.41. Запуск нового процесса в скрытом окне с высоким приоритетом
********************************************************************
' Имя: StartProcessAdd.vbs
* Язык: VBScript
' Описание: Запуск нового процесса в скрытом окне с высоким приоритетом
i ••*••••••••••••*•***•*•••••••*•**••*•****•*************************
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemServices
Dim objProcess ' Объект SWbemObject (класс Win32_Process)
Dim objStartup ' Объект SWbemObject (класс
Win32_ProcessStartup)
Dim objConfig ' Объект SWbemObject (экземпляр класса
' Win32_ProcessStartup)
Dim intError ' Значение, возвращаемое методом
Dim intProcessID ' Идентификатор созданного процесса
' Определяем константы
Const HIDDEN_WINDOW = 12
Const ABOVE_NORMAL = 32768
i ********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer =
strNamespace = "Root\CIMV2"
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
' Создаем новый экземпляр класса Win32_ProcessStartup
Set objStartup = objService.Get("Win32_ProcessStartup")
Set objConfig = objStartup.Spawnlnstance_
1 Устанавливаем режим запуска в скрытом окне
objConfig.ShowWindow = HIDDEN_WINDOW
' Устанавливаем приоритет "Выше среднего"
objConfig.PriorityClass = ABOVE_NORMAL
' Создаем ссылку на класс WMI
Set objProcess = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace & ":Win32_Process")
' Запускаем метод Create
intError = objProcess.Create _
("Notepad.exe", null, objConfig, intProcessID)
' Проверяем возвращенное методом значение
If intError <> 0 Then
' Выводим на экран сообщение об ошибке
WScript.Echo "При создании процесса NOTEPAD.EXE произошла ошибка"
Else
' Выводим на экран сообщение об удачном запуске
WScript.Echo "Процесс NOTEPAD.EXE успешно запущен. "
End If
t ******•*••******••*****•• Конец ***********************************
Завершение процессов
В сценарии KillProcess.vbs, описанном в листинге 6.42, на примере Блокнота
(Notepad.exe) показано, каким образом можно принудительно завершить
работу запущенных процессов.
Листинг 6.42. Принудительное завершение запущенного процесса
■•••••••••••••••••••••••••••••••^
1 Имя: KillProcess.vbs
' Язык: VBScript
' Описание: Завершение запущенного процесса
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemServices
Dim colProcesses ' Коллекция экземпляров класса WMI
Dim objProcess ' Элемент коллекции
Dim WshShell ' Объект WshShell
Dim Res
t ********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Roo t:\CIMV2"
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
' Формируем коллекцию процессов NOTEPAD.EXE
Set colProcesses = objService.ExecQuery(_
"SELECT * FROM Win32_Process WHERE Name='NOTEPAD.EXE'")
'Запрос на завершение работы всех Блокнотов
Res=WshShell.Popup("Завершить работу всех Блокнотов?",О,_
"Работа с процессами",vbQuestion+vbYesNo)
' Проверяем введенное значение
If Res=vbYes Then
'Перебираем коллекцию
For Each objProcess in colProcesses
' Завершаем приложение
obj Process.Terminate()
Next
End If
i ************************* конец ***********************************
Получение информации о процессах
Сценарий Processlnfo.vbs, приведенный в листинге 6.43, для всех
запущенных процессов выводит в текстовый файл C:\Process.txt значения некоторых
наиболее важных с точки зрения администратора параметров.
Сформированный файл затем открывается с помощью Блокнота.
Листинг 6.43. Вывод свойств всех запущенных процессов
••••••••••••••••••••••••••^
' Имя: Processlnfo.vbs
' Язык: VBScript
' Описание: Вывод свойств запущенных процессов
■ •••••••••••••••••••••••••••••••*••••••••
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemServices
Dim colProcesses ' Коллекция экземпляров класса WMI
Dim objProcess ',Элемент коллекции
Dim strResult ' Результирующая строка
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
' Объявляем константы
Const wbemFlagForwardOnly = 32
Const wbemFlagReturnlmmediately =16
Const ForWriting = 2
' Функция для записи информации в файл
Sub TextOut (Text, File)
' Объявляем переменные
Dim objFSO, FOut
' Создаем объект FileSystemObject
Set objFSO=WScript.CreateObject("Scripting.FileSystemObject")
' Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
' Записываем текстовую строку в файл
FOut.WriteLine Text
' Закрываем выходной файл
FOut.Close
End Sub
»********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Сведения о запущенных процессах " & VbCrLf & VbCrLf
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
Set colProcesses = objService.ExecQuery("SELECT * FROM Win32_Process",,_
wbemFlagReturnlimediately+wbemFlagForwardOnly)
For Each objProcess In colProcesses
strResult = strResult & "Name: " & objProcess.Name & VbCrLf &_
"Description: " & objProcess.Description & VbCrLf &_
"Handle: " & objProcess.Handle & VbCrLf &_
"Parent Process Id: " & objProcess.ParentProcessId & VbCrLf &_ ■
"Command Line: " & objProcess.CommandLine & VbCrLf &_
"Creation Date: " & objProcess.CreationDate & VbCrLf &_
"Executable Path: " & objProcess.ExecutablePath & VbCrLf &_
"Priority: " & objProcess.Priority & VbCrLf &_
"Maximum WorkingSet Size: " & objProcess.MaximumWorkingSetSize & VbCrLf
&_
"Minimum WorkingSet Size: " & objProcess.MinimumWorkingSetSize & VbCrLf
&_
"Page File Usage: " & objProcess.PageFileUsage & VbCrLf &_
"Peak Virtual Size: " & objProcess.PeakVirtualSize & VbCrLf &_
"Peak WorkingSet Size: " & objProcess.PeakWorkingSetSize & VbCrLf &_
ii*****•*•***•*••*••••*•••*••***••» ^ VbCrLf & VbCrLf
Next
' Выводим результат в текстовый файл
TextOut strResult, "C:\Process.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad " & "C:\Process.txt" )
i ************************* конец ***********************************
Определение владельца процесса
Используя WMI, можно из сценариев узнать, от имени какой учетной
записи был создан определенный процесс (это позволяет, например, выяснить
имя пользователя, запустившего процесс на локальной машине). Сценарий
GetProcessOwner.vbs, представленный в листинге 6.44, выводит на экран
имена владельцев всех процессов с именем Notepad.exe.
Листинг 6.44. Определение владельца процесса
I**************************************^
' Имя: GetProcessOwner.vbs
' Язык: VBScript
' Описание: Определение владельца процесса
i***************************************************
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemServices
Dim colProcesses ' Коллекция экземпляров класса WMI
Dim objProcess ' Элемент коллекции
Dim strUserName ' Имя пользователя
Dim strUserDomain ' Домен, в котором зарегистрирован пользователь
Dim intRes ' Результат выполнения метода
Dim strResult ' Результирующая строка
i****•••••***•****•**•* Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & " \" & strNamespace)
' Создаем коллекцию процессов с именем strProcess
Set colProcesses = objService.ExecQuery _
("SELECT * FROM Win32_Process WHERE Name =' NOTEPAD. EXE' ")
' Перебираем коллекцию процессов
For Each objProcess In colProcesses
' Определяем владельца процесса objProcess
intRes = objProcess.GetOwner(strUserName,strUserDomain)
If intRes=0 Then
1 Выводим информацию о владельце процесса
WScript.Echo "Владельцем процесса " & objProcess.Name &_
11 является " & strUserDomain & "\" & strUserName
Else
' Выводим информацию об ошибке
WScript.Echo "Ошибка при определении владельца процесса " _
& obj Process. Name
End If
Next
i *•••*•••***•**•*••*••**•• Конец ***********************************
Работа с файловой системой
В главе 4 мы рассматривали возможности, которые при работе с файловой
системой локального компьютера предоставляет объект FileSystemObject.
С помощью сценариев WMI можно на удаленном компьютере выполнять
манипуляции с дисками, папками и файлами так же легко, как и на
локальном (это является одним из главных преимуществ WMI перед объектом
FileSystemObject). Кроме этого, WMI позволяет выполнять WQL-запросы
к файловой системе сразу на всех имеющихся в системе дисках, что может
значительно упростить написание и отладку сценариев для обработки
множества файлов или каталогов, отбираемых по какому-либо признаку.
Наконец, сценарии WMI более надежны при выполнении групповых операций
над файлами, т. к. при возникновении ошибки на определенном шаге такой
операции (например, при попытке удалить занятый файл), сценарий,
использующий FileSystemObject, немедленно прекращает свою работу,
а сценарий WMI продолжает дальше выполнять групповую операцию.
Однако следует иметь в виду, что иногда сценарии, использующие
FileSystemObject, могут работать намного быстрее аналогичных сценариев
WMI (например, при простом формировании списка всех файлов на диске,
без наложения дополнительных условий на имена файлов).
Формирование множества файлов
или папок по заданному условию
Сценарий QueryFiles.vbs, приведенный в листинге 6.45, иллюстрирует
применение WQL-запросов к файловой системе. Здесь с помощью запроса
формируется список всех файлов на диске С, имя которых начинается
с символов "win" и которые имеют расширение doc.
' Имя: QueryFiles.vbs
' Язык: VBScript
' Описание: Вывод списка файлов на диске С: с расширением doc
■•••••••••••••••••••••••••*******^
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim strResult ' Результат запроса
Dim colFiles ' Коллекция экземпляров класса WMI
Dim objFile ' Элемент коллекции
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
' Объявляем константы
Const ForWriting = 2
Const wbemFlagForwardOnly =32
Const wbemFlagReturnImmediately = 16
' Функция для записи информации в файл
Sub Техtout (Text, File)
' Объявляем переменные
Dim objFSO, FOut
' Создаем объект FileSystemObject
Set obj FSO=WScript.CreateObj ect("Scripting.FileSystemObj ect")
' Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
г^ШтжШШМ&ЯШМШШШШШШШШШ
' Записываем текстовую строку в файл
FOut.WriteLine Text
' Закрываем выходной файл
FOut.Close
End Sub
• ••••••••••••••**••*••• Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Все файлы на диске С: с расширением doc: " & VbCrLf & VbCrLf
' Подключаемся к пространству имен WMI
Set obj Service = GetObject ("WinMgmts: \\" &_
strComputer & "\" & strNamespace)
' Создаем коллекцию экземпляров класса CIM_DataFile
Set colFiles = objService.ExecQuery(_
"SELECT * FROM CIM_DataFile WHERE Drive = 'C:' AND " &_
"Extension = 'doc' AND Name LIKE '%win%'", ,_
wbemFlagReturnlmmediately + wbemFlagReturnlmmediately)
' Перебираем элементы коллекции
For Each objFile in colFiles
' Формируем строку для вывода в файл
strResult = strResult & objFile.Name & " Size: " &_
objFile.FileSize & " байт" & VbCrLf
Next
' Выводим результат в текстовый файл
TextOut strResult, "C:\Files.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad " & "C:\Files.txt" )
• *•••••*••••••••*•••••*••• Конец ***********************************
I******************************^
' Имя: InfoHardDiskPartitions.vbs
' Язык: VBScript
' Описание: Получение информации о разделах жесткого диска
■**************•****•***•****•***•*•**•*•***•*••
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim strResult ' Результат запроса
Dim colDiskPartitions ' Коллекция экземпляров класса WMF
Dim objPartition ' Элемент коллекции
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
' Объявляем константы
Const ForWriting = 2
' Процедура для записи информации в файл
Sub TextOut (Text, File)
' Объявляем переменные
Dim obj FSO, FOut
' Создаем объект FileSystemObject
Set obj FSO=WScript.CreateObj ect("Scripting.FileSystemObj ect")
' Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
' Записываем текстовую строку в файл
FOut.WriteLine Text
Листинг 6.46. Вывод информации о разделах жесткого диска
Получение информации
о разделах жесткого диска
В сценарии InfoHardDiskPartitions.vbs, описанном в листинге 6.46,
производится вывод в текстовый файл C:\Partitions.txt информации о всех разделах
жесткого диска (имя, размер, возможность загрузки системы с данного
раздела и т. д.). Сформированный файл затем открывается с помощью Блокнота.
' Закрываем выходной файл
FOut.Close
End Sub
i ••*••••*••*••••*•*•••• начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Разделы жесткого диска: " & VbCrLf & VbCrLf
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" &_
strComputer & "\" & strNamespace)
1 Создаем коллекцию экземпляров класса Win32_DiskPartition
Set colDiskPartitions = objService.ExecQuery _
("Select * from Win32_DiskPartition")
' Перебираем элементы коллекции
For each objPartition in colDiskPartitions
' Формируем строку для вывода в файл
strResult = strResult &_
vbTab & "Block Size: " & objPartition.BlockSize & VbCrLf &_
vbTab & "Bootable: " & objPartition.Bootable & VbCrLf &_
vbTab & "Boot Partition: " & objPartition.BootPartition & VbCrLf &_
vbTab & "Description: " & objPartition.Description & VbCrLf &_
vbTab & "Device ID: " & objPartition.DevicelD & VbCrLf &_
vbTab & "Disk Index: " & objPartition.Disklndex & VbCrLf &_
vbTab & "Index: " & objPartition.Index & VbCrLf &_
vbTab Sc "Name: " & obj Partition. Name & VbCrLf &_
vbTab & "Number Of Blocks: " &_
objPartition.NumberOfBlocks & VbCrLf &_
vbTab & "Primary Partition: " &_
objPartition.PrimaryPartition & VbCrLf &_
vbTab & "Size: " & objPartition.Size & VbCrLf &_
vbTab & "Starting Offset: " &_
objPartition.StartingOffset & VbCrLf &_
vbTab & "Type: " & obj Partition. Type & VbCrLf & VbCrLf
Next
' Выводим результат в текстовый файл
TextOut strResult, "C:\Partitions.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad " & "C:\Partitions.txt" )
i •*•••*••**•••*••••*••••** Коней ***********************************
Получение информации
о логических дисках и папках
В сценарии InfoLogicalDisks.vbs (листинг 6.47) производится вывод в
текстовый файл C:\LogicalDisks.txt информации о всех имеющихся в системе
логических дисках (тип, описание, использующаяся файловая система,
размер, метка тома и т. д.). Сформированный файл затем открывается с
помощью Блокнота.
Листинг 6.47. Вывод информации о логических дисках
■*********•****••*********•*•*•**••*•*••••••*••***
' Имя: InfoLogicalDisks.vbs
' Язык: VBScript
' Описание: Получение информации о логических дисках
■*********************************^
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim strResult ' Результат запроса
Dim colLogicalDisks ' Коллекция экземпляров класса WMI
Dim objLogicalDisk ' Элемент коллекции
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
' Объявляем константы
Const ForWriting = 2
' Процедура для записи информации в файл
Sub TextOut (Text, File)
' Объявляем переменные
Dim obj FSO, FOut
1 Создаем объект FileSystemObject
Set objFSO=WScript.CreateObject("Scripting.FileSystemObject")
' Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
' Записываем текстовую строку в файл
FOut.WriteLine Text
' Закрываем выходной файл
FOut.Close
End Sub
• •*•*•*•••*••••••**••*• Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Логические диски: " & VbCrLf & VbCrLf
' Подключаемся к пространству имен WMI
Set obj Service = GetObject ("WinMgmts: \\" &_
strComputer & "\" & strNamespace)
' Создаем коллекцию экземпляров класса Win32_LogicalDisk
Set colLogicalDisks = objService.ExecQuery _
("Select * from Win32_LogicalDisk")
1 Перебираем элементы коллекции
For Each objLogicalDisk In colLogicalDisks
' Формируем строку для вывода в файл
strResult = strResult &_
" DevicelD: " & objLogicalDisk.DevicelD & VbCrLf &_
vbTab & "Compressed: " & objLogicalDisk.Compressed & VbCrLf &_
vbTab & "Description: " & objLogicalDisk.Description & VbCrLf &_
vbTab & "DriveType: " & objLogicalDisk.DriveType & VbCrLf &_
vbTab & "FileSystem: " & objLogicalDisk.FileSystem & VbCrLf &_
vbTab & "FreeSpace: " & objLogicalDisk.FreeSpace & VbCrLf &_
vbTab & "MediaType: " & objLogicalDisk.MediaType & VbCrLf &_
vbTab & "Name: " & objLogicalDisk.Name & VbCrLf &_
vbTab & "QuotasDisabled: " & objLogicalDisk.QuotasDisabled & VbCrLf &_
vbTab & "QuotasIncomplete: " & objLogicalDisk.QuotasIncomplete _
& VbCrLf &_
vbTab & "QuotasRebuilding: " & objLogicalDisk.QuotasRebuilding _
& VbCrLf &_
vbTab & "Size: " & objLogicalDisk.Size & VbCrLf &_
vbTab & "SupportsDiskQuotas: " & _
objLogicalDisk.SupportsDiskQuotas & VbCrLf &_
vbTab & "SupportsFileBasedCompression: " & _
objLogicalDisk.SupportsFileBasedCompression & VbCrLf &_
vbTab & "SystemName: " & objLogicalDisk.SystemName & VbCrLf &_
vbTab & "VolumeDirty: " & objLogicalDisk.VolumeDirty & VbCrLf &_
vbTab & "VolumeName: " & objLogicalDisk.VolumeName & VbCrLf &_
vbTab & "VolumeSerialNumber: " & _
objLogicalDisk.VolumeSerialNumber & VbCrLf & VbCrLf
Next
' Выводим результат в текстовый файл
TextOut strResult, "C:\LogicalDisks.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad " & "C:\LogicalDisks.txt" )
i ••••••••*•••*•*•**•*••••* Коней ***********************************
Сценарий InfoAllTempFolders.vbs (листинг 6.48) выводит в текстовый файл
C:\PropAllFolder.txt свойства всех имеющихся на диске С папок с именем
Temp (атрибуты, время создания и последнего доступа и т. д.).
Сформированный файл затем открывается с помощью Блокнота.
Листинг 6.48. Вывод свойств всех папок с именем Temp на диске С
■•••••••••••••••••••••••••••••••••••••••••^
' Имя: InfoAllTempFolders.vbs
' Язык: VBScript
' Описание: Вывод свойств всех папок Temp на диске С
■********************************^
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim strResult ' Результат запроса
Dim colFolders ' Коллекция экземпляров класса WMI
Dim objFolder ' Элемент коллекции
Dim WshShell ' Объект WshShell
Dim theNotepad ' Объект WshScriptExec
' Объявляем константы
Const ForWriting = 2
Const wbemFlagForwardOnly =32
Const wbemFlagReturnlmmediately =16
' Процедура для записи информации в файл
Sub TextOut (Text, File)
' Объявляем переменные
Dim objFSO, FOut
' Создаем объект FileSystemObject
Set objFSO=WScript.CreateObject("Scripting.FileSystemObject")
' Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (File,ForWriting,true)
' Записываем текстовую строку в файл
FOut.WriteLine Text
' Закрываем выходной файл
FOut.Close
End Sub
' Функция для конвертации даты формата WMI в строку
Function WMIDateStr(WMIDate)
WMIDateStr = CDate(Mid(WMIDate, 5, 2) & "." & _
Mid(WMIDate, 1,2) &"."&_
Left(WMIDate, 4) & " " &_
Mid(WMIDate, 9, 2) &":"&_
Mid(WMIDate, 11, 2) & ":" & _
Mid(WMIDate, 13, 2))
End Function
t ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Свойства всех папок Windows на диске С: " & VbCrLf & VbCrLf
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" &_
strComputer & "\" & strNamespace)
' Создаем коллекцию экземпляров класса Win32_Directory
Set colFolders = objService.ExecQuery(_
"SELECT * FROM Win32_Directory WHERE Drive = 'C:' AND " &_
"FileName = 'Temp' ",,_
wbemFlagReturnlmmediately + wbemFlagReturnlmmediately)
1 Перебираем элементы коллекции
For Each objFolder in colFolders
1 Формируем строку для вывода в файл
strResult = strResult &_
Name: " & objFolder.Name & VbCrLf &_
VbTab & "AccessMask: " & obj Folder .AccessMask & VbCrLf &_
VbTab & "Archive: " & objFolder.Archive & VbCrLf &_
VbTab & "Caption: " & objFolder.Caption & VbCrLf &_
VbTab & "Compressed: " & objFolder.Compressed & VbCrLf &_
VbTab & "CompressionMethod: " & objFolder.CompressionMethod & VbCrLf &_
VbTab & "CreationClassName: " & objFolder.CreationClassName & VbCrLf &_
VbTab & "CreationDate: " & WMIDateStr(objFolder.CreationDate) & _
VbCrLf &_
VbTab & "CSCreationClassName: " & objFolder.CSCreationClassName & _
VbCrLf &_
VbTab & "CSName: " & obj Folder. CSName & VbCrLf &_
VbTab & "Description: " & objFolder.Description & VbCrLf &_
VbTab & "Drive: " & objFolder.Drive & VbCrLf &_
VbTab & "EightDotThreeFileName: " & objFolder.EightDotThreeFileName & _
VbCrLf &_
VbTab & "Encrypted: " & objFolder.Encrypted & VbCrLf &_
VbTab & "Encrypt ionMethod: " & objFolder .Encrypt ionMethod & VbCrLf &_
VbTab & "Extension: " & objFolder.Extension & VbCrLf &_
VbTab & "FileName: " & objFolder .FileName & VbCrLf &_
VbTab & "FileSize: " & objFolder.FileSize & VbCrLf &_
VbTab & "FileType: " & objFolder.FileType & VbCrLf &_
VbTab & "FSCreationClassName: " & objFolder.FSCreationClassName &_
VbCrLf &_
VbTab & "FSName: " & objFolder.FSName & VbCrLf &_
VbTab & "Hidden: " & objFolder.Hidden & VbCrLf &_
VbTab & "InstallDate: " & WMIDateStr(objFolder.InstallDate) & VbCrLf &_
VbTab & "InUseCount: " & objFolder.InUseCount & VbCrLf &_
VbTab & "LastAccessed: " & WMIDateStr(objFolder.LastAccessed) & _
VbCrLf &_
VbTab & "LastModified: " & WMIDateStr(objFolder.LastModified) & _
VbCrLf &_
VbTab & "Path: " & objFolder.Path & VbCrLf &_
VbTab & "Readable: " & objFolder.Readable & VbCrLf &_
VbTab & "Status: " & objFolder.Status & VbCrLf &_
VbTab & "System: " & objFolder.System & VbCrLf &_
VbTab & "Writeable: " & objFolder.Writeable & VbCrLf & VbCrLf
Next
' Выводим результат в текстовый файл
TextOut strResult, "C:\PropAllFolder.txt"
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad " & "C:\PropAllFolder.txt" )
i ************************* Конец *■*■*•*'**'*'*'*'*'*'*'*'*'*'*'*'*'*'*■*'*■**'*'*■*■*'*■*'*'*'*'*'*
Копирование файлов и папок
В сценарии CopyFolder.vbs, приведенном в листинге 6.49, с помощью метода
сору объекта win32_Directory производится копирование папки C:\Test
в папку D:\Test_Archive.
Листинг 6.49. Копирование папок
i *******************************************************************
' Имя: CopyFolder.vbs
1 Язык: VBScript
1 Описание: Копирование папки C:\Test в папку D:\Test_Archive
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim iError ' Значение, возвращаемое методом
Dim colFolders ' Коллекция экземпляров класса WMI
Dim objFolder ' Элемент коллекции
1 Объявляем константы
Const wbemFlagForwardOnly =32
Const wbemFlagReturnlmmediately =16
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" &_
strComputer & "\" & strNamespace)
' Создаем* коллекцию экземпляров класса Win32_Directory
Set colFolders = objService.ExecQuery(_
"SELECT * FROM Win32_Directory WHERE Name = 'c: WTest' ", ,_
wbemFlagReturnlmmediately + wbemFlagReturnlmmediately)
' Перебираем элементы коллекции
For Each objFolder in colFolders
1 Копируем папку
iError = objFolder.Copy("D:\Test_Archive")
1 Проверяем ошибки
If iError <> 0 Then
WScript.Echo "Ошибка при копировании папки."
Else
WScript.Echo "Копирование прошло успешно."
End If
Next
i************************* Конец ***********************************
Удаление файлов и папок
На примере сценария CopyMP3File.vbs (листинг 6.50) можно убедиться,
насколько просто с помощью сценариев WMI выполнять задачи, связанные
с поиском всех файлов по какому-либо признаку. Здесь производится
копирование всех файлов на диске С с расширением трЗ в папку D:\MyMP3.
Листинг 6.50. Копирование всех файлов на диске С с расширением МРЗ
в папку D:\MyMP3
I*******************************************************************
' Имя: CopyMP3File.vbs
' Язык: VBScript
1 Описание: Копирование всех файлов с расширением МРЗ в папку D:\MyMP3
Option Explicit
On Error Resume Next
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim colFiles ' Коллекция экземпляров класса WMI
Dim objFile ' Элемент коллекции
Dim iError ' Значение, возвращаемое методом
Dim objFSO ' Объект FileSystemObject
Dim strFileName ' Переменная для пути и имени копируемого файла
Dim strFolder ' Имя папки, в которую копируем файлы
Dim strExt ' Расширение копируемых файлов
1 Объявляем константы
Const wbemFlagForwardOnly =32
Const wbemFlagReturnlmmediately = 16
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strFolder = "D:\MyMP3\"
strExt = "mp3"
1 Создаем объект FileSystemObject
Set objFSO = CreateObjectCScripting.FileSystemObject")
1 Создаем папку
obj FSO.CreateFolder(s trFolder)
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" &_
strComputer & "\" & strNamespace)
' Создаем коллекцию экземпляров класса CIM_DataFile
Set colFiles = objService.ExecQuery (_
"SELECT * FROM CIM_DataFile WHERE Drive = 'C:'" &_
" AND Extension = '" & strExt & ,,b
wbemFlagReturnlmmediately + wbemFlagReturnImmediately)
1 Перебираем элементы коллекции
For Each objFile In colFiles
1 Формируем строку для копирования
strFileName = strFolder & objFile.FileName & "." & objFile.Extension
' Проверяем, не находится ли файл в папке, в которую мы копируем
If LCase(objFile.Name) <> LCase(strFileName) Then
1 Копируем файлы
iError = objFile.Copy(strFileName)
1 Проверяем ошибки
If iError <> 0 Then
1 Выводим сообщение об ошибке
WScript.Echo "Ошибка при копировании файла " &_
objFile.FileName & "." & objFile.Extension
End If
End If
Next
WScript.Echo "Копирование завершено."
i************************* Конец ***********************************
В сценарии Delete Folder.vbs, описанном в листинге 6.51, выполняется
удаление с диска С папки с именем Test. Удаление файлов производится
аналогичным образом.
Листинг 6.51. Удаление папки на диске
|*******************************************************************
' Имя: DeleteFolder.vbs
' Язык: VBScript
' Описание: Удаление папки C:\Test
|*******************************************************************
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim iError ' Значение, возвращаемое методом
Dim colFolders ' Коллекция экземпляров класса WMI
Dim objFolder ' Элемент коллекции
' Объявляем константы
Const wbemFlagForwardOnly =32
Const wbemFlagReturnlmmediately =16
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" &_
strComputer & "\" & strNamespace)
' Создаем коллекцию экземпляров класса Win32_Directory
Set colFolders = objService.ExecQuery(_
"SELECT * FROM Win32_Directory WHERE Name = 'c:WTest'",,_
wbemFlagReturnlmmediately + wbemFlagReturnlmmediately)
' Перебираем элементы коллекции
For Each objFolder In colFolders
' Удаляем папку
iError = objFolder.Delete
' Проверяем ошибки
If iError <> 0 Then
WScript.Echo "Ошибка при удалении папки"
Else
WScript.Echo "Удаление папки прошло успешно"
End If
Next
i ************************* Конец ***********************************
Манипуляции с папками
для совместного доступа
С помощью сценариев WMI можно осуществлять манипуляции с папками
совместного доступа (создавать их, изменять сетевое имя и количество
одновременно подключаемых пользователей и т. д.). Примеры
соответствующих сценариев приведены в листингах 6.52~6.55.
Создание папки
для совместного доступа
В сценарии CreateShare.vbs, описанном в листинге 6.52, создается папка
совместного доступа, которая имеет сетевое имя NewShare и соответствует
локальной папке C:\Test.
• •'■
Листинг 6.52. Создание папки для совместного доступа
1 Имя: CreateShare.vbs
1 Язык: VBScript
1 Описание: Создание папки для совместного доступа
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim objShare ' Объект SWbemObject
Dim iError ' Значение, возвращаемое методом
1 Объявляем константы
Const FILE_SHARE = 0
Const MAXIMUM_CONNECTIONS = 2
Const ADMIN_SHARE = 2147483648
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject ("WinMgmts : \\" &_
strComputer & "\" & strNamespace)
' Создаем объект класса Win32_Share
Set objShare = objService.Get("Win32_Share")
1 Создаем папку для совместного доступа
iError = objShare.Create _
("C:\Test", "NewShare\ FILE_SHARE, MAXIMUM_CONNECTIONS,_
"Эта папка для совместного доступа создана с помощью WMI.")
1 Проверяем ошибки
If iError <> 0 Then
1 Выводим сообщение об ошибке
WScript.Echo "При создании папки для совместного доступа " &_
" произошла ошибка."
Else
1 Выводим сообщение об успешном создании общей папки
WScript.Echo "Создана папка для совместного доступа."
End If
1 Создаем папку для совместного доступа администраторов
iError = objShare.Create _
("C:\Test", "Adm_Share$\ ADMIN_SHARE, ,
"Эта папка для совместного доступа администраторов " &_
" создана с помощью WMI.")
1 Проверяем ошибки
If iError <> 0 Then
\ Выводим сообщение об ошибке
WScript.Echo "При создании папки для совместного доступа " &_
" администраторов произошла ошибка."
Else
1 Выводим сообщение об успешном создании общей папки
WScript.Echo "Создана папка для совместного доступа администраторов."
End If
t ************************* Коней ***********************************
Изменение свойств папки
для совместного доступа
Сценарий ChangePropShare.vbs, представленный в листинге 6.53, изменяет
описание у папки совместного доступа с именем NewShare, которая была
создана в предыдущем сценарии.
Листинг 6.53. Изменение свойств папки для совместного доступа
t*******************************************************************
1 Имя: ChangePropShare.vbs
1 Язык: VBScript
1 Описание: Изменение свойств папки для совместного доступа
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim colShares ' Коллекция экземпляров класса WMI
Dim objShare ' Элемент коллекции
Dim iError ' Значение, возвращаемое методом
' Объявляем константы
Const MAXIMUM_CONNECTIONS = 5
i********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" &_
strComputer & "\" & strNamespace)
' Создаем коллекцию экземпляров класса Win32_Share
Set colShares = objService.ExecQuery _
("SELECT * FROM Win32_Share WHERE Name = 'NewShare'")
1 Перебираем элементы коллекции
For Each objShare In colShares
' Изменяем свойства папки общего доступа
iError = objShare.SetSharelnfolMAXIMUM^ONNECTIONS, _
"Это новое описание для папки общего доступа.")
1 Проверяем ошибки
If iError <> 0 Then
1 Выводим сообщение об ошибке
WScript.Echo "Ошибка при изменении свойств " &_
" папки общего доступа."
Else
1 Выводим сообщение об успешном изменении свойств
WScript.Echo "Свойства папки общего доступа успешно изменены."
End If
Next
i ************************* Конец ***********************************
Определение имени папки на жестком диске
для папки совместного доступа
В сценарии MappingShare.vbs, описанном в листинге 6.54, на экран
выводится список всех имеющихся на компьютере папок совместного
доступа, для каждой из которых приведено имя соответствующей ей локальной
папки.
Листинг 6.54. Выявление соответствия для папок совместного доступа и папок
на диске
«*******************************************************************
' Имя: MappingShare.vbs
1 Язык: VBScript
1 Описание: Выявление соответствия для папок совместного доступа и
1 реальных папок на диске
i ******************************** ***********************************
Option Explicit
1 Объявляем переменные
Dim strComputer ■ Имя компьютера
Dim strNamespace ■ Имя пространства имен
Dim objService ' Объект SWbemService
Dim colShares ■ Коллекция экземпляров класса WMI
Dim objShare ■ Элемент коллекции
Dim colAssociations ' Коллекция экземпляров класса WMI
Dim objFolder ■ Элемент коллекции
Dim strResult ■ Результат запроса
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Папки общего доступа:" & VbCrLf
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" &_
strComputer & "\" & strNamespace)
' Создаем коллекцию экземпляров класса Win32_Share
Set colShares = objService.ExecQuery("SELECT * FROM Win32_Share")
1 Перебираем элементы коллекции
For Each objShare in colShares
1 Создаем коллекцию экземпляров класса Win32_ShareToDirectory
Set colAssociations = objService.ExecQuery _
("ASSOCIATORS OF {Win32_Share.Name= ' " & obj Share. Name & "'}
& " WHERE AssocClass=Win32_ShareToDirectory")
1 Перебираем элементы коллекции
For Each objFolder In colAssociations
1 Формируем строку для вывода на экран
strResult = strResult & " " & objShare.Name & " - " &_
objFolder.Name & VbCrLf
Next
Next
1 Выводим результат на экран
WScript.Echo strResult
i ************************* Коней ***********************************
Удаление папки для совместного доступа
В сценарии DeleteShare.vbs, описанном в листинге 6.55, производится
удаление папки совместного доступа с именем NewShare (соответствующая ей
локальная папка C:\Test при этом с диска не удаляется).
Листинг 6.55. Удаление папки для совместного доступа
i *******************************************************************
' Имя: DeleteShare.vbs
1 Язык: VBScript
1 Описание: Удаление папки для совместного доступа
Option Explicit
' Объявляем переменные
Dim strComputer ■ Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim colShares ' Коллекция экземпляров класса WMI
Dim objShare ' Элемент коллекции
Dim iError ■ Значение, возвращаемое методом
i••**•*••*•*••••*•*•••* Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set obj Service = GetObject ("WinMgmts: \\" &_
strComputer & "\" & strNamespace)
' Создаем коллекцию экземпляров класса Win32_Share
Set colShares = objService.ExecQuery _
("SELECT * FROM Win32_Share WHERE Name = ' NewShare' ")
1 Перебираем элементы коллекции
For Each objShare In colShares
1 Удаляем папку общего доступа
iError = objShare.Delete
1 Проверяем ошибки
If iError <> 0 Then
1 Выводим сообщение об ошибке
WScript.Echo "Ошибка при удалении папки общего доступа."
Else
1 Выводим сообщение об успешном удалении
WScript.Echo "Папка общего доступа успешно удалена."
End If
Next
i•*•••***••*****••••••*•** Конец ***********************************
Мониторинг состояния системы
Как уже неоднократно отмечалось, подписка на события WMI и обработка
этих событий во временных или постоянных потребителях событий является
одной из наиболее важных возможностей, предоставляемых WMI. В
листингах 6.56—6.62 приведены сценарии-потребители событий, с помощью
которых можно производить мониторинг состояния различных частей
компьютерной системы (служб, процессов, системного реестра и т. д.).
Мониторинг состояния служб
Сценарий MonitorServiceState.vbs (листинг 6.56) является временным
потребителем событий WMI, которые заключаются в изменении состояния любой
зарегистрированной службы. При возникновении такого события
информация о нем будет выведена на экран и скопирована в текстовый файл
C:\LogService.txt.
Листинг 6.56. Мониторинг изменения состояния служб Windows
i ••*•*•••••••••*•••*•••••••**•••••*•••*••*••••
1 Имя: MonitorServiceState.vbs
1 Язык: VBScript
1 Описание: Мониторинг изменения состояния служб Windows
i •••••••••*••**•••••••*•••••••*••••••••**•*••***•*••*•••••*••*****•*
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен WMI
Dim objService ' Объект SWbemServices
Dim objEventSource ' Объект SWbemEventSource
Dim objEvent ' Объект SWbemObject
Dim strResult ■ Результат запроса
1 Константа для задания режима открытия файла
Const ForAppend = 8
1 Процедура для записи информации в файл
Sub TextOut (Text, File)
1 Объявляем переменные
Dim FSO, FOut
1 Создаем объект FileSystemObject
Set FSO=WScript.CreateObject("Scripting.FileSystemObject")
1 Открываем выходной файл для записи
Set FOut = FSO.OpenTextFile (File,ForAppend,true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
1 Закрываем выходной файл
FOut.Close
End Sub
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
1 Выполняем запрос для подписки на извещения о событиях WMI
Set objEventSource = objService.ExecNotificationQuery _
("SELECT * FROM InstanceModificationEvent " & _
"WITHIN 5 WHERE TargetInstance ISA 'Win32_Service'")
1 Выводим сообщение о запуске сканера
Wscript.Echo " Запущен сканер изменения состояния служб"
1 Записываем в переменную objEvent следующее событие
Set objEvent = objEventSource.NextEvent
1 Проверяем, изменилось ли состояние службы
If objEvent.Targetlnstance.State <> objEvent.PreviousInstance.State Then
1 Формируем строку для вывода
strResult = Date & " " & Time & vbCrLf &_
"Служба: " & objEvent.Targetlnstance.DisplayName &_
"." & vbCrLf &_
"Текущее состояние: " & objEvent.Targetlnstance.State &_
" . " & vbCrLf &_
"Предыдущее состояние: " & objEvent.Previouslnstance.State &_
"." & vbCrLf
1 Выводим результат на экран
WScript.Echo strResult
1 Выводим результат в текстовый файл
TextOut "*****************************•• & vbCrLf & strResult &_
и••*••******•••*•••••*********и "С•\LocrService txt"
End If ■
i••••••••••••••*•***•*•••• Конец ***********************************
Мониторинг создания процессов
Сценарий MonitorNotepadRun.vbs, представленный в листинге 6.57,
выступает в качестве временного потребителя событий WMI, возникающих при
запуске Блокнота (процесс Notepad.exe).
Листинг 6.57. Мониторинг запуска процесса
I•*•••*•••*•*•**•••*••*•••••*••••*•••**•******
' Имя: MonitorNotepadRun.vbs
1 Язык: VBScript
1 Описание: Мониторинг запуска Блокнота
i•••***•••*••*••••*••**••••••••*•••••••*•*•••
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен WMI
Dim objService ' Объект SWbemServices
Dim objEventSource ' Объект SWbemEventSource
Dim objEvent ' Объект SWbemObject
Dim strResult ■ Результирующая строка
1 Константа для задания режима открытия файла
Const ForAppend = 8
1 Процедура для записи информации в файл
Sub TextOut (Text, File)
1 Объявляем переменные
Dim FSO, FOut
1 Создаем объект FileSystemObject
Set FSO=WScript.CreateObject("Scripting.FileSystemObject")
1 Открываем выходной файл для записи
Set FOut = FSO.OpenTextFile (File,ForAppend,true)
1 Записываем текстовую строку в файл
FOut.WriteLine Text
1 Закрываем выходной файл
FOut.Close
End Sub
i *•*•*••***•*••*•*•••*• Начало *************************************
1 Присваиваем начальные значения переменным
strComputer =
strNamespace = "Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set obj Service = GetObject ("WinMgmts: \\" & _
strComputer & "\" & strNamespace)
1 Выполняем запрос для подписки на извещения о событиях WMI
Set objEventSource = objService.ExecNotificationQuery _
("SELECT * FROM InstanceCreationEvent " & _
"WITHIN 5 WHERE (TargetInstance ISA 'Win32_Process' " &_
"AND Targetlnstance.Name='NOTEPAD.EXE') ")
1 Выводим сообщение о запуске сканера
Wscript.Echo " Выполняется сканер запуска Блокнота"
1 Записываем в переменную objEvent следующее событие
Set objEvent = objEventSource.NextEvent
1 Формируем строку для вывода
strResult = "Блокнот запущен " & Date & " в " & Time
1 Выводим результат на экран
WScript.Echo strResult
1 Выводим результат в текстовый файл
TextOut и****************************** Sc vbCrLf & strResult &_
и•••••••*••••••**••••*•*•***•*» "С•XLocrNoteoad txt"
i************************* Конец ***********************************
Защита от запуска процесса
Сценарий PreventProcess.vbs (листинг 6.58), являясь временным
потребителем событий WMI, следит за запуском новых копий Блокнота Windows
и принудительно закрывает каждую такую копию.
( Замечание ^
В Windows ХР и Windows Server 2003 запретить выпопнение опредепенной
программы можно также с помощью настройки Групповая политика (Group
Policy) в ММС (раздеп Конфигурация компьютера | Конфигурация Windows |
Политики ограниченного использования программ (Computer Configuration j
Windows Configuration | Software Restriction Policies)).
Листинг 6.58. Защита от запуска определенного процесса
^••••••••••••••••••••••^
1 Имя: PreventProcess.vbs
' Язык: VBScript
1 Описание: Авоматическое закрытие открываемого Блокнота
i•••••••••••••••••••••••••****************^
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен WMI
Dim objService ' Объект SWbemServices
Dim objEventSource ' Объект SWbemEventSource
Dim objEvent ' Объект SWbemObject
Dim strResult ' Результирующая строка
»*****+**************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer =
strNamespace = *'Root\CIMV2"
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
1 Выполняем запрос для подписки на извещения о событиях WMI
Set objEventSource = objService.ExecNotificationQuery _
("SELECT * FROM InstanceCreationEvent " & _
"WITHIN 5 WHERE (TargetInstance ISA 'Win32_Process' " &_
"AND TargetInstance.Name='NOTEPAD.EXE') ")
1 Выводим сообщение о запуске сканера
WScript.Echo " Запущен убийца Блокнотов"
Do While true
1 Записываем в переменную objEvent следующее событие
Set objEvent = objEventSource.NextEvent
'Завершаем работу процесса objEvent.TargetInstance
obj Event.Targetlnstance.Terminate
Loop
i **•****•*•*•*•*•*••***•*•**•*•*•*•*•*••*• Коней ***********************************
Мониторинг изменений реестра
Провайдер реестра WMI позволяет в сценариях обрабатывать события на
уровне отдельного параметра реестра, целого подраздела и всего корневого
раздела.
Сценарий MonitorEntryLevelEvents.vbs (листинг 6.59) следит за
изменениями, ПРОИСХОДЯЩИМИ В параметре реестра SOFTWARE\Example keyXExample
string value, который можно создать с помощью CreateRegistryElements.vbs
(листинг 6.30).
I*••••*•••••••••••••••*•*•••••**••*•* *•••••••••••*••••••*•**•*••**••
1 Имя: MonitorEntryLevelEvents.vbs
1 Язык: VBScript
1 Описание: Мониторинг изменений в параметре реестра
i•••••*••••**••••••••••*•••••••••*•*•*•*••••••
Option Explicit
1 Объявляем переменные
Dim strComputer ■ Имя компьютера
Dim strNamespace ' Имя пространства имен WMI
Dim objService ' Объект SWbemServices
Dim objSink ' Объект SWbemSink
Dim bDone ' Переменная-флаг выхода из цикла
i •*•*••********•*•*••** Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
1 Подключаемся к пространству имен \Root\Default
Set objService = GetObject("WinMgmts:\\" & strComputer & _
"\Root\Default")
1 Создаем объект SWbemSink
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_"
1 Выполняем запрос для подписки на извещения о событиях изменения
1 значения параметра SOFTWARE\Example key\Example String Value
objService.ExecNotificationQueryAsync objSink, _
"SELECT * FROM RegistryValueChangeEvent WHERE " &_
"Hive=,HKEY_LOCAL_MACHINE' AND " &_
"KeyPath='SOFTWARE\\Example key' AND " &_
"ValueName='Example String Value'"
СШ ЗШХК&Я ЖЕ
1 Выводим сообщение о запуске сканера
WScript.Echo "Запущен сканер изменений в параметре реестра" & vbCrLf
1 Приостанавливаем сценарий до наступления события
While Not bDone
WScript.Sleep 1000
Wend
1 Процедура-обработчик события OnObjectReady объекта SWbemSink
Sub Sink_OnObjectReady(oOutParams, oContext)
1 Выводим сообщение о произошедшем событии
WScript.Echo "Произошли изменения в параметре реестра" & vbCrLf & _
" и & vbCrLf & _
oOutParams . GetObj ectText_ ()
bDone = True
End Sub
i************************* Коней. ***********************************
Сценарий MonitorSubkeyEvents.vbs (листинг 6.60) реагирует на изменения,
происходящие внутри раздела реестра softwarex Example key, т. е.
обрабатываются события, связанные с изменением самого раздела softwarex
Example key и всех подразделов и параметров, определенных в этом разделе.
Листинг 6.60. Мониторинг изменений в разделе реестра
i***************************** **************************************
1 Имя: Mon i t orSubkeyEven t s . vbs
1 Язык: VBScript
1 Описание: Мониторинг изменений в разделе реестра
i**••••••*•••*•••••••••*•••••* **************************************
Option Explicit
1 Объявляем переменные
Dim strComputer
Dim strNamespace
Dim objService
Dim objSink
Dim bDone
Имя компьютера
Имя пространства имен WMI
Объект SWbemServices
Объект SWbemSink
Переменная-флаг выхода из цикла
i ***••****••****•****•• Начало *************************************
1 Присваиваем начальные значения переменным
strComputer = "."
bDone = false
1 Подключаемся к пространству имен \Root\Default
Set objService = GetObject("WinMgmts:\\" & strComputer & _
"\Root\Default")
1 Создаем объект SWbemSink
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
1 Выполняем запрос для подписки на извещения о событиях изменения
1 значения параметра SOFTWARE\Example key\Example String Value
objService.ExecNotificationQueryAsync objSink, _
"SELECT * FROM RegistryKeyChangeEvent WHERE " &_
"Hive='HKEY_LOCAL_MACHINE' AND " &_
"KeyPath='SOFTWARE\\Example key'"
1 Выводим сообщение о запуске сканера
WScript.Echo "Запущен сканер изменений в разделе реестра" & vbCrLf
1 Приостанавливаем сценарий до наступления события
While Not bDone
WScript.Sleep 1000
Wend
1 Процедура-обработчик события OnObjectReady объекта SWbemSink
Sub Sink_OnObjectReady(oOutParams, oContext)
1 Выводим сообщение о произошедшем событии
WScript.Echo "Произошли изменения в разделе реестра" & vbCrLf & _
•• " & vbCrLf & _
oOutParams.GetObj ectText_()
bDone = True
End Sub
»*•******•*•*****•****•*** Коней ***********************************
Мониторинг изменений файловой системы
Сценарий MonitorFileCreation.vbs, приведенный в листинге 6.61, является
временным потребителем, который обрабатывает событие WMI,
возникающее при записи нового файла в каталог C:\Test.
Листинг 6.61. Мониторинг создания файлов в папке
I *****************************************************
1 Имя: MonitorFileCreation.vbs
1 Язык: VBScript
1 Описание: Подписка на события создания файла в папке C:\TEST
1 в асинхронном режиме
|*******************************************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен WMI
Dim objService ' Объект SWbemServices
Dim strResult ' Результат запроса
Dim obj Sink ' Объект SWbemSink
Dim bDone ' Переменная-флаг выхода из цикла
i ********************** Нячапо ************ + *******•■*■■*•-*■**•*•******•*•**•**•
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2M
1 Подключаемся к пространству имен
Set objService = GetObject("WinMgmts:\\" & _
strComputer & "\" & strNamespace)
' Создаем объект SWbemSink
Set objSink = wscript.CreateObject("WbemScripting.SWbemSink", "Sink_")
1 Выполняем метод ExecMethodAsync_
objService.ExecNotificationQueryAsync objSink, _
"SELECT * FROM InstanceCreationEvent WITHIN 5 WHERE " &_
"Targetinstance ISA 'CIM_DirectoryContainsFile' and " &_
"TargetInstance.GroupComponent= " &_
" •Wii^JDirectory.Name^'''C:\W\TEST
' Выводим сообщение о запуске сканера
WScript.Echo " Запущен сканер создания файла в папке C:\TEST"
' Приостанавливаем сценарий до завершения выполнения запроса
While Not bDone
WScript.Sleep 1000
Wend
' Процедура-обработчик события OnObjectReady объекта SWbemSink
Sub Sink_OnObjectReady(oOutParams, oContext)
' Формирум строку для вывода
strResult = Date & " " & Time & vbCrLf &_
"Создан файл: " & oOutParams.Targetlnstance.PartComponent
' Выводим результат на экран
WScript.Echo strResult
bDone = True
End Sub
»••••••••••*•••***•••••••• Конец ***********************************
Мониторинг журналов событий
В качестве примера мониторинга журналов событий в листинге 6.62
приведен сценарий MonitorEventLog.vbs, который обрабатывает событие,
возникающее при добавлении новой записи в один из журналов событий.
' Имя: MonitorEventLog.vbs
1 Язык: VBScript
' Описание: Мониторинг журналов событий
i •••••**•••••••••••*•*••
Option Explicit
' Объявляем переменные
Dim strComputer ' Имя компьютера
Листинг 6.62. Мониторинг журналов событий
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim colEvents ' Коллекция экземпляров класса WMI
Dim objEvent ' Элемент коллекции
Dim strResult ' Результат запроса
1 Функция для конвертации даты формата WMI в строку
Function WMIDateStr(WMIDate)
WMIDateStr = CDate(Mid(WMIDate, 5, 2) & "." & _
Mid(WMIDate, 1,2) &"."&_
Left(WMIDate, 4) & " " &_
Mid(WMIDate, 9, 2) &":"&_
Mid(WMIDate, 11, 2) & ":" &_
Mid(WMIDate, 13, 2))
End Function
i ********************** Начало **************** + *******************■*
1 Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = ""
1 Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:{(Security)}!\\" &_
strComputer & "\" & strNamespace)
1 Выполняем запрос для подписки на извещения о событиях WMI
Set colEvents = objService.ExecNotificationQuery _
("SELECT * FROM InstanceCreationEvent " &_
"WITHIN 5 WHERE TargetInstance ISA 'Win32_NTLogEvent'")
1 Записываем в переменную objEvent следующее событие
Set objEvent = colEvents.NextEvent
1 Фомируем строку для вывода на экран
strResult = _
"Record No.: " & objEvent.TargetInstance.RecordNumber & VbCrLf &_
"Event ID: " & objEvent.TargetInstance.EventCode & VbCrLf &_
"Time: " &_
WMIDateStr(objEvent.Targetlnstance.TimeWritten) & VbCrLf &_
"Source: " & objEvent.TargetInstance.SourceName & VbCrLf &_
"Category: " & _
objEvent.TargetInstance.CategoryString & VbCrLf &_
"Event Type: " & objEvent.TargetInstance.Type & VbCrLf &_
"Computer: " & objEvent.TargetInstance.ComputerName & VbCrLf &_
"User: " & objEvent.TargetInstance.User & VbCrLf &_
"Text: " & objEvent.TargetInstance.Message
1 Выводим сообщение на экран
WScript.Echo strResult
i ************************* коней ***********************************
Управление учетными записями
пользователей и групп
Хотя в WMI имеется несколько классов, позволяющих работать с учетными
заПИСЯМИ пользователей (win32_Account, Win32_UserAccount, Win32_Group,
Win32_GroupUser, Win32_NetworkLoginProf ile И Т. Д.), МЫ здесь рассмотрим
сценарии, в которых используется технология ADSI (Active Directory Service
Interface), специально разработанная фирмой Microsoft для доступа
к службам каталогов различных производителей.
Напомним, что под службой каталога (Directory Service) понимается та часть
распределенной компьютерной системы (компьютерной сети), которая
предоставляет средства для поиска и использования имеющихся сетевых
ресурсов различных типов (зарегистрированные пользователи, доступные сетевые
папки и. принтеры, очереди печати и т. д). Другими словами, служба
каталога — это единое образование, объединяющее данные об объектах сети и
совокупность служб, осуществляющих манипуляцию этими данными.
В гетерогенной (неоднородной) компьютерной сети могут одновременно
функционировать несколько различных служб каталогов, например,
NetWare Bindery для Novell Netware 3.x, NDS для Novell NetWare 4jc/5jc,
Windows Directory Service для Windows NT 4.0 или Active Directory для
Windows 2000/Windows Server 2003. Естественно, для прямого доступа
к разным службам каталогов приходится использовать разные
инструментальные средства, что усложняет процесс администрирования сети в целом.
Ключом к решению этой проблемы и служит технология ADSI, которая
обеспечивает единообразный, не зависящий от конкретного сетевого
протокола доступ к функциям различных каталогов.
( Замечание ^
Объекты ADSI включены в операционные системы Windows XP/2000/2003,
а также могут быть установлены в более ранних версиях, для чего их нужно
скачать с сервера Microsoft (http://www.microsoftxom/ISITWorkstation/downloads/
Other/ADSI25.asp).
Разные службы каталогов используют различные виды имен для объектов,
которые они содержат, поэтому в ADSI определяется собственное пространство
имен, которое позволяет однозначно идентифицировать любой объект в
гетерогенной сетевой среде. Имена объектов ADSI называются строками связывания
(Binding String) или строками ADsPath, которые похожи на моникеры WMI
и состоят из двух частей. Первая часть имени (аналог префикса "winMgmt:"
в моникере WMI) определяет, к какой именно службе каталогов (или, другими
словами, к какому именно провайдеру ADSI) мы обращаемся (табл. 6.3).
Таблица 6.3. Примеры обращений к различным службам каталогов
Обращение Описание
II т Г)Др . / / »
'/ / Для службы каталогов, созданной на основе протокола LDAP
(Lightweight Directory Access Protocol), в том числе для Active
Directory в Windows 2000/2003
WinNT: // ' для СЛуЖбы каталогов в сети Windows NT 4.0 или на локальной
рабочей станции Windows XP/2000
N : / / Для службы каталогов NetWare NDS (Novell Directory Service)
" nwcompat : / /" Для служ6ы каталогов NetWare Bindery
Вторая часть строки ADsPath определяет расположение объекта в
конкретном каталоге. Приведем несколько примеров полных строк ADsPath:
" LDAP: / / ldapsrvl /CN=Kazakov, DC=DEV, DC=MSFT, DC=COM"
"WinNT://Domainl/Server1,Computer"
"WinNT://Doma in1/Ka z akov"
"NDS://TreeNW/0=SB/CN=Kazakov"
"NWCOMPAT://NWServer/MyNw3xPrinter"
Рассмотрим несколько простых сценариев, использующих объекты ADSI
для автоматизации некоторых распространенных задач администрирования
на отдельной рабочей станции с операционной системой Windows XP.
Поняв принцип их работы, вы без труда сможете написать аналогичные
сценарии для локальной сети, которая функционирует под управлением Active
Directory или контроллера домена с Windows NT 4.0 (множество подобных
примеров приведено в [3]).
Напомним, что на компьютере с Windows XP имеется база данных,
содержащая информацию обо всех локальных пользователях этого компьютера.
Пользователи компьютера определяются своими атрибутами (имя
регистрации, полное имя, пароль и т. п.) и могут объединяться в группы. Далее мы
приведем примеры сценариев ADSI, с помощью которых можно:
□ получить список имеющихся в локальной сети доменов;
□ получить список всех групп, опеределенных на компьютере;
□ добавить и удалить пользователя компьютера;
□ определить всех пользователей заданной группы или все группы, в
которые входит определенный пользователь;
□ просмотреть атрибуты пользователя и изменить его пароль.
Для получения более полной информации по технологии ADSI следует
обратиться к документации Microsoft или специальной литературе (см. Введение).
Связывание с нужным объектом каталога
Первым шагом для доступа к пространству имен любого каталога в целях
получения информации о его объектах или изменения свойств этих
объектов, является связывание (Binding) с нужным объектом ADSI.
Рассмотрим вначале, каким образом формируется строка связывания для
доступа к объектам отдельной рабочей станции с операционной системой
Windows XP. В общем виде эта строка имеет следующий формат:
"WinNT: [//СотриterName[/ObjееtName[, className] ] ] ] "
Здесь параметр СотриterName задает ИМЯ Компьютера, ObjectName — ИМЯ
объекта (это может быть имя группы, пользователя, принтера, сервиса
и т. п.), className — класс объекта. Возможными значениями параметра
className являются, например, group (группа пользователей), user
(пользователь), printer (принтер) или service (служба Windows XP).
Указав в качестве строки ADsPath просто MwinNT:M, можно выполнить
связывание с корневым объектом-контейнером, содержащим все остальные
объекты службы каталога.
Приведем несколько примеров строк связывания для доступа к различным
объектам компьютера в Windows XP (табл. 6.4).
Таблица 6.4. Варианты строк связывания на компьютере в Windows XP
Строка ADsPath Описание
"WinNT:" Строка для связывания с корневым
объектом пространства имен
"WinNT: //404_Popov" Строка для связывания с
компьютером 404_Popov
"WinNT: //404_Popov/Popov, user" Строка для связывания с
пользователем Popov компьютера 404_Popov
"WinNT://404_Popov/BankUsers/ group" Строка для связывания с группой
BankUsers на компьютере 404_Popov
Для того чтобы из сценария использовать объект ADSI, соответствующий
сформированной строке связывания, необходимо, как и в случае с WMI-
моникерами, применить функцию Getobject:
Set objNameSpace = GetObject ("WinNT:")
Set objComputer = GetObject ("WinNT: //404_Popov")
Set objUser = GetObject ("WinNT: //Popov/Popov, user")
Set objGroup = GetObject ("WinNT://Popov/BankUsers, group")
Перейдем теперь к рассмотрению конкретных примеров сценариев,
использующих объекты ADSI.
Список всех доступных доменов в локальной сети
В листинге 6.63 приведен сценарий ListDomains.vbs, в котором создается и
выводится на экран список всех доменов, доступных в сети.
I ••••••••••••••••••••••••••^
' Имя: ListDomains.vbs
1 Язык: VBScript
1 Описание: Вывод на экран списка всех доменов локальной сети
i*••••*••••*•••*•••••••••••••••*•••*•*••••*•••••••••••*•••••*•••••••••
Option Explicit
'Объявляем переменные
Dim objNameSpace ' Корневой объект Namespace
Dim objDomain ' Экземпляр объекта Domain
Dim strResult ' Строка для вывода на экран
'Связываемся с корневым объектом Namespace
Set objNameSpace = GetObject ("WinNT:")
'Устанавливаем фильтр для выделения объектов-доменов
objNameSpace.Filter = Array ("domain")
strResult = "Все доступные домены в сети:" & vbCrLf & vbCrLf
' Перебираем элементы коллекции
For Each obj Domain In objNameSpace
'Формируем строку с именами доменов
strResult = strResult & objDomain.Name & vbCrLf
Листинг 6.63. Вывод списка всех доменов локальной сети
Next
'Вывод информацию на экран
WScript.Echo strResult
i ************* Коней *********************************************
Создание пользователя и группы
на рабочей станции
В сценарии AddUser.vbs, который приведен в листинге 6.64, на рабочей
станции Popov с помощью метода create объекта computer создается новый
пользователь с именем XUser.
Листинг 6.64. Создание нового локального пользователя на рабочей станции
• *****************************************************
1 Имя: AddUser.vbs
1 Язык: VBScript
1 Описание: Создание нового пользователя компьютера
*********************************************************************
Option Explicit
'Объявляем переменные
Dim objComputer ' Экземпляр объекта Computer
Dim objUser ' Экземпляр объекта User
Dim strUser ' Имя создаваемого пользователя
1 Задаем имя пользователя
strUser = "XUser"
1 Связываемся с компьютером Popov
Set objComputer = GetObject("WinNT://Popov")
1 Создаем объект класса User
Set objUser = objComputer.Create("user",strUser)
1 Добавляем описание созданного пользователя
objUser.Description = "Этот пользователь создан из сценария ADSI"
' Сохраняем информацию на компьютере
objUser.Setlnfо
i************* Конец *********************************************
Группа на рабочей станции создается аналогичным образом (листинг 6.65).
Листинг 6.65. Создание новой локальной группы на рабочей станции
•********************************************************************
' Имя: AddGroup.vbs
1 Язык: VBScript
1 Описание: Создание новой группы на компьютере
i********************************************************************
Option Explicit
'Объявляем переменные
Dim objComputer ' Экземпляр объекта Computer
Dim objGroup ' Экземпляр объекта Group
Dim strGroup ' Имя создаваемой группы
1 Задаем имя пользователя
strGroup = "XGroup"
1 Связываемся с компьютером Popov
Set objComputer = GetObject("WinNT://Popov")
1 Создаем объект класса Group
Set objGroup = objComputer.Create("group",strGroup)
1 Сохраняем информацию на компьютере
objGroup.SetInfo
• ************* Коней *********************************************
Вывод информации о пользователе
и смена его пароля
В листинге 6.66 приведен сценарий Userlnfo.vbs, в котором на экран
выводится имя и описание созданного в сценарии AddUser.vbs пользователя
XUser, после чего производится замена пароля этого пользователя.
Листинг 6.66. Вывод информации о пользователе компьютера и смена его
пароля
i ********************************************************************
1 Имя: Userlnfo.vbs
1 Язык: VBScript
' Описание: Вывод информации о пользователе компьютера и смена
' его пароля
•••••*••••*•*•••••••••••••••**•*******•***••*•*•**•********•**•••••**
Option Explicit
'Объявляем переменные
Dim objUser ' Экземпляр объекта User
Dim WshShell ' Объект WshShell
Dim Res ' Результат нажатия кнопки в диалоговом окне
Dim strPassword ' Строка с новым паролем
Dim strResult ' Строка для вывода на экран
i•••••••••••••••••••••• Начало *************************************
' Связываемся с пользователем XUser компьютера Popov
Set objUser = GetObject("WinNT://Popov/XUser,user")
' Формируем строку с информацией о пользователе
strResult = "Информация о пользователе XUser" & vbCrLf &_
"Имя: " & objUser.Name & vbCrLf & _
"Описание: " & objUser.Description & vbCrLf
' Выводим сформированную строку на экран
WScript.Echo strResult
' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
' Запрос на изменение пароля
Res = WshShell.Popup("Изменить пароль у XUser?",0,_
"Администрирование пользователей",vbQuestion+vbYesNo)
If Res=vbYes Then ' Нажата кнопка Да
' Устанавливаем новый пароль
objUser.SetPassword "NewPassword"
' Сохраняем сделанные изменения
objUser.Setlnfо
WScript.Echo "Пароль был изменен"
Else
WScript.Echo "Вы отказались от изменения пароля"
End If
i•****•*****•• Конец *********************************************/
Удаление пользователя и группы
на рабочей станции
Сценарий DelUserAndGroup.vbs, который представлен в листинге 6.67,
позволяет удалить созданных с помощью сценариев AddUser.vbs и
AddGroup.vbs пользователя XUser и группу XGroup.
- ——f
Листинг 6.67. Удаление пользователя и группы на рабочей станции
I ********************************************************************
1 Имя: DelUserAndGroup.vbs
1 Язык: VBScript
1 Описание: Удаление пользователя и группы компьютера
I********************************************************************
Option Explicit
On Error Resume Next
'Объявляем переменные
Dim objComputer ' Экземпляр объекта Computer
Dim strUser * Имя удаляемого пользователя
Dim strGroup ' Имя удаляемой группы
Dim WshShell ' Объект WshShell
Dim strMess ' Строка для вывода на экран
i********************** Начало *************************************
1 Имя удаляемого пользователя
strUser = "XUser"
1 Имя удаляемой группы
strGroup = "XGroup"
1 Связываемся с компьютером Popov
Set obj Computer = GetObject ("WinNT: //Popov")
1 Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
i************* Удаление пользователя ***********************
1 Удаляем пользователя
obj Computer.Delete "user", strUser
' Обрабатываем ошибки
If Err.Number <> 0 Then
strMess="Ошибка при удалении пользователя " & strUser & vbCrLf & _
"Код ошибки: " & Err.number & "Описание: " & Err.description
WshShell.Popup strMess,0,"Удаление пользователя",vbCritical
' Очищаем свойства объекта Err
Err.Clear
Else
' Все в порядке
strMess = "Пользователь " & strUser & " удален"
WshShell.Popup strMess,0,"Удаление пользователя",vblnformation
End If
»************* Удаление гоуппы * + *** + ************** + **/
objComputer.Delete "group", strGroup
' Обрабатываем ошибки
If Err.Number <> 0 Then
strMess="Ourn6Ka при удалении группы " & strGroup & vbCrLf & _
"Код ошибки: " & Err.number & "Описание: " & Err.description
' Очищаем свойства объекта Err
Err.Clear
Else
' Все в порядке
strMess="Группа " & strGroup & " удалена"
WshShell.Popup strMess,0,"Удаление группы",vblnformation
End If
i*••*•*****••** Коней я********************************************/
Список всех групп на рабочей станции
В листинге 6.68 представлен сценарий ListAUGroups.vbs, который выводит на
экран список всех групп, зарегистрированных на компьютере.
Листинг 6.68. Вывод на экран имен всех локальных групп заданной рабочей
станции
i **********************************************************************
' Имя: ListAUGroups.vbs
' Язык: JScript
' Описание: Вывод на экран имен всех групп заданного компьютера
•*•••*•**•************•******•*****************••*•*••••*••*********•
Option Explicit
'Объявляем переменные
Dim objComputer ' Экземпляр объекта Computer
Dim objGroup ' Экземпляр объекта Group
Dim strResult ' Строка для вывода на экран
i********************** Начало *************************************
' Связываемся с компьютером Popov
Set objComputer = GetObject("WinNT://Popov")
strResult = "На компьютере Popov созданы группы:" & vbCrLf & vbCrLf
' Перебираем элементы коллекции
For Each objGroup In objComputer
' Выделяем объекты класса Group
If objGroup.Class = "Group" Then
'Формируем строку с именами групп
strResult = strResult & objGroup.Name & vbCrLf
End If
Next
'Выводим информацию на экран
WScript.Echo strResult
i************* Конец *********************************************/
Список всех пользователей в группе
В листинге 6.69 приведен сценарий ListUsers.vbs, в котором формируется и
выводится на экран список всех пользователей, входящих в группу
Пользователи на компьютере Popov.
Листинг 6.69. Вывод на экран имен всех пользователей заданной группы
i ••••••••••••••••*••••••••••••••••••••••••••••••••*•••••••••••••*•*••
' Имя: ListUsers.vbs
' Язык: VBScript
1 Описание: Вывод на экран имен всех пользователей заданной группы
i********************************************************************
Option Explicit
'Объявляем переменные
Dim objGroup ' Экземпляр объекта Group
Dim objUser ' Экземпляр объекта User
Dim strResult ' Строка для вывода на экран
i **•••••*•••*•*•••••*•••• Начало *************************************
1 Связываемся с группой Пользователи компьютера Popov
Set objGroup = GetObject("WinNT://Popov/Пользователи,group")
strResult = "Все пользователи группы Пользователи на компьютере Popov:" & vbCrLf
1 Перебираем элементы коллекции
For Each objUser In objGroup.Members()
1 Формируем строку с именами пользователей
strResult = strResult & objUser.Name & vbCrLf
Next
' Вывод информации на экран
WScript.Echo strResult
•••••••••••••• Коней *********************************************
Автоматический запуск сценария
на одном компьютере
Для администратора операционной системы часто бывает необходимо
запускать определенные сценарии при каждом старте или завершении работы
операционной системы, а также при каждой регистрации или окончании
сеанса работы пользователя. В данном разделе мы покажем, каким образом
можно зарегистрировать в системе сценарии подобного типа.
Сценарии включения/выключения и входа/выхода
Напомним, что в Windows NT/2000/XP/2003 для настройки среды
пользователя используются профили (локальные и серверные), в состав которых
входят все настраиваемые пользователем параметры: язык и региональные
настройки, настройка мыши и звуковых сигналов, подключаемые сетевые
диски и принтеры и т. д. Профили, сохраняемые на сервере,
обеспечивают пользователям одну и ту же рабочую среду вне зависимости от того,
с какого компьютера (под управлением Windows) зарегистрировался
пользователь.
Начиная с Windows NT, для настройки среды пользователей, кроме
профилей, применяются сценарии входа (сценарии регистрации) — сценарии WSH,
командные или исполняемые файлы, которые запускаются на машине
пользователя каждый раз при его регистрации в сети или на локальной рабочей
станции. Это позволяет администратору задавать только некоторые
параметры среды пользователя, не вмешиваясь в остальные настройки; кроме этого,
сценарии входа легче создавать и поддерживать, чем профили.
В Windows 2000/XP/2003 для объектов групповой политики можно
дополнительно задавать сценарии следующих типов:
□ сценарии включения, которые автоматически выполняются при запуске
операционной системы, причем до регистрации пользователей;
□ сценарии входа групповой политики, которые автоматически выполняются
при регистрации пользователя, причем до запуска упомянутого ранее
обычного сценария регистрации для этого пользователя;
□ сценарии выхода, которые автоматически выполняются после окончания
сеанса работы пользователя;
□ сценарии выключения, которые автоматически выполняются при
завершении работы Windows.
Для простоты проверки примеров мы будем рассматривать сценарии
включения/выключения и входа/выхода, которые хранятся на локальной рабочей
станции, работающей под управлением Windows XP. Далее будет подробно
описано, в каких специальных папках нужно сохранять сценарии того или
иного вида, и каким образом происходит подключение этих сценариев. Для
использования сценариев включения/выключения и входа/выхода в сети со
службой каталогов Active Directory, нужно просто перенести сценарии в
соответствующие папки на контроллере домена и воспользоваться оснасткой
Active Directory — пользователи и компьютеры (Active Directory — users and
computers) консоли управления ММС для назначения этих сценариев
соответствующим объектам групповой политики.
Сценарии, выполняемые при загрузке операционной
системы
Сценарии включения/выключения, как и сценарии входа/выхода групповой
политики, подключаются с помощью оснастки Групповая политика (Group
Policy) в ММС (рис. 6.1).
Для того чтобы подключить определенный сценарий включения, нужно
выделить раздел Конфигурация компьютера | Конфигурация Windows | Сценарии
(запуск/завершение) (Computer Configuration | Windows Configuration | Scripts
(Startup/Shutdown)) и выбрать свойство Автозагрузка (Startup), после чего
будет выведено диалоговое окно Свойства: Автозагрузка (Properties: Startup)
(рис. 6.2).
Рис. 6.1. Мастер групповой политики
Рис. 6.2. Список установленных сценариев включения
Для добавления нового сценария необходимо нажать кнопку Добавить (Add)
и в диалоговом окне Добавление сценария (Adding script) указать имя
нужного файла (для этого можно воспользоваться кнопкой Обзор (Browse)) и,
в случае необходимости, параметры сценария (рис. 6.3).
Рис. 6.3. Имя и параметры сценария включения
( Замечание j
По умолчанию сценарии включения хранятся в каталоге % System Root%\System32\
GroupPolicy\Machine\Scripts\Startup.
Сценарии, выполняемые при завершении работы
операционной системы
Для подключения сценариев выключения нужно выбрать свойство Завершение
работы (Shutdown) в разделе Сценарии (запуск/завершение) (Scripts
(Startup/Shutdown)), после чего будет выведено диалоговое окно Свойства:
Завершение работы (Properties: Shutdown) (рис. 6.4).
Как и в предыдущем случае, для добавления нового сценария необходимо
нажать кнопку Добавить (Add) и в диалоговом окне Добавление сценария
(Adding script) указать имя нужного файла (по умолчанию сценарии
выключения хранятся в каталоге %SystemRoot%\System32\GroupPolicy\Machine\
Scripts\Shutdown) и параметры сценария.
Сценарии входа для всех локальных пользователей
Сценарии входа групповой политики подключаются в разделе Конфигурация
пользователя | Конфигурация Windows | Сценарии (вход/выход из системы)
(User Configuration | Windows Configuration | Scripts (Logon/Logoff)). В этом
разделе нужно выбрать свойство Вход в систему (Logon), после чего будет
выведено диалоговое окно Свойства: Вход в систему (Properties: Logon)
(рис. 6.5).
Рис. 6.4. Список установленных сценариев выключения
Рис. 6.5. Список установленных сценариев входа
Для добавления нового сценария входа необходимо нажать кнопку Добавить
(Add) и в диалоговом окне Добавление сценария (Adding script) указать имя
нужного файла (по умолчанию сценарии выключения хранятся в каталоге
%SystemRoot%\System32\GroupPolicy\User\Scripts\Logon) и параметры сценария.
Сценарий выхода для всех локальных пользователей
Для подключения сценариев выхода нужно выбрать свойство Выход из
системы (Logoff) в разделе Сценарии (вход/выход из системы) (Scripts
(Logon/Logoff)), после чего будет выведено диалоговое окно Свойства:
Выход из системы (Properties: Logoff) (рис. 6.6).
Рис. 6.6. Список установленных сценариев выхода
Для добавления нового сценария необходимо нажать кнопку Добавить (Add)
и в диалоговом окне Добавление сценария (Adding script) указать имя
нужного файла (по умолчанию сценарии выхода хранятся в каталоге %System-
Root%\System32\GroupPolicy\User\Scripts\Logofl) и параметры сценария.
Сценарий входа для одного пользователя
Сценарии входа для отдельных пользователей назначаются с помощью
оснастки Локальные пользователи и группы (Local users and groups).
( Замечание ^
В Windows NT для этого использовался Диспетчер пользователей (User
Manager for Domain).
Для добавления этой оснастки в консоли ММС выберем пункт Добавить
или удалить оснастку (Add/Remove Snap-in) в меню Консоль (Console) и
нажмем кнопку Добавить (Add). В появившемся списке всех имеющихся
оснасток нужно выбрать пункт Локальные пользователи и группы (Local users and
groups) и нажать кнопку Добавить (Add). После этого появится диалоговое
окно, в котором необходимо указать, что выбранная оснастка будет
управлять локальным компьютером, и нажать кнопку Готово (Finish) (рис. 6.7).
Рис. 6.7. Выбор компьютера, которым будет управлять
оснастка Локальные пользователи и группы
Никаких других оснасток в окно консоли мы добавлять не будем, поэтому
нажимаем кнопку Закрыть (Close) в списке оснасток и кнопку ОК в окне
добавления/удаления оснасток. После этого мы можем в окне консоли
просматривать список локальных пользователей компьютера и изменять их
свойства (рис. 6.8).
Для назначения пользователю сценария входа нужно выбрать этого
пользователя (например, Popov) в списке и перейти на вкладку Профиль (Profile)
в диалоговом окне со свойствами пользователя. Имя сценария входа
вводится в поле Сценарий входа (Logon Script) этого окна (рис. 6.9).
Путь к сценарию входа необходимо указывать относительно каталога
%SystemRoot%\System32\Repl\Import\Scripts. Если, скажем, сценарий scr99.bat
для пользователя Popov находится в каталоге с полным именем
F:\Windows\System32\Repl\lmport\Scripts\Script99, то в качестве пути к
сценарию входа нужно указать \Script99\scr99.bat.
Рис. 6.8. Список пользователей локального компьютера
Рис. 6.9. Настройки профиля пользователя
Запуск сценария
на нескольких компьютерах
На практике часто возникает необходимость запустить один и тот же
сценарий на нескольких машинах (например, при инвентаризации
установленного оборудования нужно запускать сценарий на всех компьютерах,
входящих в локальную сеть). Все рассмотренные нами ранее сценарии WMI были
предназначены для выполнения только на одном компьютере, имя которого
задавалось переменной strcomputer. Далее на примере сценария для
перезагрузки компьютера будет показано, как можно преобразовать имеющийся
сценарий с целью запуска на нескольких компьютерах, имена которых
перечислены в качестве параметров командной строки сценария или записаны
во внешнем текстовом файле. Кроме этого, мы рассмотрим, как запустить
сценарий на всех рабочих станциях, входящих в определенный домен.
Задание имен компьютеров
в командной строке
Самый простой способ запустить компьютер на нескольких
машинах заключается в указании необходимых имен в качестве параметров
командной строки сценария (из сценария параметры будут доступны как
элементы коллекции wscript.Arguments). В качестве примера в листинге 6.70
приведен сценарий Reboot Arguments, vbs, в котором производится
перезагрузка всех компьютеров, имена которых перечислены в командной строке.
Например, запустив Reboot Arguments, vbs следующим образом:
wscript RebootArguments.vbs Popov Shikin
мы перезагрузим компьютеры с именами Popov и Shikin.
Листинг 6.70. Перезагрузка всех компьютеров, указанных в командной строке
••••••******************************************
1 Имя: RebootArguments.vbs
1 Язык: VBScript
1 Описание: Перезагрузка всех компьютеров, указанных в командной
1 строке
t*********************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass f Имя класса
Dim objClass f Объект SWbemObject (класс WMI)
Dim colInstances ' Коллекция экземпляров класса WMI
Dim objInstance f Элемент коллекции
t**•*•*•********•*•*••• Начало *************************************
1 Присваиваем начальные значения переменным
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"
1 Перебираем в цикле все параметры командной строки
For Each strComputer In WScript.Arguments
1 Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:{(Shutdown,RemoteShutdown)}\\" &_
strComputer & "\" & strNamespace & ":" & strClass)
1 Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set collnstances = objClass.Instances_
1 Перебираем элементы коллекции
For Each objInstance In collnstances
1 Выводим на экран предупреждение
WScript.Echo "Компьютер " & objInstance.CSNAME &_
" будет перезагружен "
1 Для каждого экземпляра вызываем метод Reboot
objInstance.Reboot()
Next
Next
»**••***•**•*****•****•*** Конец ***********************************
Задание имен компьютеров в текстовом файле
Ясно, что неудобно всякий раз запускать сценарий с указанием нескольких
параметров командной строки, поэтому можно предварительно сохранить
нужные имена компьютеров во внешнем текстовом файле и извлекать их
оттуда во время выполнения сценария. Иллюстрацией такого подхода
является приведенный в листинге 6.71 сценарий RebootTextFile.vbs, который
производит перезагрузку всех компьютеров, перечисленных в файле
C:\ComputerList.txt. Отметим, что в этом сценарии имена компьютеров из
файла С ПОМОЩЬЮ вспомогательной процедуры FillComputerDictionary
предварительно заносятся в специальный объект Dictionary, который
является аналогом ассоциативного массива и в нашем случае содержит
элементы вида ииндекс-имя_компьютера". Это сделано для того, чтобы
основная часть сценария была более универсальной и не зависела от способа
хранения имен компьютеров — если понадобится, например, читать имена
компьютеров из таблицы базы данных или электронной таблицы, то
достаточно будет прОСТО переписать Процедуру FillComputerDictionary, OCHOB-
ное же тело сценария останется тем же.
Листинг 6.71. Перезагрузка всех компьютеров, указанных в текстовом файле
*******************************************************************
Имя: RebootTextFile.vbs
Язык: VBScript
Описание: Перезагрузка всех компьютеров, указанных в текстовом файле
******************************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim collnstances ' Коллекция экземпляров класса WMI
Dim objInstance ' Элемент коллекции
Dim objDictionary ' Объект Dictionary
Dim objItem ' Элемент объекта Dictionary
1 Константа для задания режима открытия файла
Const ForReading = 1
1 Процедура для заполнения объекта Dictionary
Sub FillComputerDictionary(File)
1 Объявляем переменные
Dim objFSO, objTextFile,i,s
' Создаем объект Dictionary
Set objDictionary = CreateObject("Scripting.Dictionary")
' Создаем объект FileSystemObject
Set objFSO = CreateObject("Scripting.FileSystemObject")
1 Открываем файл для чтения
Set objTextFile = objFSO.OpenTextFile(File, ForReading)
i = 0
1 Цикл для чтения строк из файла
Do Until objTextFile.AtEndOfStream
' Читаем строку из файла
s = objTextFile.Readline
' Добавляем элемент в объект Dictionary
objDictionary.Add i, s
i = i + 1
Loop
End Sub
• ************■*■•*■*■*■*■**■** Начало *************************************
' Присваиваем начальные значения переменным
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"
1 Заполняем объект Dictionary значениями из файла C:\ComputerList.txt
FillComputerDictionary("С:\ComputerList.txt")
' Перебираем в цикле все элементы объекта Dictionary
For Each objItem in objDictionary
1 Получаем имя компьютера из текущего элемента объекта Dictionary
strComputer = objDictionary.Item(objItem)
' Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:{(Shutdown,RemoteShutdown)}\\" &_
strComputer & "\" & strNamespace & ":" & strClass)
' Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set collnstances = objClass.Instances_
' Перебираем элементы коллекции
For Each objInstance In collnstances
' Выводим на экран предупреждение
WScript.Echo "Компьютер " & objInstance.CSNAME &_
" будет перезагружен "
' Для каждого экземпляра вызываем метод Reboot
objInstance.Reboot()
Next
Next
• ************************* Коней **************************************
Выполнение сценария для всех компьютеров
в домене
Сценарий RebootDomain.vbs (листинг 6.72) производит перезагрузку всех
компьютеров указанного домена. Имена компьютеров, входящих в домен,
извлекаются Здесь С ПОМОЩЬЮ Объектов ADSI В Процедуре FillComputerDictionary
и записываются в объект Dictionary. В остальном же сценарий
RebootDomain.vbs аналогичен сценарию RebootTextFile.vbs.
Листинг 6.72. Перезагрузка всех компьютеров из домена Windows NT
*******************************************************************
Имя: Reboot Domain.vbs
Язык: VBScript
Описание: Перезагрузка всех компьютеров из домена Windows NT
*******************************************
Option Explicit
1 Объявляем переменные
Dim strComputer ' Имя компьютера
Dim strOurComputer ' Имя компьютера, с которого запущен сценарий
Dim strNamespace ' Имя пространства имен
Dim strClass ' Имя класса
Dim objClass ' Объект SWbemObject (класс WMI)
Dim collnstances ' Коллекция экземпляров класса WMI
Dim objInstance ' Элемент коллекции
Dim objDictionary ' Объект Dictionary
Dim objItem ' Элемент объекта Dictionary
1 Процедура для заполнения объекта Dictionary
Sub FillComputerDictionary()
' Объявляем переменные
Dim strDomain, objDomain, objComputer, i
' Создаем объект Dictionary
Set objDictionary = CreateObject("Scripting.Dictionary")
'Задаем имя домена
strDomain = "WinNT://SBRM"
'Связываемся с объектом Domain
Set objDomain = GetObject(strDomain)
'Устанавливаем фильтр для выделения объектов-компьютеров
objDomain.Filter = Array("computer")
i = 0
1 Цикл для чтения строк из файла
For Each objComputer In objDomain
1 Добавляем элемент в объект Dictionary
obj Dictionary. Add i, obj Computer. Name
i = i + 1
Next
End Sub
i ********************** Начало *************************************
1 Присваиваем начальные значения переменным
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"
1 Получаем указатель на класс WMI для локального комьютера
Set obj Class = GetObj ect ("WinMgmts: {(Shutdown, RemoteShutdown) } \ \ . \" &_
strNamespace & ":" & strClass)
1 Определяем имя локального компьютера
strOurComputer = objClass.CSName
1 Заполняем объект Dictionary значениями из файла C:\ComputerList.txt
FillComputerDictionary()
' Перебираем в цикле все элементы объекта Dictionary
For Each objItem In objDictionary
1 Получаем имя компьютера из текущего элемента объекта Dictionary
strComputer = objDictionary.Itern(objItem)
1 Получаем указатель на класс WMI
Set objClass = GetObject ("WinMgmts: {(Shutdown,RemoteShutdown)} \\" &_
strComputer & "\" & strNamespace & ":" & strClass)
1 Проверяем, не совпадает ли strComputer с именем локального
1 компьютера
If strOurComputer <> strComputer Then
1 Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set collnstances = objClass.Instances_
' Перебираем элементы коллекции
For Each objInstance In collnstances
' Выводим на экран предупреждение
WScript.Echo "Компьютер " & objInstance.CSNAME &_
" будет перезагружен "
' Для каждого экземпляра вызываем метод Reboot
objInstance.Reboot()
Next
i************************* Коней ***********************************
Глава 7
Более сложные
сценарии WMI
В предыдущей главе были рассмотрены стандартные сценарии WMI, каждый
из которых выполнял одну отдельную задачу, связанную с
администрированием Windows. При частом использовании нескольких сценариев можно
значительно упростить свою работу, написав один большой сценарий
с удобным интерфейсом, в котором можно было бы выполнять все
требуемые администраторские функции.
В данной главе приведены два примера подобных сценариев WMI e
графическим пользовательским интерфейсом, причем рассмотрены разные подходы
к созданию таких сценариев: с помощью отдельного VBScript-сценария
и связанной с ним HTML-формы и с помощью одного файла HTML
Application (HTA).
WMI-утилита
для администрирования рабочих станций
В качестве первого примера мы напишем сценарий Sample_WMI_Tool.vbs,
с помощью которого администратор со своей машины сможет
подключиться от имени произвольной учетной записи к любой рабочей станции из
домена Windows NT, увидеть MAC- и IP-адрес этой станции, имя активного
пользователя, который работает на этом компьютере и, по выбору, список
всех работающих процессов или список процессов, запущенных от имени
учетной записи активного пользователя. Также утилита позволит
принудительно прервать выбранный процесс на рабочей станции, завершить сеанс
пользователя, выполнить перезагрузку или выключение удаленного
компьютера. Наконец, в нашем сценарии будут регистрироваться события запуска
новых процессов на рабочей станции.
По отдельности решение почти всех этих задач с помощью сценариев WMI
было рассмотрено в предыдущей главе, поэтому здесь мы основное
внимание уделим созданию в сценарии Sample_WMI_Tool.vbs удобного
графического интерфейса пользователя, который будет реализован посредством
20 3ак 1250
одного диалогового окна (HTML-формы). Для доступа к этой форме из
сценария используется, в качестве сервера автоматизации, браузер Internet Explorer.
Использование Internet Explorer
для работы с диалоговыми окнами
Процесс создания сценария WMI, использующего Internet Explorer в
качестве инструмента создания графического интерфейса, можно условно
разделить на несколько этапов:
□ создание HTML-формы в отдельном файле;
□ написание функции для сценария, в которой будет производиться вывод
на экран построенной формы;
□ написание части сценария, в которой будет реализована необходимая
функциональность (например, выполнение соответствующих WQL-
запросов, корректное отображение данных в форме и т. д.);
□ добавление в сценарий функций-обработчиков событий, связанных с
поведением браузера Internet Explorer;
□ добавление в сценарий функций-обработчиков событий, которые
генерируются элементами управления в форме.
Разработка HTML-формы
для диалогового окна
Графический интерфейс нашей утилиты реализован с помощью HTML-
формы, которая показана на рис. 7.1.
Эта форма реализуется с помощью HTML-файла Form.htm, который
полностью приведен в листинге 7.1. Опишем кратко назначение элементов
управления в нашей форме.
Раскрывающиеся списки Домен и Компьютер позволяют выбрать
соответственно имена домена и рабочей станции из этого домена, к которой
необходимо подключиться из сценария. В полях ввода Имя и Пароль необходимо
ввести учетные данные для соединения с подсистемой WMI на выбранном
компьютере; кнопка Подключить производит это соединение.
После подключения к рабочей станции в текстовых полях МАС-адрес и IP-
адрес будут выведены соответствующие адреса сетевого адаптера этой
станции, а в поле Пользователь — имя активного пользователя,
зарегистрированного в системе.
( Замечание ^
Информация в полях МАС-адрес, IP-адрес и Пользователь будет недоступна
для редактирования.
Рис. 7.1. Диалоговое окно разрабатываемой утилиты
Переключатели в группе Действия позволяют завершить (путем нажатия
кнопки Выполнить действие) тем или иным образом работу пользователя на
рабочей станции.
Если флажок Процессы пользователя не установлен, то в списке Запущенные
процессы будут представлены все процессы, выполняющиеся на удаленном
компьютере. В противном случае в список Запущенные процессы попадут
только те процессы, которые были запущены от имени учетной записи
активного пользователя. Кнопка Завершить позволяет принудительно прервать
работу процесса, который выбран в списке Запущенные процессы.
В список Хронология запуска процессов будет добавляться информация
о новых процессах, запускаемых на рабочей станции.
Листинг 7.1. HTML-форма для сценария Sample_WMI_Tool.vbs
<HTML>
<TITLE>WMI-утилита администратора</Т1ТЬЕ >
<HEAD>
<МЕТА HTTP-EQUIV="Content-Type" CONTENT^"text/html; charset=^
windows-12 51">
</HEAD>
<BODY BGCOLOR="si1ver">
<FORM NAME="MainForm">
<TABLE BORDER="0" WIDTH="100%" STYLE="FONT-SIZE: lOpt; FONT-FAMILY:
^Arial">
<TR>
<TD SPAN="3">floMeH
<SPAN ID="optDomain">
<SELECT STYLE="WIDTH: 150px" NAME="selDomain">
</SELECT>
</SPAN>
</TD>
<TD>
MMH <INPUT NAME="txtUser" SIZE=211b
style="WIDTH: 174px; HEIGHT: 22px">
</TD>
</TR>
<TR>
<TD>
Компьютер
<SPAN ID="optStation">
<SELECT STYLE="WIDTH: 150px" NAME=MselStation">
</SELECT>
</SPAN>
</TD>
<TD>
Пароль <INPUT TYPE=password NAME="txtPassword" SIZE=17>
<INPUT TYPE="button" VALUE=" Подключить " NAME="btnConnect">
</TD>
</TR>
<TR>
<TD COLSPAN=3>
<HR>
</TD>
</TR>
<TR>
<TD VALIGN="top" WIDTH=M40%">
<FIELDSET>
<LEGEND>Pa6o4an CTaHUHH</LEGEND>
MAC anpec
<INPUT SIZE=17 NAME="txtMAC"><BR>
IP anpec
<INPUT SIZE=17 NAME="txtIP"><BR>
Пользователь
<INPUT NAME="txtCurrUser" SIZE=17> <BR>
</FIELDSET>
</TD>
<TD>
<FIELDSET>
<LEGEND>flencTBHH</LEGEND>
<INPUT ID=" Logoff User" TYPE=radio NAME="rbAction,,(b
VALUE="Logoff">
<LABEL FOR="LogoffUser">3авершение сеанса пользователя
</LABEL><BR>
<INPUT ID="Restart" TYPE=radio NAME="rbAction" VALUE="Restart">
<LABEL FOR="Restart"Перезагрузка KOMnbK)Tepa</LABEL><BR>
<INPUT ID="Shutdown" TYPE=radio NAME="rbAction,,(b
VALUE="Shutdown">
<LABEL F0R="Shutdown">BbiKnro4eHne KOMnbK)Tepa</LABEL><BR>
<INPUT TYPE="button" VALUE=" Вьшолнить действие "
NAME="btnExecuteAction">
</FIELDSET>
</TD>
</TR>
<TR>
<TD>
<FIELDSET>
<LEGEND>3anymeHHbie npoueccbi</LEGEND>
<SPAN ID="optProcess">
<SELECT STYLE ="WIDTH: 280px" NAME="selProcess" SIZE=10 SINGLE>
</SELECT>
</SPAN>
</FIELDSET>
</TD>
<TD VALIGN="top">
<FIELDSET>
<LEGEND>Xpoнoлoгия запуска npoueccoB</LEGEND>
<TEXTAREA name=taEventList rows=10 cols=50x/TEXTAREA>
</FIELDSET>
</TD>
</TR>
<TR>
<TD SPAN="3M>
<INPUT TYPE=checkbox NAME="cbUserProc">
Процессы пользователя
<INPUT TYPE="button" УАШЕ="Завершить" NAME=,,btnTerminate">
</TD>
</TR>
</TABLE>
<BR>
</FORM>
</BODY>
</HTML>
Вывод HTML-формы из сценария WMI
Для того чтобы вывести из сценария WMI разработанную HTML-форму на
экран, нужно вначале получить ссылку на объект Application, который
определяется в объектной модели браузера Internet Explorer. В нашем случае
делается это следующим образом:
Set objIE = WScript.CreateObjееt("InternetExplorer.Application", "ie_")
При этом в память загружается новый экземпляр Internet Explorer, а ссылка
на этот объект присваивается глобальной переменной objiE (само окно
браузера по умолчанию невидимо, для его отображения на экране
необходимо установить СВОЙСТВО Visible Объекта Application paBHbIM True).
В качестве второго параметра метода createobject указан префикс •• ie_\
посредством которого мы сможем написать функции-обработчики событий
Internet Explorer.
Внешний вид браузера Internet Explorer настраивается с помощью
нескольких СВОЙСТВ Объекта Application!
' Устанавливаем свойства объекта objIE для отображения формы
objIE.AddressBar = False f Адресная строка не выводится
objIE.Fullscreen = False f Полноэкранный режим запрещен
objIE.MenuBar = False ' Главное меню браузера не выводится
objIE.Resizable = False f Изменять размеры окна нельзя
objIE.StatusBar = False f Строка статуса не выводится
objIE.ToolBar = False f Инструментальная панель не выводится
'Устанавливаем размеры окна
objIE.Height = 500 'Высота
objIE.Width =780 'Длина
Для того чтобы загрузить в браузер нужный нам файл Form.htm с
описанием формы, ИСПОЛЬЗуетСЯ меТОД Navigate объекта Application!
strPathHTML = WshShell .CurrentDirectory & "\" & "Form.htm"
objIE.Navigate strPathHTML
Далее следует учесть, что сценарий VBScript и окно браузера, в котором
загружается форма, — это два независимых процесса. Поэтому в сценарии
нам нужно дождаться, когда форма будет полностью загружена в браузер
(при этом свойство Busy объекта Application станет равным False):
' Дожидаемся окончания загрузки HTML-формы
Do While (objIE.Busy)
WScript.Sleep 200
Loop
После этого вызывается процедура showForm, которая отображает HTML-
форму на экране и определяет для элементов управления в форме
соответствующие процедуры-обработчики (подробно эта процедура рассмотрена
далее). После загрузки формы в окно браузера необходимо дождаться, пока
пользователь не закроет это окно. Для этого мы присвоим глобальной
переменной bisQuit значение False и заставим сценарий выполняться до тех
пор, пока значение этой переменной не станет равным True:
bisQuit = False
While Not bisQuit
WScript.Sleep 100
Wend
При закрытии формы будет генерироваться событие onQuit объекта
Application, ПОЭТОМУ МЫ напишем ПрОЦедуру-обрабоТЧИК ie_OnQuit()
ЭТОГО СОбыТИЯ, В КОТОРОЙ будем устанавливать bisQuit равНЫМ True!
Sub ie_OnQuit
bisQuit = True
End Sub
Полностью процедура Main, в которой происходит загрузка HTML-формы,
приведена в листинге 7.2.
Листинг 7.2. Основная процедура запуска Main
Sub Main
' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
1 Создаем объект InternetExplorer.Application с возможностью
f обработки событий этого объекта
Set objIE = WScript.CreateObject(_
11 InternetExplorer.Application", "ie_")
' Устанавливаем свойства объекта objIE для отображения формы
objIE.AddressBar = False
objIE.Fullscreen = False
objIE.MenuBar = False
objIE.Resizable = False
objIE.StatusBar = False
objIE.ToolBar = False
'Устанавливаем размеры окна
objIE.Height = 500 'Высота
objIE.Width =780 'Длина
' Загружаем HTML-файл с формой
strPathHTML = WshShell.CurrentDirectory & "\" & "Form.htm"
objIE.Navigate strPathHTML
1 Дожидаемся окончания загрузки HTML-формы
Do While (objIE.Busy)
WScript.Sleep 200
Loop
' Отображаем HTML-форму на экране
ShowForm
blsQuit = False
' Приостанавливаем сценарий
While Not blsQuit
WScript.Sleep 100
Wend
End Sub
В нашем сценарии мы будем обрабатывать события, связанные с нажатием
кнопок или выбором флажков в форме и с изменением текста в полях
ввода. Для этого нужно, во-первых, получить ссылку на соответствующий
элемент управления в форме, зная его имя, которое задается атрибутом name
в HTML-файле, например:
<INPUT TYPE="button" VALUE=" Подключить " NAME="btnConnect">
Для доступа к элементу управления используется объект Document, который
соответствует загруженному в браузер HTML-документу. Ссылка на объект
Document Хранится В СВОЙСТВе Document объекта Application!
1 Получаем ссылку на объект Document
Set objDocument = objIE.Document
Обработчики событий для элементов управления формы указываются тогда
следующим образом:
objDocument. all. ControlName. EventName = GetRef (FunctionName)
Здесь ControlName— ИМЯ элемента управления В форме, EventName— ИМЯ
обрабатываемого события, GetRef о — стандартная функция языка VBScript,
FunctionName — имя процедуры-обработчика, которая будет вызываться при
наступлении события EventName. Событие, возникающее при нажатии
кнопки или выборе флажка в форме, называется onclick, а событие,
происходящее при изменении текста в поле ввода, — onchange:
f Определяем процедуры-обработчики событий элементов управления в форме
Set objDocument.all.selDomain.onChange = GetRef("SeekComputers")
Set objDocument.all.btnConnect.onClick = GetRef("Connect")
Set objDocument.all.btnExecuteAction.onclick = GetRef("ExecuteAction")
Set objDocument.all.cbUserProc.onclick = GetRef("RefreshProcessList")
Set objDocument.all.btnTerminate.onClick = GetRef("Terminate")
Полностью процедура showForm, которая отображает HTML-форму
Form.htm на экране, формирует список доступных доменов и определяет
соответствующие процедуры-обработчики для элементов управления в
форме, приведена в листинге 7.3.
Листинг 7.3. Процедура showForm для отображения HTML-формы на экране
Sub ShowForm
f Получаем ссылку на объект Document
Set objDocument = objIE.Document
f Формируем список доменов
SeekDomains
f Формируем список компьютеров
SeekComputers
f Делаем окно Internet Explorer видимым
objIE.Visible = True
1 Делаем доступной кнопку "Подключить"
objDocument.all.btnConnect.Disabled = False
f Делаем недоступными элементы управления в форме
objDocument.all.btnExecuteAction.Disabled - True
objDocument.all.btnTerminate.Disabled = True
objDocument.all.cbUserProc.Disabled = True
objDocument.all.txtCurrUser.Disabled = True
objDocument.all.txtIP.Disabled = True
objDocument.all.txtMAC.Disabled = True
f Определяем процедуры-обработчики событий элементов управления в форме
Set objDocument.all.selDomain.onChange = GetRef("SeekComputers")
Set objDocument.all.btnConnect.onClick = GetRef("Connect")
Set objDocument.all.btnExecuteAction.onClick = GetRef("ExecuteAction")
Set objDocument.all.cbUserProc.onClick = GetRef("RefreshProcessList")
Set objDocument.all.btnTerminate.onClick = GetRef("Terminate")
End Sub
Сценарий Sample_WMI_TooLvbs
Полностью сценарий Sample_WMl_Tool.vbs с подробными комментариями
приведен в листинге 7.4.
Листинг 7.4. WMI-утилита для администрирования рабочих станций
f Имя: Sample_WMI_Tool.vbs
1 Язык: VBScript
1 Описание: WMI-утилита для администрирования рабочих станций
Option Explicit
1 Объявляем глобальные переменные
Dim WshShell f Объект WshShell
Dim objIE f Объект InternetExplorer.Application
Dim objDocument f Объект Document
Dim strPathHTML f Путь к HTML-форме
Dim objLocator f Объект SWbemLocator
Dim objService ' Объект SWbemService
Dim objSink ' Объект SWbemSink
Dim blsQuit ' Переменная-флаг выхода из цикла
i
1 Отображение HTML-формы на экране
Sub ShowForm
' Получаем ссылку на объект Document
Set objDocument = objIE.Document
f Формируем список доменов
SeekDomains
f Формируем список компьютеров
SeekComputers
f Делаем окно Internet Explorer видимым
objIE.Visible = True
1 Делаем доступной кнопку "Подключить"
objDocument.all.btnConnect.Disabled = False
f Делаем недоступными элементы управления в форме
objDocument.all.btnExecuteAction.Disabled = True
objDocument.all.btnTerminate.Disabled = True
obj Document.all.cbUserProc.Disabled = True
objDocument.all.txtCurrUser.Disabled = True
objDocument.all.txtlP.Disabled = True
objDocument.all.txtMAC.Disabled = True
f Определяем процедуры-обработчики событий элементов управления"в форме
Set objDocument.all.selDomain.onChange = GetRef("SeekComputers")
Set objDocument.all.btnConnect.onclick = GetRef("Connect")
Set objDocument.a11.btnExecuteAction.onClick = GetRef("ExecuteAction")
Set objDocument.all.cbUserProc.onClick = GetRef("RefreshProcessList")
Set objDocument.all.btnTerminate.onClick = GetRef("Terminate")
End Sub
f Формирование и вывод списка доступных доменов
Sub SeekDomains
f Объявляем переменные
Dim objNamespace, obj Domain, strHTML
f Связываемся с корневым объектом Namespace
Set objNamespace = GetObject("WinNT:")
f Устанавливаем фильтр для выделения объектов-доменов
objNamespace.Filter = Array("domain")
f Формируем HTML-код раскрывающегося списка доменов
strHTML = "<SELECT STYLE='WIDTH: 150px' NAME='selDomain">"
StrHTML = StrHTML & "<OPTION VALUE = ' ,x/OPTION>"
f Перебираем в цикле все имеющиеся домены
For Each objDomain In objNamespace
1 Формируем HTML-строку с именем домена
strHTML = strHTML & "<OPTION VALUE=" &"'" & objDomain.Name & "' >"
strHTML = strHTML & objDomain.Name & "</OPTION>"
Next
1 Вставляем HTML-код в документ
objDocument.all.optDomain.InnerHTML=strHTML
End Sub
1 Формирование и вывод списка компьютеров в домене
Sub SeekComputers
1 Объявляем переменные
Dim strHTML, strDomain, objDomain, objComp
strHTML = "<SELECT STYLE='WIDTH: 150px' NAME='selStation'>"
If objDocument.all.selDomain.Valueo"" Then 'Выбран определенный домен
1 Извлекаем имя домена
strDomain = objDocument.all.selDomain.Value
1 Связываемся с объектом Domain
Set objDomain = GetObject("WinNT://" & strDomain)
1 Перебираем все объекты домена
For Each objComp In objDomain
If 'objСотр.Сlass = "Computer" Then
1 Формируем HTML-строку с именем компьютера
strHTML = strHTML & "OPTION VALUE=' " & obj Сотр. Name & '">" &_
objСотр.Name & "</OPTION>"
End If
Next
strHTML = strHTML & "</SELECT>"
Else
1 Выбран пустой домен - работаем с локальной машиной
StrHTML = StrHTML & "OPTION VALUE= ' . ' >. </OPTION>"
End If
1 Вставляем сформированный HTML-код в документ
objDocument.all.optStation.InnerHTML = strHTML
End Sub
1 Подключение к службе WMI
Sub Connect
1 Объявляем переменные
Dim strComputer, strUser, strIP, strMAC, strPassword, intRes
On Error Resume Next
1 Извлекаем имена компьютера, пользователя и пароль
strComputer = objDocument.all.selStation.Value
strUser = objDocument.a11.txtUser.Value
strPassword = objDocument.all.txtPassword.Value
1 Создаем объект SWbemLocator
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
If strComputer="." Then
1 Соединяемся со службой WMI на локальном компьютере
Set objService = objLocator.ConnectServer(".", "Root\CIMV2")
Else
1 Соединяемся со службой WMI на удаленном компьютере
Set objService = objLocator.ConnectServer(strComputer,"Root\CIMV2",
strUser,strPassword)
End If
1 Обрабатываем ошибки
If Err.Number <> 0 Then f Произошла ошибка при подключении к WMI
1 Выводим сообщение об ошибке
intRes = MsgBox ("Ошибка при соединении с WMI # " &_
CStr(Err.Number) & " " & Err.Description,_
vbOkOnly+vblnformation,"Ошибка")
1 Очищаем свойства объекта Err
Err.CIear
Else
1 Выводим список процессов
ShowProcesses("All")
1 Подписываемся на извещения о событиях WMI
SubscribeEvents
1 Определяем имя активного пользователя
objDocument.all.txtCurrUser.Value = GetCurrentUserName
1 Определяем MAC- и IP-адреса сетевого адаптера
GetNetworkAdapterlnfo strIP, strMAC
objDocument.a11.txtIP.Value = strIP
obj Document.all.txtMAC.Value = s trMAC
1 Делаем доступными элементы управления в форме
objDocument.all.btnExecuteAction.Disabled = False
objDocument.all.btnTerminate.Disabled = False
objDocument.all.btnTerminate.Disabled = False
objDocument.all.cbUserProc.Disabled = False
End If
End Sub
i
' Получение имени активного пользователя
Function GetCurrentUserName
1 Объявляем переменные
Dim ColUserName, objUserName
1 Создаем коллекцию экземпляров класса Win32_ComputerSystem
Set ColUserName = objService.ExecQuery _
("SELECT * FROM Win32_ComputerSystem")
' Перебираем коллекцию
For Each objUserName In ColUserName
1 Возвращаем имя активного пользователя
GetCurrentUserName = objUserName.UserName
Next
End Function
1 Получение IP- и МАС-адресов сетевого адаптера
Function GetNetworkAdapterInfo(ByRef strIP, ByRef strMac)
1 Объявляем переменные
Dim colNetworkAdapters, objNetworkAdapter, colPnPDevices
Dim objPnpDevice, colDeviceBuses, objDeviceBus
Dim colNetworkAdapterSettings, objNetworkAdapterSetting
' Создаем коллекцию экземпляров класса Win32_NetworkAdapter
Set colNetworkAdapters = objService.ExecQuery(_
"SELECT * FROM Win32_NetworkAdapter")
1 Перебираем элементы коллекции
For Each objNetworkAdapter In colNetworkAdapters
1 Создаем коллекцию экземпляров класса Win32_PnPDevice
Set colPnPDevices = objService.ExecQuery _
("ASSOCIATORS OF {Win32_NetworkAdapter.DeviceID='" & _
objNetworkAdapter.DevicelD & "'} " &_
" WHERE AssocClass=Win32_PnPDevice")
1 Перебираем элементы коллекции
For Each objPnpDevice In colPnPDevices
1 Создаем коллекцию соответствующих экземпляров
1 класса Win32_DeviceBus
Set colDeviceBuses = objService.ExecQuery _
("ASSOCIATORS OF {Win32_PnPEntity.DeviceID='" & _
objPnpDevice.DevicelD & "'} " &_
" WHERE AssocClass=Win32_DeviceBus")
1 Перебираем элементы коллекции
For Each objDeviceBus In colDeviceBuses
1 Определяем МАС-адрес сетевого адаптера
strMac = objNetworkAdapter.MACAddress
1 Создаем коллекцию соответствующих экземпляров класса
1 Win32_NetworkAdapter
Set colNetworkAdapterSettings = objService.ExecQuery _
("ASSOCIATORS OF {Win32_NetworkAdapter.DeviceID='" & _
objNetworkAdapter.DevicelD & "'} " &_
" WHERE AssocClass = Win32_NetworkAdapterSetting")
1 Перебираем элементы сформированной коллекции
For Each objNetworkAdapterSetting In colNetworkAdapterSettings
strIP = objNetworkAdapterSetting.IPAddress(0)
Next
Next
Next
Next
End Function
1 Завершение сеанса пользователя
Sub Logoff
1 Объявляем переменные
Dim strQuery, colOS, objOS
strQuery = "SELECT * FROM Win32_OperatingSystem"
Set colOS = objService.ExecQuery(strQuery)
For Each objOS In colOS
objOS.Win32Shutdown(0)
Next
End Sub
i
1 Перезагрузка компьютера
Sub Reboot
1 Объявляем переменные
Dim strQuery, colOS, objOS
strQuery = "SELECT * FROM Win32_OperatingSystem"
Set colOS = objService.ExecQuery(strQuery)
For Each objOS In colOS
obj OS.Reboot
Next
End Sub
1 Выключение компьютера
Sub Shutdown
1 Объявляем переменные
Dim strQuery, colOS, objOS
strQuery = "SELECT * FROM Win32_OperatingSystem"
Set colOS = objService.ExecQuery(strQuery)
For Each objOS In colOS
objOS.Shutdown
Next
End Sub
i
1 Выбор и выполнение нужного действия
Sub ExecuteAction
Dim intRes
If objDocument.all.rbAction("LogoffUser").checked Then
1 Завершаем сеанс работы активного пользователя
intRes = MsgBox ("Завершить сеанс пользователя " &_
objDocument.all.txtCurrUser.Value & "?",_
vbYesNo+vbQuestion,"Действия")
If intRes = vbYes Then
Logoff
End If
Elself objDocument.all.rbAction("Restart").checked Then
1 Перезагружаем компьютер
intRes = MsgBox ("Перезагрузить компьютер " &_
objDocument.all.selStation.Value &_
"?",vbYesNo+vbQuestion,"Действия")
If intRes = vbYes Then
Reboot
End If
Elself objDocument.all.rbAction("Shutdown").checked Then
1 Выключаем компьютер
intRes = MsgBox ("Выключить компьютер " &_
objDocument.all.selStation.Value &_
"?",vbYesNo+vbQuestion,"Действия")
If intRes = vbYes Then
Shutdown
End If
End If
End Sub
1 Формирование и вывод списка запущенных процессов
Sub ShowProcesses(strMode)
1 Объявляем переменные
Dim strHTML, colProcesses, objProcess, intRes
Dim strUserDomain, strUserName, strFullUserName
strHTML = "<SELECT SINGLE STYLE='WIDTH: 280px' NAME='selProcess'Ъ
SIZE=10>"
1 Создаем коллекцию экземпляров класса Win32_Process
Set colProcesses = objService.ExecQuery("SELECT * FROM Win32_Process")
1 Перебираем элементы коллекции процессов
For Each objProcess In colProcesses
1 Определяем владельца процесса
intRes = objProcess.GetOwner(strUserName,strUserDomain)
strFullUserName = strUserDomain & "\" & strUserName
If strMode="All" Then
1 Выводим все процессы
strHTML = strHTML & "<OPTION VALUE='" & objProcess.Name & '">"
strHTML = strHTML & objProcess.Name & "</OPTION>"
Else
1 Выводим только процессы пользователя
If strFullUserName=objDocument. all. txtCurrUser .Value Then
strHTML = strHTML & "<OPTION VALUE='" & objProcess.Name & "'>"
strHTML = strHTML & objProcess.Name & "</OPTION>"
End If
End If
Next
StrHTML = StrHTML & "</SELECT>"
1 Записываем HTML-строку в документ
objDocument.all.optProcess.InnerHTML=strHTML
End Sub
i
1 Обновление списка процессов
Sub RefreshProcessList
If obj Document.all.cbUserProc.Checked Then
1 Выводим только процессы пользователя
ShowProcesses("User")
Else
1 Выводим все процессы
ShowProcesses("All")
End If
End Sub
i
1 Завершение работы процесса
Sub Terminate
1 Объявляем переменные
Dim strProcess, strQuery, colProcesses, objProcess, intRes
'Извлекаем имя выделенного процесса из списка
strProcess = objDocument.all.selProcess.Value
1 Выводим запрос на завершение процесса
intRes = MsgBox ("Завершить процесс " & strProcess & "?",_
vbYesNo+vbQuestion,"Процессы")
If intRes = vbYes Then
strQuery = "SELECT * FROM Win32_Process WHERE Name='" &_
strProcess & "'"
1 Формируем коллекцию процессов с именем strProcess
Set colProcesses = objService.ExecQuery(strQuery)
1 Перебираем коллекцию процессов
For Each objProcess In colProcesses
1 Завершаем работу текущего процесса
obj Process.Terminate
Next
1 Обновляем список процессов
RefreshProcessList
End If
End Sub
1 Подписка на извещения о создании процессов
Sub SubscribeEvents
1 Создаем объект SWbemSink
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")
1 Выполняем запрос для подписки на извещения о событиях WMI
objService.ExecNotificationQueryAsync objSink, _
"SELECT * FROM InstanceCreationEvent " & _
"WITHIN 3 WHERE Targetlnstance ISA 'Win32_Process'"
End Sub
1 Процедура-обработчик события OnObjectReady объекта SWbemSink
Sub Sink_OnObjectReady(oOutParams, oContext)
Dim strEventsInfo
1 Формируем строку для вывода
strEventsInfo = objDocument.all.taEventList.InnerText
strEventsInfo = Date & " " & Time & " запущен " &_
oOutParams.TargetInstance.Name & Chr(lO) & strEventsInfo
1 Записываем HTML-строку в документ
objDocument.all.taEventList.InnerText = strEventsInfo
1 Обновляем список процессов
RefreshProcessList
End Sub
'Процедура-обработчик закрытия окна Internet Explorer
Sub ie_OnQuit
blsQuit = True
End Sub
'Основная процедура запуска
Sub Main
1 Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
' Создаем объект InternetExplorer.Application с возможностью
1 обработки событий этого объекта
Set objIE = WScript.CreateObject(_
"InternetExplorer.Application", "ie_")
' Устанавливаем свойства объекта objIE для отображения формы
objIE.AddressBar = False
objIE.Fullscreen = False
objIE.MenuBar = False
objIE.Resizable = False
objIE.StatusBar = False
objIE.ToolBar = False
'Устанавливаем размеры окна
objIE.Height = 500 'Высота
objIE.Width =780 'Длина
' Загружаем HTML-файл с формой
strPathHTML = WshShell.CurrentDirectory & "\" & "Form.htm"
objIE.Navigate strPathHTML
1 Дожидаемся окончания загрузки HTML-формы
Do While (objIE.Busy)
WScript.Sleep 200
Loop
1 Отображаем HTML-форму на экране
ShowForm
blsQuit = False
1 Приостанавливаем сценарий на 1 сек.
While Not blsQuit
WScript.Sleep 100
Wend
End Sub
*********************** Начало *************************************
Main
» ********************* Конец **************************************
Сценарий для инвентаризации оборудования
на рабочих станциях
Напишем сценарий, с помощью которого можно будет централизованно
производить инвентаризацию (опись) параметров удаленных рабочих
станций — мы будем сохранять с помощью технологии ADO (Active Database
Objects) в базе данных Microsoft Access информацию о версии операционной
системы, параметрах BIOS, процессора, жестких дисков, сетевых адаптеров
и т. д. Используя данную информацию, можно будет с помощью
стандартных средств Microsoft Access выполнять различные выборки (например,
сформировать отчет о всех компьютерах, на которых установлена
операционная система Windows 2000 и которые имеют менее 128 Мбайт памяти, или
выделить все компьютеры, в которых за последний месяц изменилось число
жестких дисков).
Структура таблицы для инвентаризации
Данные о параметрах рабочих станций мы будем сохранять в одной таблице
invent, структура которой приведена в табл. 7.1.
Таблица 7.1. Структура таблицы invent
Поле Тип данных Длина Описание
station Текстовый 20 Сетевое имя проверяемой рабочей станции
(например, shikin)
Data Текстовый 20 Текущая дата и время
Таблица 7.1 (окончание)
Поле
Тип данных Длина Описание
OperSys
BIOS
CPU
Memory
HDD
CDROM
Video
Текстовый
Текстовый
Текстовый
Текстовый
Текстовый
Текстовый
Текстовый
100
100
100
100
200
100
100
Sound
Ports
NetCard
Текстовый
Текстовый
Текстовый
100
100
200
Keyboard
Mouse
Текстовый
Текстовый
100
100
Название операционной системы, дата и время
ее установки (например, Microsoft Windows
2000 Professional, 08.04.2003 12:31:46;)
Название и серийный номер BIOS (например,
Default System BIOS, S/N:FR14329405;)
Тип и тактовая частота процессора (например,
Intel Celeron processor, 900МГц;)
Название и объем банков памяти (например,
DIMM1: 128Мб;)
Названия и размеры установленных жестких
ДИСКОВ (например, Диск 0: ST320014A,
19092.87Мб; Диск 1: MPF3102AT, 9773.36Мб;)
Модель привода CD-ROM (например, hitachi
CDR-8435;)
Название видеоадаптера, объем видеопамяти,
текущее разрешение, частота вертикальной
развертки (например, Intel (R) 82815
Graphics Controller, Adapter RAM = 4Мб,
1024x768, 85Гц;)
Название и производитель звуковой карты
(например, Realtek AC97 Audio, Realtek;)
Имена портов (например, lpti,- comI;
COM2; COM3; COM4;)
Название сетевого адаптера, MAC- и IP-адреса
(например, 3Com EtherLink Server 10/100
PCI (3C980C-TXM), MAC = 00:04:75:C1:5C:29,
IP = 10.169.1.50)
Тип клавиатуры (например, Расширенная
клавиатура (101 или 102 клавиши);)
Тип мыши (например, Мышь PS/2-
совместимая;)
Данная таблица будет создана в сценарии автоматически, однако
предварительно нужно в системе зарегистрировать DSN (Data Source Name, имя
источника данных) с именем invent, который будет указывать на
существующий файл Microsoft Access (например, C:\Invent.mdb) (рис. 7.2).
Рис. 7.2. Системный DSN, указывающий на файл Microsoft Access,
в котором будет создана таблица invent
НТА-файл для интерфейса сценария
Напомним, что рассмотренная ранее утилита администрирования рабочих
станций была реализована в виде двух файлов: описание графического
интерфейса находилось в HTML-файле, а сам сценарий — в VBScript-файле.
В нашей утилите инвентаризации мы используем другой подход, объединив
тело сценария и описание диалогового окна в один файл HTML Application (HTA)
с именем Invent.hta, который будет запускаться и выполняться на локальном
компьютере как обычная HTML-страница со встроенными сценариями,
игнорируя при этом настройки безопасности браузера Internet Explorer.
Рис. 7.3. Диалоговое окно утилиты инвентаризации рабочих станций
После запуска файла Invent.hta на экран будет выведено диалоговое окно
с двумя переключателями, позволяющими выбрать источник имен файлов
для инвентаризации (в нашем случае это может быть либо текстовый файл
Computerlist.txt, который должен быть записан в том же каталоге, что
и файл Invent.hta, либо домен с именем Domain 1), и кнопкой Начать
инвентаризацию (рис. 7.3).
В листинге 7.5 приведен фрагмент файла Invent.hta с описанием данного
диалогового окна.
Листинг 7.5. Реализация графического интерфейса утилиты в НТА-файле
.......•..>; ... . . .»... ..... ...... . ., . ....,,......,..*■« ,.. .1............, I. •
<HTML>
<Т1ТЬЕ>Инвентаризация компьютеров</Т1ТЬЕ>
<HEAD>
<МЕТА HTTP-EQUIV="Content-Type" CONTENT="text/html; Ъ
charset=windows-1251">
<HTA:Application
Border = Thick
Borderstyle = Complex
ShowInTaskBar = Yes
APPLICATIONNAME="Invent"
SCROLL=No
SINGLEINSTANCE=Yes
MaximizeButton = No
MinimizeButton = No
>
<SCRIPT LANGUAGE^"VBScript">
' Запуск инвентаризации
Sub Start
End Sub
</SCRIPT>
</HEAD>
<BODY BGCOLOR="silver">
<FIELDSET>
<LEGEND>CnncoK KOMnbK)TepoB</LEGEND>
<INPUT ID="FromFile" TYPE=radio NAME=MrbComputerListM VALUE="File">
<LABEL FOR="FromFile"><Daun Computerlist. txt</LABELXBR>
<INPUT ID=nFromDomainM TYPE=radio NAME=MrbComputerList" ^
VALUE="Doma in">
<LABEL FOR="FromDomain">floMeH Domainl</LABEL><BR>
</FIELDSET><BR>
<INPUT TYPE="button" УАШЕ="Начать инвентаризацию" NAME="btnStart" on-
Click="Start()">
<BR><BR>
<SPAN ID="Status">
Процесс не запущен
</SPAN>
</BODY>
</HTML>
Сценарий Invent.hta
Как мы видим из листинга 7.5, в результате нажатия кнопки Начать
инвентаризацию вызывается процедура start, которая является
обработчиком события onclick для этой кнопки. В процедуре start происходит
занесение (с ПОМОЩЬЮ Процедуры FillComputerDictionaryFromDomain ИЛИ
FillComputerDictionaryFromFile) В объект objDictionary имен
компьютеров, для которых необходимо выполнить инвентаризацию, и вызывается
основная процедура инвентаризации invent. Рассмотрим процедуру invent
более подробно.
В самом начале здесь включается режим игнорирования ошибок и делается
попытка создать таблицу invent требуемой структуры (если таблица invent
уже была в базе, то она будет открыта):
On Error Resume Next
strSQLCommand = "CREATE TABLE INVENT ( " &_
" Station varchar (20), " &_
" Data varchar (20), " &_
11 OperSys varchar (100), " &_
" Bios varchar (100), " &_
" CPU varchar (100), " &_
11 Memory varchar (100) , " &_
" HDD varchar(200) , " &_
" CDROM varchar(100) , " &_
" Video varchar (100), " &_
" Sound varchar (100), " &_
" Ports varchar (100), " &_
" NetCard varchar (200), " &_
" Keyboard varchar (100), " &_
" Mouse varchar (100) • " &_
и ) и
' Создаем объект ADODB.Connection
Set objConnect = CreateObject("ADODB.Connection")
' Создаем объект ADODB.Recordset
Set objRecordset = CreateObject("ADODB.Recordset")
' Устанавливаем соединение с источником данных
objConnect.Open "DSN=Invent;"
' Создаем новую таблицу для хранения записей
objConnect.Execute strSQLCoinmand,,adExecuteNoRecords
' Обрабатываем ошибки
If Err.Number = 0 Then
' Выводим сообщение о создании таблицы
MsgBox "Создана таблица INVENT "
End If
' Очищаем объект Err
Err.Clear
' Устанавливаем свойство курсора базы данных
objRecordset.CursorLocation = adUseClient
' Открываем набор данных
objRecordset.Open "SELECT * FROM INVENT" , objConnect, _
adOpenStatic, adLockOptimistic
После этого в цикле For Each мы подсоединяемся к подсистеме WMI
каждого КОМПЬЮТера, ИМЯ КОТОРОГО Хранится В Элементе Объекта obj Dictionary.
Если при подключении возникает ошибка, то в таблицу добавляется строка
С Соответствующим сообщением В ПОЛе OperSys ("Ошибка при подключении
к пространству имен wmi"). Если соединение с WMI на удаленном
компьютере прошло успешно, то в таблицу добавляется новая запись, поля
которой заполняются с помощью вызова соответствующих функций
(GetOperSysInf о (), GetBiosInf о (), GetCpuInf о (), GetMemorylnf о О И Т. Д.):
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
' Перебираем в цикле все элементы объекта Dictionary
For Each objItem In objDictionary
' Очищаем объект Err
Err.Clear
' Получаем имя компьютера из текущего элемента объекта Dictionary
strComputer = objDictionary.Item(objItem)
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" &_
strComputer & "\" & strNamespace)
' Обрабатываем ошибки
If Err.Number <> 0 then
' Добавляем новую запись
obj Recordset. AddNew
' Заполняем поля
objRecordset("Station") = strComputer
objRecordset("Data") = Date & " " & Time
objRecordset("OperSys") = "Ошибка при подключении к " &_
" пространству имен WMI"
' Сохраняем запись
obj Recordset.Update
Else
' Добавляем новую запись
objRecordset.AddNew
' Заполняем поля
objRecordset("Station") = GetStationName()
objRecordset("Data") = Date & " " & Time
objRecordset("OperSys") = GetOperSysInfо()
objRecordset("Bios") = GetBiosInfo()
objRecordset("CPU") = GetCpuInfо()
objRecordset ("Memory") = GetMemorylnfо ()
objRecordset("HDD") = GetHDDInfо()
objRecordset("CDROM") = GetCDROMInfо()
objRecordset("Video") = GetVideoInfо()
objRecordset("Sound") = GetSoundlnfо()
objRecordset("Ports") = GetPortsInfо()
objRecordset("NetCard") = GetNetCardlnfо()
objRecordset("Keyboard") = GetKeyboard()
objRecordset("Mouse") = GetMouselnfo()
' Сохраняем запись
obj Recordset.Update
End If
Next
В функциях, заполняющих поля новой записи, выполняется
соответствующий WQL-запрос, перебирается коллекция объектов, которые возвращаются
этим запросом, и формируется строка со значениями нужных свойств
объектов. Например, функция GetHDDinfoO, возвращающая строку с
информацией о жестких дисках, имеет следующий вид:
Function GetHDDinfoO
strResult = ""
1 Создаем коллекцию экземпляров класса Win32_DiskDrive
Set Col = objService.ExecQuery("SELECT * FROM Win32_DiskDrive")
1 Перебираем элементы коллекции
For Each Obj In Col
1 Формируем строку для записи в базу данных
strResult = strResult & "Диск " & Obj.Index & ": " & Ob].Model &_
", " & SizeFormat(Obj.Size,"Mb") & "Мб; "
Next
1 Возвращаем результат
GetHDDInfo = strResult
End Function
Полностью файл Invent.hta приведен в листинге 7.6.
Листинг 7.6. Утилита для инвентаризации оборудования Inventhta
<HTML>
<Т1ТЬЕ>Инвентаризация компьютеров</Т1ТЬЕ>
<HEAD>
<МЕТА HTTP-EQUIV=" Content-Type" CONTENT=" text /html; <*>
charset=windows-1251">
<HTA:Application
Border = Thick
Borderstyle = Complex
ShowInTaskBar = Yes
APPLICATIONNAME="Invent"
SCROLL=No
SINGLEINSTANCE=Yes
MaximizeButton = No
MinimizeButton = No
>
<SCRIPT LANGUAGE="VBScript">
' Объявляем глобальные переменные
Dim objDocument ' Объект Document
Dim strComputer ' Имя компьютера
Dim strNamespace ' Имя пространства имен
Dim objService ' Объект SWbemService
Dim strSQLCommand ' Строка для создания таблицы
Dim objConnect ' Объект ADODB.Connection
Dim objRecordset ' Объект ADODB.Recordset
Dim Obj ' Элемент коллекции
Dim Col ' Коллекция экземпляров класса WMI
Dim strResult ' Строка результата
Dim objDictionary ' Объект Dictionary
Dim objItem ' Элемент объекта Dictionary
1 Объявляем константы
const adExecuteNoRecords = &H80
const adUseClient = 3
const adOpenStatic = 3
const adLockOptimistic = 3
1 Константа для задания режима открытия файла
Const ForReading - 1
'Процедура-обработчик события OnLoad
Sub window_OnLoad
Set objDocument = self.Document
'Устанавливаем размеры окна
self.ResizeTo 350,250
self.MoveTo 300,200
objDocument.all.rbComputerList("FromFile").checked = True
End Sub
' Запуск инвентаризации
Sub Start
Dim strPathTXT, WshShell, intRes
' Делаем недоступной кнопку "Начать инвентаризацию"
objDocument.all.btnStart.Disabled = True
objDocument.all.Status.InnerHTML="Процесс запущен ..."
intRes = MsgBox ("Запустить процесс?",_
vbYesNo+vbQuestion,"Инвентаризация")
If intRes = vbYes Then
' Запускаем процесс инвентаризации
If objDocument.all.rbComputerList("FromFile").checked Then
' Создаем объект WshShell
Set WshShell = CreateObject("WScript.Shell")
1 Определяем полный путь к файлу computerlist.txt
strPathTXT = WshShell.CurrentDirectory & "\" & "computerlist.txt"
' Заполняем объект Dictionary значениями из файла
FillComputerDictionaryFromFile(strPathTXT)
Else
1 Заполняем объект Dictionary именами компьютеров из домена
FillComputerDictionaryFromDomain()
End If
' Начинаем инвентаризацию
Invent
Else
' Делаем доступной кнопку "Начать инвентаризацию"
objDocument.all.btnStart.Disabled = False
objDocument.all.Status.1ппегНТМЬ="Процесс не запущен"
End If
End Sub
i
1 Процедура инвентаризации
Sub Invent
Dim intRes
On Error Resume Next
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strSQLCommand = "CREATE TABLE INVENT ( " &_
" Station varchar (20) , " &_
" Data varchar (20), " &_
" OperSys varchar (100), " &_
" Bios varchar (100), " &_
" CPU varchar (100), " &_
" Memory varchar (100), " &_
" HDD varchar(200) , " &_
" CDROM varchar(100) , " &_
" Video varchar (100), " &_
" Sound varchar (100), " &_
" Ports varchar (100), " &_
" NetCard varchar (200), " &_
" Keyboard varchar (100), " &_
" Mouse varchar (100) " &_
" ) "
1 Создаем объект ADODB.Connection
Set objConnect = CreateObject("ADODB.Connection")
1 Создаем объект ADODB.Recordset
Set objRecordset = CreateObject("ADODB.Recordset")
1 Устанавливаем соединение с источником данных
objConnect.Open "DSN=Invent;"
' Создаем новую таблицу для хранения записей
objConnect.Execute strSQLCommand,,adExecuteNoRecords
' Обрабатываем ошибки
If Err.Number = 0 Then
1 Выводим сообщение о создании таблицы
MsgBox "Создана таблица INVENT "
End If
1 Очищаем объект Err
Err.Clear
' Устанавливаем свойство курсора базы данных
objRecordset.CursorLocation = adUseClient
' Открываем набор данных
obj Recordset.Open "SELECT * FROM INVENT" , objConnect, _
adOpenStatic, adLockOptimistic
1 Перебираем в цикле все элементы объекта Dictionary
For Each objItem In objDictionary
' Очищаем объект Err
Err.Clear
1 Получаем имя компьютера из текущего элемента объекта Dictionary
strComputer = objDictionary.Item (objItem)
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\" &_
strComputer & "\" & strNamespace)
' Обрабатываем ошибки
If Err.Number <> 0 then
' Добавляем новую запись
obj Recordset.AddNew
' Заполняем поля
objRecordset("Station") = strComputer
objRecordset("Data") = Date & " " & Time
objRecordset("OperSys") = "Ошибка при подключении к " &_
" пространству имен WMI"
1 Сохраняем запись
objRecordset.Update
Else
' Добавляем новую запись
obj Recordset.AddNew
' Заполняем поля
objRecordset("Station") = GetStationName()
objRecordset("Data") = Date & " " & Time
objRecordset("OperSys") = GetOperSysInfo()
objRecordset("Bios") = GetBiosInfo()
objRecordset("CPU") = GetCpuInfо()
objRecordset("Memory") = GetMemorylnfо()
objRecordset("HDD") = GetHDDInfо()
objRecordset("CDROM") = GetCDROMInfо()
objRecordset("Video") = GetVideoInfо()
objRecordset("Sound") = GetSoundlnfo()
objRecordset("Ports") = GetPortsInfo()
objRecordset("NetCard") = GetNetCardlnfо()
objRecordset("Keyboard") = GetKeyboard()
objRecordset("Mouse") = GetMouselnfо()
' Сохраняем запись
objRecordset.Update
End If
Next
1 Удаляем объект ADODB.Recordset
objRecordset.Close
1 Удаляем объект ADODB.Connection
objConnect.Сlose
intRes = MsgBox ("Процесс завершен",_
vbOkOnlу+vblnformation,"Инвентаризация")
1 Делаем доступной кнопку "Начать инвентаризацию"
objDocument.all.btnStart.Disabled = False
obj Document.all.Status.InnerHTML="Процесс не запущен"
End Sub
' Процедура для заполнения объекта Dictionary из домена
Sub FillComputerDictionaryFromDomain()
1 Объявляем переменные
Dim objDomain, objComputer, i
1 Создаем объект Dictionary
Set objDictionary = CreateObject("Scripting.Dictionary")
'Связываемся с объектом Domain
Set objDomain = GetObject("WinNT://Domainl")
'Устанавливаем фильтр для выделения объектов-компьютеров
objDomain.Filter = Array("computer")
i = 0
f Цикл для чтения строк из файла
For Each objComputer In objDomain
' Добавляем элемент в объект Dictionary
objDictionary. Add i, obj Computer. Name
i = i + 1
Next
End Sub
' Процедура для заполнения объекта Dictionary из файла
Sub FillComputerDictionaryFromFile(File)
' Объявляем переменные
Dim objFSO, objTextFile,i,s
1 Создаем объект Dictionary
Set objDictionary = CreateObject("Scripting.Dictionary")
1 Создаем объект FileSystemObject
Set objFSO = CreateObject("Scripting.FileSystemObject")
f Открываем файл для чтения
Set objTextFile = objFSO.OpenTextFile(File, ForReading)
i = 0
1 Цикл для чтения строк из файла
Do Until objTextFile.AtEndOfStream
f Читаем строку из файла
s = objTextFile.Readline
1 Добавляем элемент в объект Dictionary
objDictionary.Add i, s
i = i + 1
Loop
End Sub
1 Функция для конвертации даты формата WMI в строку
Function WMIDateStr(WMIDate)
WMIDateStr = CDate(Mid(WMIDate, 5, 2) & "." & _
Mid(WMIDate, 1,2) &"."&_
• Left(WMIDate, 4) & " " &_
Mid(WMIDate, 9, 2) &":"&__
Mid(WMIDate, 11, 2) & ":" & _
Mid(WMIDate, 13, 2))
End Function
•
1 Функция для преобразования байт в Мбайт
Function SizeFormat(iSize,strFormat)
f Объявляем локальные переменные функции
Dim strRes
Dim Pos
If strFormat = "Mb" Then
strRes = iSize/1024/1024
Else
If strFormat = "Kb" Then
strRes = iSize/1024
Else
If strFormat = "Gb" Then
strRes = iSize/1024/1024/1024
End IF
End IF
End IF
Pos = Instrd, strRes, ", ")
If Pos > 0 Then
SizeFormat = Left(strRes,Pos-1)
Else
SizeFormat = strRes
End If
End Function
1 Функция для получения имени компьютера
Function GetStationName()
strResult = ""
' Создаем коллекцию экземпляров класса Win32_ComputerSystem
Set Col = objService.ExecQuery _
("SELECT * FROM Win32_ComputerSysteiTr)
' Перебираем элементы коллекции
For Each Obj In Col
1 Формируем строку для записи в базу данных
strResult = Obj.Name
Next
' Возвращаем результат
GetStationName = strResult
End Function
' Функция для получения информации об операционной системе,
1 установленной на компьютере
Function GetOperSysInfо()
strResult = ""
1 Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set Col = objService.ExecQuery _
("SELECT * FROM Win32_OperatingSystem")
1 Перебираем элементы коллекции
For Each Obj In Col
f Формируем строку для записи в базу данных
strResult = strResult & Obj.Caption & ", " &_
WMIDateStr(Obj.InstallDate) & "; "
Next
1 Возвращаем результат
GetOperSysInfo = strResult
End Function
i
1 Функция для получения информации о BIOS
Function GetBiosInfoO
strResult =
1 Создаем коллекцию экземпляров класса Win32_Bios
Set Col = objService.ExecQuery _
("SELECT * FROM Win32_Bios")
1 Перебираем элементы коллекции
For Each Obj In Col
1 Формируем строку для записи в базу данных
strResult = strResult & Obj.Name & ", S/N:" &_
Obj.SerialNumber & "; "
Next
1 Возвращаем результат
GetBiosInfo = strResult
End Function
i
f Функция для получения информации о процессоре
Function GetCpuInfо()
strResult = ""
1 Создаем коллекцию экземпляров класса Win32_Processor
Set Col = objService.ExecQuery _
("SELECT * FROM Win32_Processor")
1 Перебираем элементы коллекции
For Each Obj In Col
1 Формируем строку для записи в базу данных
strResult = strResult & Obj.Name & ", " &_
Obj.MaxClockSpeed & "МГц" & "; "
Next
' Возвращаем результат
GetCpuInfo = strResult
End Function
i
' Функция для получения информации об оперативной памяти
Function GetMemorylnfо()
strResult = ""
' Создаем коллекцию экземпляров класса Win32_PhysicalMemory
Set Col = objService.ExecQuery _
("SELECT * FROM Win32_PhysicalMemoryM)
' Перебираем элементы коллекции
For Each Obj In Col
1 Формируем строку для записи в базу данных
strResult = strResult & Obj.DeviceLocator & " : " &_
SizeFormat(Obj.Capacity,"Mb") & "Мб; "
Next
f Возвращаем результат
GetMemorylnfо = strResult
End Function
i
f Функция для получения информации о жестких дисках
Function GetHDDInfoO
strResult = ""
f Создаем коллекцию экземпляров класса Win32_DiskDrive
Set Col = objService.ExecQuery _
("SELECT * FROM Win32_DiskDrive")
f Перебираем элементы коллекции
For Each Obj In Col
1 Формируем строку для записи в базу данных
strResult = strResult & "Диск " & Obj.Index & ": " & Obj.Model &_
", " & SizeFormat(Obj.Size,"Mb") & "Мб; "
Next
1 Возвращаем результат
GetHDDInfo = strResult
End Function
i
1 Функция для получения информации об устройстве CD-ROM
Function GetCDROMInfо()
strResult = ""
f Создаем коллекцию экземпляров класса Win32_CDROMDrive
Set Col = objService.ExecQuery _
("SELECT * FROM Win32_CDROMDrive")
1 Перебираем элементы коллекции
For Each Obj In Col
1 Формируем строку для записи в базу данных
strResult = strResult & Obj.Name & "; "
Next
1 Возвращаем результат
GetCDROMInfo = strResult
End Function
1 Функция для получения информации о видеокарте компьютера
Function GetVideoInfо()
strResult = ""
1 Создаем коллекцию экземпляров класса Win32_VideoController
Set Col = objService.ExecQuery _
("SELECT * FROM Win32_VideoController")
1 Перебираем элементы коллекции
For Each Obj In Col
1 Формируем строку для записи в базу данных
strResult = strResult & Obj.Name & ", Adapter RAM = " &_
SizeFormat(Obj.AdapterRAM,"Mb") & "Мб, " &_
Obj.CurrentHorizontalResolution & " x " &_
Obj.CurrentVerticalResolution &_
", " & Obj.CurrentRefreshRate & "Гц" & "; "
Next
1 Возвращаем результат
GetVideoInfo = strResult
End Function
I
' Функция для получения информации о звуковой карте компьютера
Function GetSoundlnfо()
strResult = ""
1 Создаем коллекцию экземпляров класса Win32_SoundDevice
Set Col = objService.ExecQuery _
("SELECT * FROM Win32_SoundDevice")
' Перебираем элементы коллекции
For Each Obj In Col
' Формируем строку для записи в базу данных
strResult = strResult & Obj.Name & ", " & Obj.Manufacturer & ";"
Next
f Возвращаем результат
GetSoundlnfо = strResult
End Function
i ,_
1 Функция для получения информации о портах компьютера
Function GetPortsInfо()
strResult = ""
1 Создаем коллекцию экземпляров класса Win32_ParallelPort
Set Col = objService.ExecQuery _
("SELECT * FROM Win32_ParallelPort")
f Перебираем элементы коллекции
For Each Obj In Col
' Формируем строку для записи в базу данных
strResult = strResult & Obj.Name & "; "
Next
' Создаем коллекцию экземпляров класса Win32_SerialPort
Set Col = objService.ExecQuery _
("SELECT * FROM Win32_SerialPort")
1 Перебираем элементы коллекции
For Each Obj In Col
' Формируем строку для записи в базу данных
strResult = strResult & Obj.DevicelD & "; "
Next
1 Возвращаем результат
GetPortsInfo = strResult
End Function
' Функция для получения информации о сетевой карте компьютера
Function GetNetCardlnfо()
f Объявляем локальные переменные функции
Dim colNetworkAdapters
Dim objNetworkAdapter
Dim colPnPDevices
Dim objPnpDevice
Dim colDeviceBuses
Dim objDeviceBus
Dim colNetworkAdapterSettings
Dim objNetworkAdapterSetting
strResult = ""
f Создаем коллекцию экземпляров класса Win32_NetworkAdapter
Set colNetworkAdapters = objService.ExecQuery _
("SELECT * FROM Win32_NetworkAdapter")
f Перебираем элементы коллекции colNetworkAdapters
For Each objNetworkAdapter in colNetworkAdapters
1 Создаем коллекцию экземпляров
Set colPnPDevices = objService.ExecQuery _
("ASSOCIATORS OF {Win32_NetworkAdapter.DeviceID='" &_
objNetworkAdapter.DevicelD & "*} " &_
" WHERE AssocClass=Win32_PnPDevice")
f Перебираем элементы коллекции colPnPDevices
For Each objPnpDevice in colPnPDevices
f Создаем коллекцию экземпляров colDeviceBuses
Set colDeviceBuses = objService.ExecQuery _
("ASSOCIATORS OF {Win32_PnPEntity.DeviceID='" &_
objPnpDevice.DevicelD & "'} " &_
" WHERE AssocClass=Win32_DeviceBus")
1 Перебираем элементы коллекции colDeviceBuses
For Each objDeviceBus in colDeviceBuses
f Формируем строку для записи в базу данных
strResult = strResult & objNetworkAdapter.Name
StrResult = strResult & ", MAC = " &_
obj Ne tworkAdapter.MACAddres s
1 Создаем коллекцию экземпляров
Set colNetworkAdapterSettings = objService.ExecQuery _
("ASSOCIATORS OF {Win32__NetworkAdapter.DeviceID='" &_
objNetworkAdapter.DevicelD &"'}"&_
" WHERE AssocClass = Win32_NetworkAdapterSetting")
f Перебираем элементы коллекции
For Each objNetworkAdapterSetting in colNetworkAdapterSettings
1 Формируем строку для записи в базу данных
strResult = strResult & ", IP = " & _
objNetworkAdapterSetting.IPAddress(0)
Next
Next
Next
Next
1 Возвращаем результат
GetNetCardlnfo = strResult
End Function
f Функция для получения информации о клавиатуре компьютера
Function GetKeyboard()
strResult = ""
1 Создаем коллекцию экземпляров класса Win32„Keyboard
Set Col = objService.ExecQuery _
("SELECT * FROM Win32_Keyboard")
1 Перебираем элементы коллекции
For Each Obj In Col
f Формируем строку для записи в базу данных
strResult = strResult & Obj.Name & "; "
Next
f Возвращаем результат
GetKeyboard = strResult
End Function
f Функция для получения информации о мыши
Function GetMouselnfо()
strResult = ""
1 Создаем коллекцию экземпляров класса Win32_PointingDevice
Set Col = objService.ExecQuery _
("SELECT * FROM Win32_PointingDevice")
' Перебираем элементы коллекции
For Each Obj In Col
' Формируем строку для записи в базу данных
strResult = strResult & Obj.HardwareType & "; "
Next
1 Возвращаем результат
GetMouselnfo = strResult
End Function
</SCRIPT>
</HEAD>
<BODY BGCOLOR="si1ver">
<FIELDSET>
<LEGEND>CnncoK KOMnbiOTepoB</LEGEND>
<INPUT ID=,,FromFile,, TYPE=radio NAME="rbComputerList" VALUE="File">
<LABEL FOR="FromFile">OaPLn Computerlist.txt</LABEL><BR>
<INPUT ID="FromDomain" TYPE=radio NAME="rbComputerList" ^
VALUE="Domain">
<LABEL' FOR="FromDomain">floMeH Domainl</LABELXBR>
</FIELDSET><BR>
<INPUT TYPE="button" УАШЕ="Начать инвентаризацию" NAME="btnStart" ^
onClick="Start()">
<BR><BR>
<SPAN ID="Status">
Процесс не запущен
</SPAN>
</BODY>
</HTML>
Заключение
Не будет большим преувеличением сказать, что в настоящее время многие
администраторы Windows имеют недостаточное представление о
возможностях и особенностях технологии WMI, незаслуженно считая ее слишком
сложной для понимания и тем более для использования в практической
работе.
В данной книге мы постарались показать, что это далеко не так, и в WMI
каждый, в зависимости от своей квалификации и решаемых задач, может
найти что-то полезное для себя. Например, с помощью утилиты WMI Object
Browser любой начинающий администратор операционной системы может
получить наглядную иерархическую информацию о составных частях
компьютера, совершенно не задумываясь при этом об устройстве репозитория
CIM или синтаксисе WQL-запросов. Также никаких проблем не должно
возникнуть при освоении командного языка WMIC, в котором вместо
длинных и сложных названий классов WMI применяются простые
запоминающиеся псевдонимы, а возможности запуска команды сразу на нескольких
компьютерах и сохранения результатов ее работы в различных
настраиваемых форматах зачастую делают WM1C самым удобным и простым
инструментом администрирования.
Администраторам, которые смогут разобраться со структурой классов WMI
и которых не пугает написание сценариев, наверняка придутся по душе
идеи использовать возможности WMI, связанные с выполнением обычных и
ассоциативных WQL-запросов или созданием временных и постоянных
потребителей событий, происходящих в компьютерной системе.
Итак, в заключение нам остается лишь еще раз порекомендовать всем
администраторам Windows обратить особое внимание на WMI, т. к., освоив
эту технологию, вы получите чрезвычайно мощный, гибкий и при этом
входящий в состав операционной системы (а потому абсолютно бесплатный)
инструмент для централизованного управления компьютерной системой!
Приложение 1
Справочник
по языку запросов WQL
Язык WMI Query Language (WQL) является, с небольшими семантическими
изменениями, подмножеством стандартного языка American National
Standards Institute Structured Query Language (ANSI SQL). В табл. П1.1
приведено краткое описание ключевых слов и операторов, которые
используются в WQL.
Таблица П1.1. Ключевые слова языка WQL
Ключевое слово
или оператор WQL
Описание
AND
ASSOCIATORS OF
CLASS
FROM
GROUP
HAVING
IS
ISA
Логический оператор И
Выделяет все объекты-экземпляры различных
неассоциативных классов, которые связаны посредством
ассоциативных классов с исходным экземпляром
Указывает на класс, экземпляром которого является объект
в запросе. Это ключевое свойство доступно в WQL, начиная
с Windows 2000
Определяет класс WMI, который содержит свойства,
перечисленные в операторе select. В WQL-запросе
одновременно можно запрашивать данные только из одного класса
Указывает подсистеме WMI на то, что сообщение о
наступлении события необходимо генерировать только после того,
как это событие наступит несколько раз. Используется в
запросах для подписки на события WMI
Выделяет события, которые получены в течение временного
интервала, указанного в ключевом слове within
Оператор сравнения, используемый вместе с ключевыми
словами not и null следующим образом: is [not] null
Оператор, который применяет запрос к подклассам
указанного класса
Таблица П1.1 (окончание)
Ключевое слово
или оператор WQL
Описание
LIKE
NOT
NULL
OR
REFERENCES OF
SELECT
TRUE
WHERE
WITHIN
FALSE
Оператор, который определяет, соответствует ли указанная
строка заданному шаблону
Логический оператор отрицания
Указывает на то, что объект не инициализирован
Логический оператор ИЛИ
Выделяет все экземпляры ассоциативных классов, в
которых имеется ссылка на исходный объект
Задает свойства объекта или класса, которые участвуют
в запросе
Логическая константа Истина
Задает диапазон в запросах
Задает временной интервал в запросах для подписки на
события WMI
Логическая константа Ложь
В языке WQL поддерживаются три типа запросов.
□ Запросы к данным (Data Queries), результатом выполнения которых
является множество экземпляров какого-либо класса WMI (обычного или
ассоциативного).
□ Запросы к событиям (Event Queries), которые применяются для подписки
на извещения о событиях WMI.
□ Запросы к схеме (Schema Queries), с помощью которых можно получать
информацию о классах (обычных или ассоциативных).
На практике администратору Windows вряд ли понадобятся запросы к схеме,
поэтому мы кратко рассмотрим основные операторы и ключевые слова
WQL из табл. П1.1, которые применяются в запросах первых двух типов.
С
Замечание
j
Более полную информацию об операторах и ключевых словах языка WQL
можно получить в электронной библиотеке MSDN (Microsoft Developer Network)
(см. Ссылки на ресурсы Internet).
Запросы к данным
Запросы к данным в WQL могут осуществляться либо путем
непосредственного обращения к экземплярам заданного класса (оператор select), либо
с помощью ассоциативных связей между классами (операторы associators
OF И REFERENCES OF).
Оператор SELECT
Напомним, что в стандартном языке SQL оператор select применяется для
извлечения определенных столбцов из таблиц. В WQL оператор select
служит для извлечения нужных свойств из экземпляров одного заданного
класса WMI.
Например, следующий оператор возвратит все экземпляры класса
win32_Process (символ * выделяет все свойства объектов):
SELECT * FROM Win32_Process
Список нужных свойств в возвращаемых экземплярах указывается сразу
после ключевого слова select:
SELECT Handle,Name FROM Win32_Process WHERE Name = "NOTEPAD.EXE"
Данный оператор возвратит значения свойств Handle и Name для всех
экземпляров класса win32_Process, в свойстве Name у которых записана строка
NOTEPAD.EXE.
Оператор ASSOCIATORS OF
Оператор associators of можно использовать в краткой форме:
ASSOCIATORS OF {ObjectPath}
или с дополнительными параметрами, которые указываются после where:
ASSOCIATORS OF {ObjectPath} WHERE
AssocClass=AssocClassName
ClassDefsOnly
RequiredAssocQualif ier-QualifierName
Requi redQua1i f i er=QualifierName
ResultClass=ClassName
ResultRole=Proper tyName
Ro 1 e=Proper tyName
В обоих случаях выражение ObjectPath должно задавать путь к
существующему объекту WMI. Значение ключевых слов оператора associators of
приведено в табл. П1.2.
Таблица П1.2. Ключевые слова в операторе associators of
Ключевое слово
Описание
AssocClass=AssocClassName
ClassDefsOnly
RequiredAssocQualifier=
QualifierName
RequiredQualifier=
QualifierName
ResultClass = Class2\Tajne
ResultRole=PropertyName
Ro 1 e=Proper tyName
Указывает на то, что возвращаемые объекты
должны быть связаны с исходным
посредством ассоциативного класса AssocClassName
Задает режим выполнения запроса, при
котором возвращаются не сами объекты, а
описание их классов
Указывает на то, что возвращаемые объекты
должны быть связаны с исходным
посредством ассоциативного класса, имеющего ква-
лификатор Qualifi erName
Указывает на то, что возвращаемые объекты
должны иметь квалификатор QualifierName
Указывает на то, что возвращаемые объекты
должны быть либо экземплярами класса
ClassName, либо экземплярами класса,
являющегося потомком класса ClassName
Указывает на то, что возвращаемые объекты
должны играть определенную роль в
соответствующем ассоциативном классе, т. е. ссылка
на возвращаемые объекты в ассоциативном
классе хранится в свойстве Proper tyName
Указывает на то, что связь с возвращаемыми
объектами устанавливается посредством тех
ассоциативных классов, в которых ссылка
на исходный объект хранится в свойстве
Proper tyName
Приведем несколько примеров. Следующий запрос вернет коллекцию
объектов, каждый из которых находится в ассоциативной связи с экземпляром
класса win32_Process, у которого ключевое свойство Handle равно Ю8о:
ASSOCIATORS OF {Win32_Process.Handle=1080}
Следующие два запроса выполняют одинаковые действия — формируют
коллекцию экземпляров класса, которые связаны с тем же объектом
win32_Process. В первом случае выбор идет по ассоциативному классу:
ASSOCIATORS OF {Win32_Process.Handle=1080} WHERE
AssocClass=CIM_ProcessExecutable
А во втором — по имени класса возвращаемых экземпляров:
ASSOCIATORS OF {Win32_Process.Handle=1080} WHERE
ResultClass=CIM_DataFile
Оператор REFERENCES OF
Оператор references of, как и associators of, можно использовать
в краткой форме:
REFERENCES OF {ObjectPath)
или с дополнительными параметрами, которые указываются после where:
REFERENCES OF {ObjectPath} WHERE
ClassDefsOnly
RequiredQuali f ier=QualifierName
ResultClass=ClassName
Ro 1 e=Proper tyName
Выражение ObjectPath здесь должно задавать путь к существующему объекту
WM1. Значение ключевых слов оператора references of приведено в табл. П1.3.
Таблица П1.3. Ключевые слова в операторе references of
Ключевое слово Описание
ClassDefsOnly Задает режим выполнения запроса, при
котором возвращаются описания
соответствующих ассоциативных классов, а не
их экземпляры
RequiredQualif ier=QualifierName Указывает на то, что в возвращаемых
ассоциативных объектах должен быть
определен квалификатор QualifierName
Указывает на то, что возвращаемые
объекты должны быть либо экземплярами
ассоциативного класса ClassName, либо
экземплярами класса, являющегося
потомком класса ClassName
Указывает на то, что в возвращаемых
ассоциативных объектах ссылка на
исходный объект должна храниться в свойстве
Proper tyName
Например, следующий запрос вернет все экземпляры ассоциативных
классов, в которых имеется ссылка на объект win32_Process, и у которого
ключевое СВОЙСТВО Handle paBHO 1080!
REFERENCES OF {Win32_Process.Handle=1080}
Если же для этого процесса требуется, скажем, получить только связанные
С НИМ Экземпляры асСОЦИатИВНОГО Класса CIM_ProcessExecutable (В ЭТИХ
объектах хранятся ссылки на связанные с процессом экземпляры класса
ciM_DataFiie), то нужно выполнить такой запрос:
REFERENCES OF {Win32_Process.Handle=1080} WHERE
ResultClass=CIM_ProcessExecutable
ResultClass-ClassName
Role=PropertyName
Запросы к событиям WMI
Синтаксис запросов, которые используются для подписки на извещения
о событиях WMI, зависит от типа этих событий (внешние или внутренние)
и от того, нужно ли формировать извещения для каждого отдельного
события или сразу для нескольких.
Подписка на внешние события
Чтобы подписаться на внешнее событие, достаточно выполнить оператор
select для класса, который определен для этого события в
соответствующем провайдере. Например, следующий запрос выполняет подписку на
внешнее событие, которое произойдет при изменении ключа softwarex
Example key в ветви hkey_local_machine системного реестра:
SELECT * FROM RegistryValueChangeEvent WHERE
Hive="HKEY_LOCAL_MACHINE" AND
KeyPath='SOFTWARE\\Example key AND ValueName="Example String Value"
Подписка на одиночные внутренние события.
Ключевые слова WITHIN и ISA
Чаще всего подписка на извещение о внутреннем событии WMI
производится запросом следующего вида:
SELECT * FROM IntrinsicEventClass WITHIN Interval WHERE
Targetlnstance ISA "InstanceName" AND
TargetInstance.PropertyName=Value
Например, после выполнения следующего запроса подсистема WMI будет
каждые 10 секунд (временной интервал указывается в ключевом слове
within) проверять, не был ли создан новый экземпляр класса
win32_Process (событию создания нового экземпляра соответствует класс
instanceCreationEvent, а имя целевого класса указано в ключевом слове
isa), у которого в свойстве Name хранится строка notepad.exe:
SELECT * FROM InstanceCreationEvent WITHIN 10 WHERE
Targetlnstance ISA "Win32_Process" AND
TargetInstance.Name="NOTEPAD.EXE"
Если теперь в течение очередных 10 секунд будут созданы экземпляры
класса win32_Process (в системе запустятся новые процессы), то
потребителю событий будут доставлены извещения о создании каждого такого
экземпляра.
Подписка на групповые события.
Ключевые слова GROUP и HAVING
Язык WQL позволяет с помощью запроса подписаться на извещения о
событиях WMI таким образом, что потребителю событий будет поступать одно
извещение о наступлении сразу нескольких одинаковых событий. Для этого
в запросе обязательно указываются ключевые слова group и within, а также
могут указываться слова by и having. Например, следующий запрос
выполняет подписку на извещение о событии, которое произойдет, если в течение
600 секунд будет зарегистрировано более 25 событий (количество событий
задается в ключевом слове having с помощью параметра NumberofEvents),
СВЯЗаННЫХ С созданием НОВОГО Экземпляра класса Win32_NTLogEvent (ИМЯ
класса определяется в ключевом слове isa) с одним и тем же значением
свойства SourceName (свойства экземпляров, по значениям которых идет
подсчет одинаковых событий, указываются в ключевом слове by):
SELECT * FROM InstanceCreationEvent WHERE
Targetlnstance ISA •,Win32_NTLogEvent" GROUP WITHIN 600 BY
Targetlnstance.SourceName HAVING NumberOfEvents > 25
Приложение 2
Работа
с ODBC-адаптером WMI
Еще одним способом доступа к подсистеме WMI без написания программ
или сценариев является использование разработанного Microsoft
специального ODBC-адаптера WMI. Этот адаптер позволяет с помощью Microsoft
Access обращаться к данным в репозитории С1М так, как если бы они были
записаны в базе данных — с помощью стандартных средств Access можно
делать различные выборки, строить графики, диаграммы и т. д.
Отметим, что ODBC-адаптер WMI поддерживает только оператор select
языка SQL для просмотра информации в репозитории CIM (изменить
данные в CIM с помощью этого адаптера нельзя).
Установка ODBC-адаптера WMI.
Регистрация источника данных WMI
Начиная с Windows 2000, ODBC-адаптер WMI поставляется в составе
дистрибутива операционной системы, однако автоматически по умолчанию он
не устанавливается. Для регистрации в системе ODBC-адаптера WMI нужно
запустить программу установки wbemodbc.msi в каталоге \Valueadd\Msft\
Mgmt\WbemODBC дистрибутива.
В результате инсталляции в Windows регистрируется системный источник
данных (System DSN) с именем WBEM Source (рис. П2.1), который
доступен для всех пользователей и служб на компьютере.
Мы зарегистрируем еще один источник данных WMI, который будет
доступен только для пользователя, его создавшего. Для этого загрузим
Панель управления (Control Panel) Windows (меню Пуск (Start)) и, в случае
Windows XP, переключимся к классическому виду (рис. П2.2).
Последовательно выберем пункты Администрирование (Administrative tools) и
Источники данных (ODBC) (Data sources (ODBC)). В появившемся
диалоговом окне выберем вкладку Пользовательский DSN (User DSN) (рис. П2.3).
Нажмем кнопку Добавить (Add) и в появившемся окне выберем драйвер
WBEM ODBC Driver (рис. П2.4).
Рис. П2.1. Системный источник данных WBEM Source
Рис. П2.2. Классический вид панели управления Windows XP
Рис. П2.3. Администратор источников данных ODBC в Windows XP
Рис. П2.4. Список драйверов ODBC
Рис. П2.5. Название создаваемого источника данных WMI
После нажатия кнопки Готово (Done) появится новое окно, где нужно
написать имя создаваемого источника данных (в нашем случае это WMI)
(рис. П2.5).
Для завершения настройки DSN нажмем кнопку ОК.
Использование источника данных WMI
в Microsoft Access
Для того чтобы установить связь с источником данных WMI, мы в
программе Microsoft Access создадим новую базу данных wmi.mdb и выполним
соединение с подсистемой WMI. Для этого в меню Файл (File) следует
выбрать пункт Внешние данные | Связь с таблицами (Get External Data | Link
Tables) (рис. П2.6).
Рис. П2.6. Связь с внешними данными в Microsoft Access
Затем в выпадающем списке Тип файлов (Files) диалогового окна Связь
(Link) нужно выбрать пункт ODBC Databases(), в результате чего откроется
диалоговое окно Выбор источника данных (Select Data Source Tables). Заре-
гистрированный нами ранее ODBC-источник данных с именем WMI
находится в списке на вкладке Источник данных компьютера (Machine Data
Source) (рис. П2.7).
Рис. П2.7. Список системных и пользовательских источников данных
После выбора источника данных WMI из этого списка, на экран выводится
диалоговое окно Configure Connection, в котором можно ввести
информацию о параметрах соединения с подсистемой WMI на удаленном
компьютере (имя сервера, имя пользователя, пароль и т. д.) (рис. П2.8).
Мы будем работать с WMI на локальном компьютере, поэтому оставим все
поля в окне Configure Connection пустыми и нажмем кнопку Connect, после
чего в нижней части окна откроется иерархический список пространств
имен WMI. В этом списке мы выберем пространство имен Root\ciMV2
(рис. П2.9).
После нажатия кнопки ОК на экран выводится диалоговое окно Связь
с таблицами (Link) со списком классов из выбранного пространства имен
WMI (рис. П2.10).
Выберем в этом списке класс win32_Process и нажмем кнопку ОК. На
экран будет выведено диалоговое окно Выбор однозначного индекса (Select
Unique Record Identifier), где можно указать, какие поля (свойства объекта
WMI) будут однозначно идентифицировать запись (экземпляр класса WMI)
в таблице (коллекции экземпляров класса) (рис. П2.11).
Рис. П2.8. Диалоговое окно Configure Connection
Рис. П2.9. Выбор пространства имен WMI в диалоговом окне Configure Connection
Рис. П2.10. Выбор классов WMI для отображения их экземпляров в табличном виде
Рис. П2.11. Выбор полей, однозначно идентифицирующих запись в таблице
Рис. П2.12. Таблица win32_Process в базе данных Microsoft Access
После выхода из данного диалогового окна в базу данных будет добавлена
таблица win32_Process (рис. П2.12).
Открыв теперь таблицу win32_Process для просмотра, мы получим
информацию о всех процессах, запущенных в операционной системе (рис. П2.13).
Рис. П2.13. Список всех запущенных процессов в таблице Win32_Process
Отметим, что установленная связь с внешней таблицей win32_Process будет
динамической, т. е. при каждом обращении из запроса или формы Access
к этой таблице, ее записи будут формироваться заново.
Приложение 3
Средства разработки
и отладки сценариев WSH
В принципе, можно создавать сценарии в Блокноте Windows или в
текстовых редакторах файловых оболочек типа Windows Commander или Far
Manager, а отлаживать их с помощью вывода значений переменных на экран
(метод Echo объекта wscript) в нужных местах сценария. Однако при
разработке больших сложных сценариев намного удобнее работать со
специализированными редакторами и отладчиками.
Создание и редактирование сценариев
Одним из наиболее мощных и удобных редакторов сценариев для Windows
является Primalscript, который разработан компанией SAPIEN Technologies
Inc. Последней на момент написания книги являлась версия Primalscript 2.2,
ознакомительный 40-дневный вариант которой может быть получен с сайта
SAPIEN (http://www.sapien.com).
Редактор Primalscript
Редактор Primalscript поддерживает среду разработки для практически всех
распространенных языков сценариев: JScript, VBScript, Perl, Python, Rexx,
TCL, WinBatch, LotusScript и т. д. Кроме этого, в Primalscript 2.2 полностью
реализована поддержка сценариев Windows Script Host 5.6 (WS-файлы с
разметкой XML).
Далее будут описаны основные операции, которые позволяет выполнить
Primalscript при работе со сценариями.
Создание нового одиночного сценария
Для того чтобы создать новый одиночный сценарий (например, на языке
JScript или VBScript), нужно выбрать пункт меню File | New, после чего на
экран будет выведено диалоговое окно New, на вкладке Files которого
представлен список поддерживаемых типов сценариев (рис. П3.1).
Рис. П3.1. Создание нового сценария — список типов файлов,
поддерживаемых Primalscript
Рис. П3.2. Заготовка нового сценария на языке JScript
Указав в этом списке нужный тип (например, JScript) и нажав кнопку ОК,
мы получим в окне редактирования заготовку сценария с заполненным
заголовком (рис. П3.2).
Рис. ПЗ.З. Открытие существующего сценария
Рис. П3.4. JScript-сценарий в режиме редактирования
Открытие существующего одиночного сценария
Открыть уже существующий сценарий можно с помощью пункта меню File |
Open. Диалоговое окно открытия файлов позволяет запретить изменения
выбранного файла (режим Только чтение), а также отобразить этот файл,
выбрав соответствующий пункт раскрывающегося списка Open as, в
текстовом (Text) или шестнадцатеричном (Binary) виде (рис. ПЗ.З).
Выбранный файл будет отображен в окне редактирования, при этом
различные элементы сценария выделяются цветом (рис. П3.4).
Запуск одиночного сценария
Запуск одиночного сценария, который открыт в активном окне
редактирования, производится с помощью пункта Run Script меню Script. При этом
сценарий может запускаться как с помощью cscript.exe (устанавливается по
умолчанию), так и с помощью wscript.exe, а выводимая сценарием
информация может перенаправляться в специальное окно Output редактора.
Нужный режим запуска сценария того или иного типа задается на вкладке
Languages диалогового окна Options (пункт меню Tools | Options). Например,
на рис. П3.5 приведены настройки, позволяющие запускать JScript-
сценарии в графическом режиме без перенаправления вывода в окно Output.
Рис. П3.5. Настройка режима запуска JScript-сценариев
Подписывание сценариев
Для того чтобы подписать сценарий в Primalscript, нужно сначала выбрать
нужный цифровой сертификат. Имя этого сертификата (Certificate) и, в
случае необходимости, хранилище (Store), в котором он находится,
указываются на вкладке WSH диалогового окна Options (пункт меню Tools | Options)
(рис. П3.6). После этого подписывание открытого сценария производится
с помощью пункта Sign Script меню Script.
( Замечание J
Более подробно процедура добавления к сценарию цифровой подписи описана в [2]
Рис. П3.6. Настройки параметров WS-файлов
Возможности пользовательского интерфейса
В окне редактирования можно отображать номера строк в колонке слева от
текста сценария. За включение/выключение этого режима отвечает
переключатель View Line Numbers в меню View. Для перехода к строке с
заданным номером нужно нажать клавиши <Ctii>+<L> или выбрать пункт Jump
to line в меню View.
В любое место сценария можно вставить закладку (Bookmark) с помощью
нажатия клавиш <Ctrl>+<F2> или выбора пункта Toggle Breakpoint меню
View. После этого можно перемещаться между закладками путем нажатия
клавиш <F2> (переход к следующей закладке, пункт меню View | Next
Bookmark) или <Shift>+<F2> (переход к предыдущей закладке, пункт меню
View | Previous Bookmark).
Различные элементы сценария (ключевые слова, функции, объекты и т. д.)
выделяются в окне редактирования разным цветом. Цветовые схемы
выделения для поддерживаемых типов сценариев настраиваются на вкладке
Colors диалогового окна Options (пункт меню Tools | Options) (рис. П3.7).
Рис. П3.7. Настройка цветового выделения элементов сценариев различных типов
Для увеличения скорости написания кода сценария можно вставлять в текст
шаблоны конструкций определенного языка (например, switch ... case
в JScnpt или For ... то ... step в VBScript). Для этого в окне Nexus нужно
выбрать панель Snippets Nexus (рис. П3.8).
Затем в этой панели следует раскрыть папку, соответствующую нужному
языку, и выбрать требуемую конструкцию (рис. П3.9).
Пожалуй, самое полезное свойство редактора Primalscript заключается
в возможности автоматического завершения вводимых выражений (эта
функция имеется практически во всех современных средах разработки типа
Microsoft Visual Basic for Applications или Borland Delphi). Например, после
ввода имени объекта автоматически появляется список всех свойств и
методов этого объекта (рис. П3.10).
При выборе из этого списка какого-либо метода на экране появляется
подсказка о параметрах данного метода (рис. П3.11).
Рис. П3.8. Панель Snippets Nexus окна Nexus
Рис. П3.9. Результат вставки шаблона конструкции Select ... Case языка VBScript
Рис. П3.10. Автозавершение ввода — список всех свойств и методов объекта
Рис. П3.11. Автозавершение ввода — список параметров введенного метода
663
Рис. П3.12. Список всех свойств и методов объекта FileSystemObject
Рис. П3.13. Параметры метода GetDrive ()
Можно также вывести список свойств и методов для тех объектов, которые
были созданы в сценарии ранее. Для этого нужно выделить в тексте имя
данного объекта и выбрать пункт List Members меню Edit (рис. П3.12).
Для получения списка параметров введенной ранее функции (метода
объекта) нужно выделить в тексте название этой функции (метода) и выбрать
пункт Parameter Info меню Edit (рис. П3.13).
Другие редакторы
Приведем еще несколько редакторов, которые могут использоваться для
создания и изменения сценариев WSH.
Script Editor — программа, входящая в состав Microsoft Office 2000/XP. В ней
имеется функция выделения цветом элементов JScript-, VBScript- и WS-
сценариев, а также поддерживается автоматическое завершение ввода
ключевых слов.
Aditor — условно бесплатный редактор файлов текстового формата, который
позволяет запускать изменяемые сценарии, не выходя из режима
редактирования, а также поддерживает выделение цветом ключевых слов языков
JScript и VBScript. Aditor можно загрузить с http://aditor.swrus.com/.
UltraEdit-32 — условно бесплатный редактор текстовых файлов,
обладающий, в целом, теми же возможностями, что и Aditor. Может быть загружен
с http://www.ultraedit.com/.
Отладка сценариев
в Microsoft Script Debugger
Если при выполнении сценариев возникают ошибки или получаются
непредвиденные результаты, можно воспользоваться специальным отладчиком
для трассировки сценария и проверки значений переменных. Мы в качестве
такого отладчика рассмотрим программу Microsoft Script Debugger, версии
которой для различных операционных систем можно бесплатно получить
с сайта Microsoft (http://msdn.microsoft.com/scripting). Этот отладчик
позволяет работать со сценариями, которые встроены в HTML- или ASP-файлы,
а также со сценариями Windows Script Host.
Активизация отладчика
Активизировать отладчик при работе со сценариями можно несколькими
способами.
Во-первых, внутри JScript- или VBScript-сценариев можно вставить
специальные операторы (debugger для JScript и stop для VBScript) и выполнить
сценарий с параметром //d. Для примера рассмотрим сценарий ForDebug.js,
содержимое которого приведено в листинге П3.1.
Листинг П3.1. JScript-сценарий для отладки в Microsoft Script Debugger
/•••••••••••••••••••••••••••••••••••••••••••••••
/* Имя: ForDebug.js */
/* Язык: JScript */
/* Описание: Сценарий для отладки в Microsoft Script Debugger */
у************************************
var s;
function MyFunc() {
WScript.Echo("Функция MyFunc()");
}
WScript.Echo("Это сообщение выведется до запуска отладчика");
debugger;
s="A это сообщение появится ";
3+="уже в отладчике";
WScript.Echo(s);
MyFunc();
у************* Конец *********************************************/
Запустим этот сценарий из командной строки следующим образом:
wscript.exe //D ForDebug.js
Тогда сначала нам будет выведено диалоговое окно со строкой Это сообщение
выведется до запуска отладчика, а после нажатия в данном окне кнопки ОК
запустится отладчик, и управление передастся ему (рис. П3.14). Далее
выполнение сценария может производиться в отладчике (см. раздел "Команды
отладчика"данного приложения).
( Замечание j
Файл со сценарием в отладчике доступен только для чтения.
Второй путь активизации отладчика состоит в использовании параметра //х
при выполнении сценария:
wscript.exe //X ForDebug.js
При этом отладчик запускается сразу, с первой строки сценария
(рис. П3.15).
Рис. П3.14. Активизация отладчика с помощью параметра //D
и специальных операторов
Рис. П3.15. Активизация отладчика с помощью параметра //X
Команды отладчика
Команды, имеющиеся в Microsoft Script Debugger, позволяют выполнять
трассировку сценариев, просматривать список вызванных процедур или
функций, анализировать и изменять значения переменных.
Установка и удаление точек прерывания
Для того чтобы установить точку прерывания в определенной строке
сценария, нужно поместить курсор в эту строку и нажать клавишу <F9> или
выбрать пункт меню Debug | Toggle Breakpoint. Строки с точками прерывания
будут отмечены красными точками около левой границы окна отладчика.
При достижении точки прерывания отладчик останавливает исполнение
сценария.
Для удаления одной точки прерывания необходимо поместить курсор
в нужную строку и вновь нажать клавишу <F9> или выбрать пункт меню
Debug | Toggle Breakpoint. Если нужно убрать все точки прерывания, то
можно воспользоваться командой меню Debug | Clear All Breakpoints.
Выполнение сценария
Открытый в отладчике сценарий может выполняться в разных режимах
с помощью соответствующих команд меню Debug.
С помощью команды Debug | Run (или нажатия клавиши <F5>) можно
выполнить все операторы сценария до первой точки прерывания.
Для того чтобы выполнить только один оператор (режим пошагового
выполнения), нужно выбрать команду Debug | Step Into или нажать клавишу
<F8>. Следующий исполняемый оператор при этом будет помечен стрелкой
около левой границы окна отладчика.
Если в режиме пошагового выполнения в сценарии встречается вызов
определенной пользователем процедуры/функции, то возможны два варианта.
Продолжая выполнять команду Debug | Step Into, мы будем останавливаться
на каждом операторе внутри процедуры/функции. Для того чтобы, находясь
внутри процедуры/функции, не проходить оставшиеся операторы по
отдельности, можно выполнить команду Debug | Step Out (или нажать
клавиши <Ctrl>+<Shift>+<F8>). После этого управление передастся оператору,
который стоит в сценарии первым после вызова этой процедуры/функции.
Если нет необходимости проверять внутреннюю работу процедуры/функции
пользователя, то нужно выбрать команду Debug | Step Over или нажать
комбинацию клавиш <Shift>+<F8>. При этом данная процедура/функция
выполнится без остановок, а исполнение сценария остановится на следующем
после нее операторе.
Команда Debug | Stop Debugging прерывает исполнение сценария и
завершает процесс отладки.
Просмотр стека вызовов
В отладчике можно вывести окно Call Stack со списком всех активных
процедур и функций сценария. Для этого нужно выполнить команду View | Call
Stack. Например, если вызвать это окно, находясь внутри функции MyFuncO
в сценарии ForDebug.js, то в списке мы увидим название функции MyFuncO
(рис. П3.16).
Рис. П3.16. Окно Call Stack
Просмотр и изменение значений переменных
Получать и изменять текущие значения переменных или свойств объектов
во время остановки исполнения сценария позволяет окно Command,
которое вызывается командой View | Command Window. При этом анализ
переменных в JScript- и VBScript-сценариях производится следующим образом.
Для просмотра значения переменной в JScnpt-сценарии нужно в окне
Command набрать имя этой переменной и нажать клавишу <Enter>.
Например, для того чтобы увидеть значение переменной s в сценарии ForDebug.js,
мы в окне Command вводим s и нажимаем <Enter> (рис. П3.17).
Чтобы вывести значение переменной в VBScript-сценарии, нужно в окне
Command ввести имя этой переменной и поставить перед ним знак ?. Например:
? S
Рис. П3.17. Просмотр значений переменных в специальном окне
Для изменения значения переменной нужно просто присвоить новое
значение этой переменной в окне Command (это относится и к JScript- и
к VBScript-сценариям). Например:
s="HoBoe значение переменной s"
Приложение 4
Справочник по языкам
VBScript и JScript
В данном приложении кратко описаны два стандартных языка
программирования, которые чаще всего применяются для написания сценариев
в Windows: Microsoft JScript и Microsoft VBScript.
Язык JScript
Язык JScript — это интерпретируемый объектно-ориентированный язык
сценариев, разработанный Microsoft, который первоначально
предназначался для создания динамических HTML-страниц. Отметим, что JScript не
является урезанной версией какого-либо другого языка программирования,
хотя по синтаксису он похож на языки Java и С. В этом разделе мы кратко
рассмотрим те возможности и свойства JScript, которые могут потребоваться
при составлении сценариев, выполняемых с помощью WSH, не затрагивая
при этом вопросы, связанные с составлением сценариев для HTML-страниц.
Строки кода и комментарии
В конце каждого оператора JScript нужно ставить точку с запятой, например:
var theSum = 0, i;
sum[0] = 0;
При этом один оператор может располагаться на нескольких строках:
var
theSum = 0,
i;
sum[0] = 0;
Комментарии в JScript могут быть двух видов. Для комментария, который
занимает не более одной строки, можно использовать символы //. Например:
//Этот комментарий занимает всю строку
theSuin=l; //А этот часть строки
Если же в текст сценария необходимо внести комментарий, расположенный
на нескольких строках, то текст такого комментария нужно помещать
внутри блока /* ... */. Например:
/* Это комментарий
на нескольких
строках */
Переменные
В сценариях JScript, как и в любом другом языке программирования, можно
использовать переменные, обращаясь к ним по имени. При этом
переменные могут быть как глобальными (доступными из любого места сценария),
так и локальными (область действия ограничивается функцией, в которой
они определены).
Хорошим тоном считается предварительное объявление используемых
переменных с помощью ключевого слова var, хотя это является обязательным
условием только для локальных переменных, определенных в функциях.
Пример объявления переменной имеет вид:
var MyVariable;
При объявлении тип переменной явным образом не указывается (как это
делается, например, в языках С или Pascal). Определенный тип переменной
присваивается только тогда, когда в нее записывается какое-либо значение.
Язык JScript является регистрозависимым, то есть имена Myvariable и
myvariable представляют разные переменные. Кроме этого, при выборе
имен переменных следует придерживаться следующих правил:
□ имя переменной должно начинаться с буквы или с символов "_", "$" и
может состоять только из букв, цифр, а также символов "_", "$";
□ имя переменной не должно совпадать с зарезервированными ключевыми
словами языка JScript (табл. П4.1).
Таблица П4.1. Зарезервированные ключевые слова JScript
Break
Case
Catch
Class
Const
Continue
Debugger
default
delete
do
else
enum
export
extends
false
finally
for
function
if
import
in
new
null
return
super
switch
this
throw
true
try
typeof
var
void
while
with
Значения переменным в JScript назначаются с помощью оператора
присваивания "=". Например:
var MyVariable;
MyVariable = "Привет!";
Здесь мы объявили переменную MyVariable и записали в нее текстовую
строку. Однако далее в любом месте сценария мы можем присвоить
переменной MyVariable числовое значение (при этом тип переменной
изменится), например:
MyVariable = 10;
Кроме этого, переменной можно присвоить специальное значение null:
MyVariable = null;
В этом случае переменной MyVariable не назначается никакого
определенного типа (пустой тип). Такое присвоение применяется в тех случаях, когда
необходимо объявить переменную и проинициализировать ее, не
присваивая этой переменной никакого определенного типа и значения.
Типы данных
В JScript поддерживаются шесть типов данных, главными из которых
являются числа, строки, объекты и логические данные. Оставшиеся два типа —
это null (пустой тип) и undefined (неопределенный тип).
Числа
В сценариях JScript числа могут использоваться в различных форматах:
□ целые числа (по основанию 8, 10 или 16);
П числа с плавающей десятичной точкой;
□ числа в научной нотации.
Также имеются несколько специальных числовых значений:
П NaN (Not a Number) — так называемое "нечисло", которое не
соответствует никакому числу (это значение генерируется в тех случаях, когда
результат выполнения операции над числами не может быть представлен
в виде числа);
□ положительная бесконечность;
□ отрицательная бесконечность;
□ положительный 0;
П отрицательный 0.
Текстовые строки
Текстовые строки — это последовательность символов, заключенных в
одинарные или двойные кавычки, например:
"Привет!"
'Большой привет!'
'И тогда он крикнул:"Берегись'"'
Строка может иметь нулевую длину (пустая строка):
MyVariable = "";
В JScript можно также использовать специальные комбинации символов,
с помощью которых в строки включаются некоторые неотображаемые
символы или символы, имеющие специальное значение. Каждая из этих
комбинаций (Escape-последовательностей) начинается с символа обратной
косой черты "\" (табл. П4.2).
Таблица П4.2. Специальные комбинации символов
Escape-
последовательность
\ь
\f
\п
\г
\t
V
\"
\\
Описание
Backspace (забой)
Перевод формата
Перевод строки
Возврат каретки
Горизонтальная табуляция (<Ctrl>+<l>;
Одиночная кавычка
Двойная кавычка
Обратная косая черта
Объекты
В JScript под объектом понимается совокупность свойств и методов.
Метод — это внутренняя функция объекта, свойство — это одно значение
какого-либо типа или несколько таких значений (в виде массива или
объекта), хранящихся внутри объекта. Поддерживаются три вида объектов:
□ встроенные (внутренние) объекты;
□ объекты, создаваемые программистом в сценарии;
□ внешние объекты (например, объекты WSH).
Более подробно объекты будут рассмотрены далее.
Логические данные
Логические данные предназначены для выполнения операций сравнения,
а также для использования в условных операторах. При этом логические
данные имеют только два значения: true (истина) и false (ложь). Отметим,
что в JScript эти значения никак не соотносятся с числами 1 и 0.
Null (пустой тип) и undefined (неопределенный тип)
Если переменная была объявлена с помощью ключевого слова var, но ей
еще ни разу не присваивалось значение, она имеет неопределенный тип
(undefined):
var MyVariable;
После выполнения этой строки переменная MyVariable имеет тип
undefined. Как уже отмечалось ранее, если теперь присвоить переменной
значение null, то эта переменная будет типа null (пустой тип):
MyVariable = null;
Преобразование типов данных
Одной из особенностей языка JScript является то, что если в выражениях
встречаются переменные разных типов, то автоматически происходит
преобразование всех числовых данных в строковое представление. Например,
следующие логические выражения будут равны true:
"100м == 100
false == 0
(здесь "==" означает оператор сравнения). Для преобразования строк в
числа нужно применять две специальные функции: parseint (преобразование
к целому числу) и parseFioat (преобразование к числу с плавающей
запятой). Например, после выполнения следующих строк:
var s="";
s=(parseint("3")-2)+"3";
значением переменной s будет строка "13".
Операторы
В JScript поддерживаются операторы различных типов, которые похожи на
аналогичные операторы языка С.
Унарные операторы
Унарными называются операторы, которые применяются к одному операнду
(табл. П4.3).
Таблица П4.3. Унарные операторы
Оператор Описание
Изменение знака на противоположный
! Дополнение. Используется для изменения значения логической
переменной на противоположное
++ Увеличение значения числовой переменной на единицу (инкремент).
Может применяться как префикс переменной или как ее суффикс
Уменьшение значения числовой переменной на единицу (декремент).
Может применяться как префикс переменной или как ее суффикс
Бинарные операторы
Бинарными называются операторы, которые соединяют два операнда
(табл. П4.4).
Таблица П4.4. Бинарные операторы
Оператор Описание
Вычитание
+ Сложение
* Умножение
/ Деление
% Вычисление остатка от деления
Операторы побитовых логических операций и сдвига
Эти операторы позволяют производить над числовыми переменными
побитовые операции, описанные в табл. П4.5.
Таблица П4.5. Операторы побитовых логических операций и сдвига
Оператор Описание
& Логическое И
I Логическое ИЛИ
Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ
Логическое НЕ
>> Сдвиг вправо
<< Сдвиг влево
>>>
Сдвиг вправо с заполнением освобождаемых разрядов нулями
( Замечание ^
Перед использованием операторов из табл. П4.5, значения переменных
преобразуются в 32-разрядные целые числа.
Операторы присваивания
В JScript, как и в языке С, для изменения содержимого переменных можно
комбинировать оператор присваивания "=" с другими операторами (см. табл. П4.6).
Таблица П4.6. Комбинации оператора присваивания и других операторов
Оператор Описание
Простое присваивание
+= Увеличение численного значения или конкатенация (склеивание)
строк
Уменьшение численного значения
*= Умножение
/= Деление
%= Вычисление остатка от деления
>>= Сдвиг вправо
>>>= Сдвиг вправо с заполнением освобождаемых разрядов нулями
<<= Сдвиг влево
I = Логическое ИЛИ
&= Логическое И
Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ
Операторы отношения
Операторы отношения используются для сравнения значений нескольких
переменных (табл. П4.7). Эти операторы могут возвращать только
логические значения true ИЛИ false.
Таблица П4.7. Операторы отношения
Оператор Условие, при котором возвращается true
> Левый операнд больше правого
>= Левый операнд больше или равен правому
< Левый операнд меньше правого
Таблица П4.7 (окончание)
Оператор Условие, при котором возвращается true
<= Левый операнд меньше или равен правому
Левый операнд равен правому
1 = Левый операнд не равен правому
Также в условных операторах применяются логические операторы
(табл. П4.8).
Таблица П4.8. Логические операторы
Оператор Описание
I | Оператор отношения ИЛИ. Возвращает true, если один из
операндов равен true. В противном случае возвращает false
&& Оператор отношения И. Возвращает true, если оба операнда
равны true. В противном случае возвращает false
Условные операторы
В JScript поддерживается условный оператор if ... else. Этот оператор
имеет следующий общий вид:
if (условие)
выраженме_ 1
[else
выражение_ 2 ]
При выполнении оператора if ... else оценивается логическое условие,
заданное в круглых скобках после ключевого слова if. Если в результате
оценки условия получилось значение true, то выполняется первое
выражение. В противном случае выполняется второе выражение (если оно
присутствует).
Оператор if ... else может быть вложенным. Заметим, что если в первом
или втором выражении нужно расположить несколько операторов, то их
следует выделить фигурными скобками:
if (х == 5) {
if (у == б)
z = 17;
}
else
z = 20;
В JScript также существует специальный тип условного оператора, который
называется оператором "?:". В общем виде он записывается так:
условие ? выражение_1 : выражение_2
При вычислении оператора "?:" вначале оценивается условие,
расположенное в левой части. Если оно равно true, то выполняется первое выражение,
в противном случае — второе. Например:
hours += (theHour >= 12) ? " РМ" : " AM";
Операторы циклов
Microsoft JScript поддерживает несколько типов циклов: цикл for, цикл
for ... in, цикл while, цикл do ... while. Рассмотрим каждый из них
подробнее.
Цикл for
В общем случае оператор цикла for имеет три раздела (инициализация,
условие и итерация) и записывается следующим образом:
for ([инициализация;] [условие;] [итерация]) {
тело цикла
}
В разделе инициализации обычно выполняется присваивание начальных
значений переменным цикла. Здесь можно объявлять новые переменные
с помощью ключевого слова var.
Во втором разделе задается условие выхода из цикла. Это условие
оценивается каждый раз при прохождении цикла. Если в результате такой оценки
получается логическое значение true, то начинают выполняться строки из
тела цикла; в противном случае происходит выход из цикла. В том случае,
когда условие было ложным с самого начала (при первой проверке), цикл
не будет выполнен ни разу.
Раздел итерации применяется для изменения значений переменных цикла
(например, увеличения или уменьшения значения счетчика цикла).
Пример использования цикла for приведен в листинге П4.1.
1 • •"; ,,": ■ ■"■ ■-' - •
Листинг П4.1. Пример использования цикла for
var howFar = 11; // Верхний предел для счетчика цикла
var sum = new Array(howFar); //Массив из 11 элементов, индексы от 0 до 10
var theSum = 0;
sum[0] = 0;
//Цикл выполнится 10 раз
for(var icount = 1; icount < howFar; icount++) {
theSum += icount;
sum[icount] = theSum;
}
var newSum = 0;
//Цикл не выполнится ни разу
for(var icount = 1; icount > howFar; icount++) {
newSum += icount;
}
var sum = 0;
//Бесконечный цикл
for(var icount = 1; icount > 0; icount++) {
sum += icount;
}
Цикл for... in
Оператор цикла for ... in предназначен для просмотра всех свойств объекта.
Для каждого свойства указанный цикл выполняет операторы, содержащиеся
в теле цикла:
for (переменная in объект) {
тело цикла
}
Цикл for ... in можно использовать для вывода на экран всех свойств
объекта в одном цикле:
function objectDisplay(obj) {
var displayLine;
for (var prop in obj) {
displayLine=obj.name+"."+prop+"="+obj[prop];
WScript.Echo(displayLine)
}
WScript. Echo (" ") ;
}
Цикл while
Цикл while похож на цикл for. В нем также условие выхода из цикла
проверяется перед выполнением итерации, однако в цикле while, в отличие от
for, нет встроенного счетчика и выражения, его изменяющего.
Оператор while записывается в следующем виде:
while (условие) {
тело цикла
}
Пример использования цикла while приведен в листинге П4.2.
var theMoments = "";
var theCount =42; // Начальное значение счетчика цикла
while (theCount >= 1) {
if (theCount > 1) {
theMoments = "До взрыва осталось " + theCount + " сек!";
}
else {
theMoments = "Осталась секунда'";
}
theCount—; // Уменьшаем значение счетчика
}
theMoments = "ВЗРЫВ1";
Цикл do... while
Этот цикл является примером цикла с постусловием и записывается в
следующем виде:
do {
тело цикла
}
while (условие);
В этом случае цикл выполняется до тех пор, пока проверяемое после
ключевого слова while условие не станет ложным (false). Так как условие
проверяется уже после прохождения тела цикла, то операторы внутри цикла do ...
while выполнятся по крайней мере один раз.
Пример использования цикла do ... while приведен в листинге П4.3.
Листинг П4.3. Пример использования цикла do ... while
var howFar =11; // Верхний предел для счетчика цикла
var sum = new Array(howFar); //Массив из 11 элементов, индексы от 0 до 10
var theSum = 0;
sum[0] = 0;
var icount = 1;
//Цикл выполнится 10 раз
do {
theSum += icount;
Листинг П4.2. Пример использования цикла while
sum[icount] = theSum;
icount++;
}
while (icount < howFar);
Внутри цикла любого вида можно применять два специальных оператора:
break И continue.
Оператор break
С помощью оператора break можно прервать выполнение цикла в любом
месте; управление при этом передастся на оператор, следующий сразу за
циклом.
var i = 0;
while (i < 100) {
if (i == 50)
break;
i++;
}
i++; // Значение i станет равным 51
Оператор continue
Оператор continue прерывает текущую итерацию цикла и начинает новую.
В различных видах циклов этот оператор производит следующие действия:
□ в циклах while и do ... while проверяется условие цикла, и если оно
равно true, то вновь выполняется тело цикла;
□ в цикле for изменяется значение счетчика в разделе итерации,
проверяется условие цикла, и если оно равно true, то тело цикла выполняется
вновь;
□ в цикле for ... in переменная цикла переходит к следующему полю
объекта, и тело цикла выполняется вновь.
Пример использования оператора continue:
var s = "", i=0;
while (i < 10) {
i++;
// Пропускаем число 5
if (i==5) {
continue;
}
S += i;
}
Прочие операторы
Существует еще несколько часто применяемых операторов. Кратко опишем
их назначение (табл. П4.9).
Таблица П4.9. Прочие операторы
Оператор Описание
Точка. Применяется для доступа к свойству объекта или для вызова
его метода
[ 1 Квадратные скобки. Применяются для индексирования массива
() Скобки. Применяются либо для изменения порядка вычисления
выражений, либо для передачи параметров функциям
Запятая. Применяется для многократных вычислений
С помощью оператора "," можно, например, в разделе итерации цикла for
изменять значение сразу нескольких переменных:
var i, j ;
j = 10;
for (i = 0; i<=10; i++, j--) {
}
Обработка исключительных ситуаций
Во время выполнения сценария могут возникать различные
исключительные ситуации (например, деление на ноль или попытка открыть
несуществующий файл), которые приводят к ошибкам времени выполнения — при
этом на экран выводится диалоговое окно с сообщением об ошибке и
выполнение сценария прекращается.
Существует возможность написать код сценария таким образом, чтобы
исключительные ситуации не приводили к завершению работы, а
обрабатывались бы внутри сценария. Для осуществления подобной обработки
исключительных ситуаций в JScript необходимо использовать конструкцию try ...
catch следующего синтаксиса:
try
Защищенный блок
catch(except)
Блок обработки исключительных ситуаций
После ключевого слова try записываются те операторы, при выполнении
которых потенциально может возникнуть ошибка. В качестве параметра
except необходимо использовать любое имя переменной (предварительно
объявлять эту переменную не нужно). Если в защищенном блоке не
возникло ошибки, то значение этой переменной будет равно нулю; в случае же
возникновения исключительной ситуации управление сразу передается
в блок catch, при этом переменная except как экземпляр объекта Error
будет содержать два свойства: error — числовой код возникшей ошибки и
description — краткое описание ошибки.
В качестве примера приведем часть сценария, в которой происходит
обработка исключительных ситуаций при подключении сетевого диска:
try {
//Подключаем сетевой диск
WshNetwork.MapNetworkDrive(Drive,NetPath);
}
catch (e) { //Обрабатываем возможные ошибки
if (e != 0) {
//Выводим сообщение об ошибке
Mess="Ouin6Ka при подключении диска " + Drive + " к " + NetPath+
"\пКод ошибки: "+е.number+"ХпОписание: "+е.description;
WshShell.Popup(Mess,0,"Подключение сетевого диска",vbCritical) ;
}
}
Порядок выполнения операторов
В табл. П4.10 операторы языка JScript расположены по старшинству, то есть
в составных операторах первыми будут выполняться те из них, которые стоят
в этой таблице выше. Если операторы расположены в одной строке
таблицы, то они выполняются слева направо.
Таблица П4.10. Порядок выполнения операторов
Оператор Описание
Доступ к полю объекта, индексирование в массиве, вызов
функции
Унарные операторы
Умножение, деление, вычисление остатка от деления
Сложение, вычитание, конкатенация строк
Битовые сдвиги
Меньше, меньше или равно, больше, больше или равно
Равенство, неравенство
. [] О
* / %
+ - +
<< >> >>>
Таблица П4.10 (окончание)
Оператор Описание
& Логическое И
Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ
I Логическое ИЛИ
&& Оператор отношения И
| | Оператор отношения ИЛИ
?: Условный оператор
= +=-=*= .= Присваивание
%= >>= >>>=
«= |= &= л =
Многократное вычисление
Функции
Функции в JScript, как и в других алгоритмических языках, позволяют
объединить несколько операций под одним именем. В случае необходимости
функция может быть вызвана из любого места сценария.
В сценариях JScript поддерживаются два вида функций: встроенные
функции и функции пользователя, которые вы пишете сами.
Встроенные функции
В табл. П4.П описаны встроенные функции языка JScript, которые в
сценарии можно вызывать в любом месте без предварительного описания.
Таблица П4.11. Встроенные функции
Функция Описание
escape (chars tring) Кодирование строки chars tring с применением URL-
кодировки. При этом все специальные неотображаемые
символы преобразуются к виду %хх, где хх — шестна-
дцатеричный код символа
eval (codestring) Интерпретация и выполнение кода JScript,
содержащегося в строке codestring. Эта функция позволяет
динамически создавать текст сценария
isFinite(nuTTLber) Возвращает true, если параметр number является
корректным числом. В противном случае возвращает
false
Таблица П4.11 (окончание)
Функция
Описание
isNaN{numvalue)
ParseFloat{numstring)
parselnt(numstring,
[radix])
unescape(charstring)
Возвращает true, если параметр numvalue имеет
специальное значение NaN (см. описание числового
типа). В противном случае возвращает false. Эту
функцию можно применять для оценки значений,
возвращаемых функциями преобразования типов parselnt
И parseFloat
Преобразовывает строку numstring в число с
плавающей точкой
Преобразовывает строку numstring в целое число.
Целочисленный параметр radix может принимать
значения от 2 до 36, которые указывают основание
счисления для числа, содержащегося в numstring. Если
radix не указан, то строки с префиксом Ох задают
шестнадцатеричные числа, а строки с префиксом 0 —
восьмеричные. Все остальные строки определяют
десятичные числа
Выполняет действие, противоположное действию
функции escape, то есть перекодирует строку charstring
из URL-кодировки в текстовую строку
Функции пользователя
Функции, определяемые пользователем, могут находиться в любом месте
сценария и иметь произвольное число параметров (аргументов). Общий вид
определения функции имеет вид:
function Имя_функции ( [параметр!] [, параметр2] [... , параметры]) {
Тело функции
[return значение;]
}
Ключевое слово return позволяет функции вернуть значение любого
допустимого типа. Например, приведенная далее функция MyFunction возвращает
true, если оба ее аргумента меньше 10:
function MyFunction(x,у) {
if ((x<10) ScSc (y<10))
return true
else
return false;
}
Встроенные объекты (классы)
Как уже отмечалось в самом начале данного приложения, JScript является
объектно-ориентированным языком, поэтому математические вычисления,
работа со строками, датой и временем, а также такими структурами, как
массивы и коллекции, осуществляются с помощью соответствующих
встроенных объектов. В табл. П4.12 описаны некоторые объекты, которые могут
быть полезны при создании сценариев с помощью WSH.
Таблица П4.12. Некоторые встроенные объекты JScript
Объект Описание
Array Создание и работа с массивами данных произвольного типа
Date Работа с данными, содержащими дату или время
Enumerator Работа с коллекциями данных произвольного типа
Math Выполнение математических вычислений
string Работа с текстовыми строками
Для того чтобы в сценарии использовать встроенный объект, необходимо
создать переменную, с помощью которой можно будет получить доступ
к свойствам и методам этого объекта. Для создания большинства
переменных такого вида применяется оператор new и специальная функция —
конструктор нужного объекта. Название конструктора всегда совпадает с
названием соответствующего встроенного объекта. Приведем пример создания
объектов Date И Array!
var d;
d = new Date();
var a;
a = new Array(10);
Отметим, что объекты string можно создавать, просто записывая в
кавычках значение строки:
var s;
s = "Привет'";
Опишем объекты, приведенные в табл. П4.12 более подробно.
Объект Array
Новый объект встроенного класса Array можно создать с помощью
оператора new следующими способами:
□ new Array о — создание массива нулевой длины;
□ new Array (n) — создание массива длины n;
П new Array (aO, al, ..., aN) — создание массива длины N+i с
элементами а09 al, ..., aN.
Например:
var Al, A2, A3;
Al = new Array();
A2 = new Array(3);
A3 = new Array(0,"Строка",2.5);
Нумерация элементов в массивах всегда начинается с нуля. После того как
массив создан и проинициализирован, обращаться к его элементам можно
с помощью обычного оператора индексации [], например:
А3[1] = А3[0] + A3[2];
Длину массива, то есть число содержащихся в нем элементов, можно узнать
с помощью свойства length объекта Array. Для того чтобы динамически
изменить длину массива (уменьшить или увеличить), достаточно просто
записать соответствующее значение в свойство length:
var A;
А = new Array(l/2/3/4/5); // Длина массива А равна 5
A.length =3; // Теперь длина массива А равна 3
Некоторые наиболее часто используемые методы встроенного объекта Array
описаны в табл. П4.13.
Таблица П4.13. Методы объекта Array
Метод Описание
al.concat (a2) Возвращает новый массив, являющийся результатом
объединения (склеивания) двух массивов: al (его
элементы идут первыми) и а2 (его элементы идут после
элементов массива al)
join (separator) Возвращает строку, содержащую все идущие друг за
другом элементы массива, разделенные символом,
указанным в параметре separator
reverse () Располагает элементы массива в обратном порядке
(первый меняется местами с последним, второй — с
предпоследним и т. д.). Новый массив при этом не
создается
slice (start, [end]) Возвращает часть массива, начиная с элемента с
индексом start, заканчивая элементом с индексом end.
Если в качестве end указано отрицательное число, то
оно задает смещение от конца массива. Если параметр
end не указан, то берутся все элементы массива,
начиная с элемента с индексом start
Таблица П4.13 (окончание)
Метод Описание
sort([sortfunction]) Возвращает массив с отсортированными элементами.
Параметр sortfunction определяет имя функции,
используемой для сортировки; если этот параметр
опущен, то сортировка производится в порядке увеличения
ASCII-кодов элементов массива
Пример использования методов объекта Array приведен в листинге П4.4.
var Al, A2, A3;
Al = new Array(2);
А2 = new Array(2,3,4,5);
A1[0] = 0;
Al[l] = 1;
A3 = A2.concat(Al); // A3=(2,3,4,5,0,1)
A3.sort(); // A3=(0,l,2,3,4,5)
Объект Date
Для создания нового объекта встроенного класса Date используется один из
трех конструкторов.
Конструктор первого вида позволяет создать объект, в котором хранится
информация о текущей дате и времени:
var d;
d = new Date();
Здесь время задается по Гринвичу, то есть с использованием времени
Universal Coordinated Time (UCT).
Конструктор второго вида имеет единственный параметр:
var d;
d = new Date(nMilliseconds);
Параметр nMiiiiseconds задает дату в миллисекундах, считая от 1 января
1970 года.
Конструктор третьего вида предназначен для раздельного задания
компонентов даты и имеет следующий вид:
var d;
d = new Date(year, month, date [, hours [, min [, sec [, ms]]]]);
Листинг П4.4. Пример использования методов объекта Array
Значения параметров последнего конструктора приведены в табл. П4.14.
Таблица П4.14. Параметры конструктора Date
Параметр
Описание
year
month
date
hours
min
sec
ms
Год в четырехзначном формате, например 1998 (но не 98)
Номер месяца от 0 (январь) до 11 (декабрь)
Календарная дата в диапазоне от 1 до 31
Час дня в диапазоне от 0 до 23
Минуты в диапазоне от 0 до 59
Секунды в диапазоне от 0 до 59
Миллисекунды в диапазоне от 0 до 999
Наиболее часто используемые методы объекта Date описаны в табл. П4.15.
Таблица П4.15. Некоторые методы объекта Date
Метод
Описание
getDate()
getDayO
getFullYear()
getHours()
getMilliseconds()
getMinutes()
getMonth()
getSeconds()
getTime()
getTimezoneOf.f set ()
parse(dateVal)
Возвращает календарную дату в диапазоне от 1 до 31
Возвращает номер дня недели (0 для воскресенья, 1 —
для понедельника и т. д.)
Возвращает четырехзначный номер года
Возвращает число часов (отсчет идет с полуночи)
Возвращает число миллисекунд
Возвращает число минут (отсчет идет с начала часа)
Возвращает число месяцев (отсчет идет с января)
Возвращает число секунд (отсчет идет с начала минуты)
Определение времени для объекта Date. Возвращает
количество миллисекунд, прошедших с 1 января 1970 года
Возвращает смещение локального времени
относительно времени по Гринвичу (в миллисекундах)
Возвращает число миллисекунд, прошедших с полуночи
1 января 1970 года до времени, заданного параметром
dateVal. Для вызова метода parse не обязательно
создавать объект класса Date, достаточно просто сослаться
на имя этого класса:
n = Date.parse("10 May 2001 13:00:00");
Параметр dateVal может задаваться в нескольких
форматах (подробную информацию см. в документации по
языку JScript)
Таблица П4.15 (продолжение)
Метод Описание
setDate(date) Устанавливает календарную дату. Параметр date может
принимать любые положительные или отрицательные
значения. Если значение date больше, чем количество
дней в месяце, который хранится в объекте Date, или
date является отрицательным числом, то календарная
дата устанавливается равной числу, которое получается
как разность параметра date и количества дней в этом
месяце
setFullYear (year) Устанавливает номер года, заданный параметром year
setHours (hours) Устанавливает количество часов, заданное параметром
hours. Параметр hours может принимать любые
положительные или отрицательные значения (при
необходимости происходит соответствующее изменение даты,
записанной в объекте класса Date)
setMilliseconds (ms) Устанавливает количество миллисекунд, заданное
параметром ms. Параметр ms может принимать любые
положительные или отрицательные значения (при
необходимости происходит соответствующее изменение даты,
записанной в объекте класса Date)
Устанавливает количество минут, заданное параметром
min. Параметр min может принимать любые
положительные или отрицательные значения (при необходимости
происходит соответствующее изменение даты,
записанной в объекте класса Date)
Устанавливает номер месяца, прошедшего с начала года.
Параметр топ может принимать любые положительные
или отрицательные значения (при необходимости
происходит соответствующее изменение даты, записанной
в объекте класса Date)
Устанавливает количество секунд, заданное параметром
sec. Параметр sec может принимать любые
положительные или отрицательные значения (при необходимости
происходит соответствующее изменение даты,
записанной в объекте класса Date)
Устанавливает дату, соответствующую количеству
миллисекунд (параметр ms), прошедших с 1 января 1970 года
Преобразует дату в строку и возвращает результат
в стандартном формате времени по Гринвичу (Greenwich
Mean Time, GMT)
Преобразует дату в строку и возвращает результат в
формате локального времени
setMinutes(min)
setMonth(топ)
setSeconds(sec)
setTime(ms)
toGMTStringO
ToLocaleString()
Таблица П4.15 (окончание)
Метод Описание
ToUTCStringO Преобразует дату в строку и возвращает результат в
формате UTC
итс {year, month, Преобразует дату, заданную параметрами метода, в ко-
date[, hours[, личество миллисекунд, прошедшее с полуночи 1 января
min[, sec 1970 года. При использовании этого метода, как и мето-
i,ms]]]]) да parse, объект класса Date создавать не обязательно:
n = Date.UTC(year,month,date);
Пример использования методов объекта Date приведен в листинге П4.5.
Листинг П4.5. Пример использования методов объекта Date
var d;
var s = "";
d = new Date();
s = "Дата: " + d.getDateO + "." + d.getMonthO + "." + d.getYear();
s += "\n";
s += "Время: " + d.getHoursO + ":" + d.getMinutes() + ":" +
d.getSeconds();
После выполнения этих строк в переменной s будут записаны текущие дата
и время.
Объект Enumerator
С помощью объекта Enumerator можно получить доступ к любому элементу
коллекции (в VBScript для этого служит цикл For ... Each). Коллекцией
в языке JScript называется множество элементов, которое отличается от
массива тем, что к элементам коллекции нельзя получить прямой доступ с
помощью индексов — можно только перемещать указатель текущего элемента
на самый первый или следующий относительно текущего элемент.
Для создания нового объекта встроенного класса Enumerator используется
конструктор следующего вида:
var e;
е = new Enumerator(collection);
Здесь параметр collection указывает на коллекцию, для доступа к
элементам которой и создается объект класса Enumerator. Сами коллекции обычно
являются свойствами других объектов.
Методы объекта Enumerator представлены в табл. П4.16 (свойств у этого
объекта нет).
Таблица П4.16. Методы объекта Enumerator
Метод Описание
atEnd () Возвращает true, если указатель текущего элемента находится
на элементе, следующем за последним экземпляром коллекции,
либо коллекция пуста, либо текущий элемент не определен.
В противном случае возвращается false
item() Возвращает значение текущего элемента коллекции. Если
коллекция пуста или текущий элемент не определен, возвращается
неопределенное значение undefined
moveFirstO Перемещает указатель на первый элемент коллекции. Если в
коллекции нет элементов, текущий элемент принимает
неопределенное значение undefined
moveNext () Перемещает указатель на следующий элемент коллекции. Если
перед применением этого метода указатель находился на
последнем элементе коллекции либо коллекция пуста, текущий
элемент принимает неопределенное значение undefined
Пример, поясняющий схему применения объекта Enumerator, приведен
в листинге П4.6.
Листинг П4.6. Пример использования объекта Enumerator
//Объявляем переменные
var FSO,Folder,Files,s;
//Создаем объект FileSystemObject
FSO=WScript.CreateObject("Scripting.FileSystemObject");
//Создаем объект Folder для корневого каталога диска С
Folder=FSO.GetFolder("С:\\");
//Создаем коллекцию файлов каталога Мои документы
Files=new Enumerator(Folder.Files);
//Цикл по всем файлам
for (; 'Files.atEnd(); Files.moveNext())
//Добавляем строку с именем файла
s+=Files.item().Name+"\n";
//Выводим полученные строки на экран
WScript.Echo(s);
Объект Math
Встроенный класс Math применяется для математических вычислений и
содержит основные математические константы и функции.
Объект Math создается сервером сценариев автоматически и не может быть
создан при помощи оператора new, как другие встроенные объекты. Все
методы и свойства этого объекта доступны из сценария без какого-либо
предварительного объявления.
Свойства объекта Math (все они являются математическими константами)
описаны в табл. П4.17.
Таблица П4.17. Свойства объекта Math
Свойство Описание
Константа е. Приблизительное ее значение равно 2,72
Натуральный логарифм числа 2 (приблизительно 0,693)
Натуральный логарифм числа 10 (приблизительно 2,302)
Логарифм числа е по основанию 2 (примерно 1,442)
Логарифм числа е по основанию 10 (примерно 0,434)
Число я, то есть константа с приблизительным значением, равным
3,14
Корень квадратный из Уг (примерно 0,707)
Корень квадратный из 2 (примерно 1,414)
Методы объекта Math (они являются стандартными математическими
функциями) приведены в табл. П4.18.
Таблица П4.18. Методы объекта Math
Метод Описание
abs (х) Возвращает абсолютное значение числа х
acos (х) Возвращает арккосинус числа х
as in (х) Возвращает арксинус числа х
a tan (x) Возвращает арктангенс числа х
atan2 (у, х) Вычисляет угол в радианах от оси Ох до точки (у, х).
Возвращаемое значение лежит в диапазоне от -я до я
ceil(x) Возвращает наименьшее целое значение, большее или равное
аргументу х
Е
LN2
LN10
LOG2E
LOG10E
PI
SQRT1_2
SQRT2
Таблица П4.18 (окончание)
Метод
Описание
cos(x) Возвращает косинус числа х
ехр(х) Экспоненциальная функция, возвращает число е, возведенное в
степень х
floor (х) Возвращает наибольшее целое значение, меньшее или равное
аргументу х
log (х) Возвращает натуральный логарифм числа х
max (xl, х2) Возвращает наибольшее из двух значений xl и х2
min (xl, х2) Возвращает наименьшее из двух значений xl и х2
pow (у, х) Возводит число у в степень х и возвращает полученный результат
random () Возвращает случайное число в интервале от 0 до 1
round (х) Выполняет округление значения аргумента хдо ближайшего
целого. Если десятичная часть числа равна 0,5 или больше этого
значения, то округление выполняется в большую сторону,- иначе — в
меньшую
sin (х) Возвращает синус числа х
sqrt(x) Вычисляет квадратный корень из числа х и возвращает
полученное значение
tan (х) Возвращает тангенс числа х
Приведем пример использования свойств и методов встроенного объекта
Math:
var х, у, z ;
х = 12;
у = Math.sqrt(x);
z = 2*Math.PI*Math.pow(y/x);
Объект String
Встроенный объект string предназначен для выполнения различных
операций над текстовыми строками. Обычно объекты класса string создаются
просто с помощью записи в переменную текстового литерала:
var si, s2;
si = "Это строка";
s2 = "Это тоже строка";
Также можно создавать такие объекты с помощью оператора new:
var si, s2;
si = new String("Это строка");
s2 = new String("Это тоже строка");
Объект string имеет свойство length, в котором хранится длина строки.
Некоторые методы объекта string, не связанные с тегами HTML,
приведены в табл. П4.19.
Таблица П4.19. Некоторые методы объекта string
Метод
Описание
charAt(index)
charCodeAt(index)
si.concat{s2)
f romCharCode (cl,..., cN)
s.indexOf. (subs tr,
startindex)
s.lastlndexOf{substr,
startindex)
s.ma tch(rgExp)
replace(rgExp,
replaceText)
Возвращает символ с индексом index из строки.
Нумерация символов в строке начинается с нуля,
поэтому допустимыми значениями параметра
index являются числа из диапазона от нуля до
числа, на единицу меньшего длины строки
Выбирает символ с индексом index из строки и
возвращает этот символ в кодировке Unicode
Возвращает строку, являющуюся результатом
конкатенации (склеивания) строк si и s2 (то же самое,
что sl+s2)
Возвращает строку, состоящую из Unicode-
символов с кодами cl, ..., cN
Возвращает индекс символа, с которого начинается
первое вхождение подстроки substr в строку s.
Если подстрока не найдена, возвращается -1.
Параметр startindex задает номер символа, с
которого следует начинать поиск. Если этот параметр не
задан, то поиск осуществляется с начала строки.
Поиск выполняется слева направо
То же самое, что метод indexOf, но поиск
производится справа налево, т. е. возвращается номер
последнего символа, с которого начинается
вхождение подстроки substr в строку s
Возвращает в виде массива результат поиска
в строке s подстроки, задаваемой регулярным
выражением rgExp (поиск с использованием
регулярных выражений описан в документации по JScript)
Возвращает копию строки, в которой произведены
необходимые замены текста. Шаблон для поиска
задается регулярным выражением rgExp, строка
для замены— параметром replaceText.
Первоначальная строка методом replace не изменяется
Таблица П4.19 (окончание)
Метод
Описание
search(rgExp)
slice{start, [end])
s.split(str)
substr(start [, length])
substring(start, end)
toLowerCase()
toUpperCase()
Возвращает номер первого символа в строке, с
которого начинается подстрока, удовлетворяющая
регулярному выражению гдЕхр
Возвращает часть строки, начиная с позиции start
и заканчивая символом, стоящим в позиции с
номером end (или последним символом в строке,
если параметр end опущен). Если в качестве end
указано отрицательное число, то этот параметр задает
смещение от конца массива
Возвращает массив строк, полученных в результате
разбиения строки s на подстроки. Параметр str
задает строку или регулярное выражение (объект
Regular Expression), которые определяют
символ, являющийся признаком начала разбиения
Возвращает подстроку, начинающуюся с позиции
start и имеющую длину length. Если б качестве
length указано отрицательное число или ноль, то
возвращается пустая строка
Возвращается подстрока, состоящая из символов,
начинающихся с позиции start и
заканчивающихся позицией end. В качестве start и end могут
быть указаны строки, которые в этом случае
автоматически преобразуются в числа
Возвращает строку, в которой все алфавитные
символы преобразованы к нижнему регистру
Возвращает строку, в которой все алфавитные
символы преобразованы к верхнему регистру
Приведем пример использования методов объекта string:
var si, s2, s3;
si = "Первая строка";
s2 = "Вторая строка";
si = si.toUpperCase();
s2 = s2.substr(0,6);
si = sl.slice(7);
s3 = s2 + " " + si;
После выполнения этих строк значением переменной s3 будет строка
Вторая строка.
Язык VBScript
Язык VBScript (Visual Basic Script Edition) является урезанной версией языка
Microsoft Visual Basic, поэтому для тех, кто программировал на Visual Basic
или VBA, язык VBScript окажется очень знакомым.
Строки кода и комментарии
В отличие от JScript, для сценариев VBScript в конце строки не нужно
ставить точку с запятой. В случае необходимости написания одного оператора
на нескольких строках, в конце этих строк нужно ставить символ
подчеркивания "_":
s = "Символьная " & _
"строка"
Комментарием в VBScript считаются все символы в строке, идущие после
символа апострофа ■ или ключевого слова Rem. Например:
Rem Этот комментарий занимает всю строку
theSum=l 'А этот - часть строки
Переменные
Переменные в VBScript могут быть глобальными (доступными из любого
места сценария) и локальными (область действия ограничивается блоком
кода, в котором они определены). Все переменные VBScript имеют
стандартный тип variant. Объявляются переменные обычно с помощью
ключевого слова Dim, например:
Dim MyVariable
По умолчанию переменные в VBScript можно предварительно не объявлять;
для включения режима обязательного объявления переменных нужно
вставить в самую первую строку сценария выражение option Explicit.
Язык VBScript является регистронезависимым, то есть имена Myvariabie и
myvariabie представляют одинаковые переменные. При выборе имен
переменных следует придерживаться следующих правил:
□ имя переменной должно начинаться с буквы и не должно содержать
символа ",";
□ имя переменной не должно превышать 255 символов.
Значения переменным в VBScript присваиваются с помощью оператора "=".
Например:
Dim MyVariable
MyVariable = "Привет1"
Здесь мы объявили переменную Myvariabie и записали в нее текстовую
строку. Отметим, что далее в любом месте сценария мы можем присвоить
переменной Myvariabie, скажем, числовое значение, например:
MyVariable = 10
Подтипы данных
Хотя в VBScript определен только один тип variant, внутри этого типа
имеется разделение на подтипы, описание которых приведено в табл. П4.20. Для
преобразования переменных к определенному подтипу нужно использовать
соответствующую функцию преобразования; эти функции также
представлены в табл. П4.20.
Таблица П4.20. Подтипы данных
Подтип Функция
преобразования
Описание
Empty
Null
Bool
Byte
Integer
Currency
Long
Single
Double
Date/Time
String
Object
Error
Cbool(x)
Cbyte(x)
Cint(x)
Ccur(x)
CLng(x)
CSngl(x)
CDbl(x)
Cdate(x)
CStr(x)
-
_
Автоматически присваивается новым
переменным, когда для них еще не определено явное
значение
Указывает на то, что переменная не содержит
допустимых значений
Используется для работы с логическими
переменными, принимающими два допустимых
значения: True ИЛИ False
Содержит целые числа в диапазоне от 0 до 255
Содержит целые числа в диапазоне от -32 768
до 32 768
Специальный числовой формат для денежных
величин
Содержит целые числа в диапазоне от
-2 147 483 648 до 2 147 483 647
Тип чисел с плавающей точкой одинарной точности
Тип чисел с плавающей точкой двойной точности
Содержит числа, соответствующие датам и
времени от 1 января 100 г до 31 декабря 9999 г.
Символьный подтип данных. Текстовые строки в
VBScript — это последовательность символов,
заключенных в двойные кавычки
Ссылка на объект
Тип данных, предназначенный для хранения
номеров ошибок
Ссылки на объекты
В переменную, которая была ранее объявлена с использованием ключевого
слова Dim, можно записать ссылку на какой-либо объект. Делается это с
помощью оператора set, например:
Dim FSO
Set FSO=CreateObject("Scripting.FileSystemObject")
Здесь функция createobject () возвращает экземпляр объекта
Filesystemobjecr, ссылка на который заносится в переменную fso.
После того как ссылка на объект станет ненужной, переменную можно
освободить С ПОМОЩЬЮ КЛЮЧевоГО СЛОВа Nothing!
Set FSO=Nothing
Константы
Пользовательские константы в VBScript объявляются с помощью ключевого
слова const, например:
Const MyConst="3To моя константа"
Кроме этого, VBScript поддерживает много встроенных именованных
констант (их не нужно дополнительно объявлять в сценарии), применение
которых упрощает использование различных внутренних функций (например,
MsgBoxO или inputBoxO). Имена, значения и описание внутренних
констант приведены в табл. П4.21-П4.28.
Таблица П4.21. Константы для обозначения цветов
Имя
vbBlack
vbRed
vbGreen
vbYellow
vbBlue
vbMagenta
vbCyan
vbWhite
Значение
&h00
&hFF
&hFF00
&hFFF
SchFFOOOO
&hFF00FF
&hFFFF00
SchFFFFFF
Описание
Черный
Красный
Зеленый
Желтый
Синий
Фиолетовый
Бирюзовый
Белый
Таблица П4.22. Константы для нумерации дней недели
Имя Значение Описание
vbSunday 1 Воскресенье
vbMonday 2 Понедельник
Таблица П4.22 (окончание)
Имя
vbTuesday
vbWednesday
vbThursday
vbFriday
vbSaturday
Значение
3
4
5
6
7
Описание
Вторник
Среда
Четверг
Пятница
Суббота
Имя
Таблица П4.23. Константы для определения первого дня
в неделе и первой недели в году
Значение Описание
vbUseSystemDayOfWeek О
vbFirstJanl
vbFirs tFourDays
vbFirstFullWeek
Использовать для определения первого
дня недели региональные настройки
системы
Первой неделей в году считается та, в
которой было 1 января
Первой неделей в году считается та, в
которой было, по крайней мере, четыре
дня нового года
Первой неделей в году считается первая
полная неделя
Имя
Таблица П4.24. Константы для работы с датой и временем
Значение Описание
vbGeneralDate
vbLongDate
vbShortDate
vbLongTime
vbShortTime
0
1
2
3
4
Дата и время выводятся в формате,
определяемом региональными настройками системы
Выводить дату, используя полный формат
Выводить дату, используя краткий формат
Выводить время, используя полный формат
Выводить время, используя краткий формат
Таблица П4.25. Константы для диалоговых окон
Имя
Значение Описание
vbOkOnly
vbOkCancel
Выводится кнопка ОК
Выводятся кнопки ОК и Отмена (Cancel)
Таблица П4.25 (окончание)
Имя
Значение Описание
vbAbortRetryIgnore
vbYesNoCancel
vbYesNo
vbRetryCancel
vbCritical
vbQuestion
vbExc1ama t i on
4
5
16
32
48
vblnformation 64
vbDefaultButtonl
vbDefaultButton2 2 56
vbDefaultButton3 512
vbDefaultButton4 7 68
vbApplicationModal 0
vbSys temModal
4096
Выводятся кнопки Стоп (Abort), Повтор
(Retry) и Пропустить (Ignore)
Выводятся кнопки Да (Yes), Нет (No) и
Отмена (Cancel)
Выводятся кнопки Да (Yes) и Нет (No)
Выводятся кнопки Повтор (Retry) и Отмена
(Cancel)
Выводится значок Stop Mark (Стоп)
Выводится значок Question Mark (Вопрос)
Выводится значок Exclamation Mark
(Внимание)
Выводится значок Information Mark
(Информация)
По умолчанию в окне выбирается первая
кнопка
По умолчанию в окне выбирается вторая
кнопка
По умолчанию в окне выбирается третья
кнопка
По умолчанию в окне выбирается четвертая
кнопка
Диалоговое окно выводится в модальном
режиме
Диалоговое окно выводится в модальном
режиме и располагается сверху всех
запускаемых приложений
Таблица П4.26. Результаты нажатия кнопок в диалоговых окнах
Имя
Значение Описание
vbOk
vbCancel
vbAbort
vbRetry
vblgnore
Нажата кнопка OK
Нажата кнопка Отмена (Cancel)
Нажата кнопка Стоп (Abort)
Нажата кнопка Повтор (Retry)
Нажата кнопка Пропустить (Ignore)
Таблица П4.26 (окончание)
Имя
Значение Описание
vbYes 6 Нажата кнопка Да (Yes)
vbNo 7 Нажата кнопка Нет (No)
Имя
Таблица П4.27. Константы для обозначения подтипов данных
Значение Описание
vbEmpty
vbNull
vblnteger
vbLong
vbSingle
vbDouble
vbCurrency
vbDate
vbString
vbObject
vbError
vbBoolean
vbVariant
vbDataObject
vbDecimal
vbByte
vbArray
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
17
8192
Переменная не инициализирована
Переменная не содержит корректных данных
Переменная имеет подтип integer
Переменная имеет подтип Long
Переменная имеет подтип single
Переменная имеет подтип Double
Переменная имеет подтип Currency
Переменная имеет подтип Date
Переменная имеет подтип string
Переменная имеет подтип Object
Переменная имеет подтип Error
Переменная имеет подтип Boolean
Переменная имеет подтип Variant (только для
массивов переменных типа Variant)
Объект доступа к данным
Переменная имеет подтип Decimal
Переменная имеет подтип Byte
Переменная является массивом
Таблица П4.28. Прочие константы
Имя
Значение
Описание
vbCr
vbCrLf
vbFormFeed
vbLf
Chr(13)
Chr(13)&Chr(10)
Chr(12)
Chr(10)
Возврат каретки
Возврат каретки и перевод строки
Перевод страницы
Перевод строки
Таблица П4.28 (окончание)
Имя
Значение
Описание
vbNullChar Chr(O)
vbNullString Нулевая строка
vbTab Chr(9)
vbVerticalTab Chr(11)
vbUseDefault -2
vbTrue -1
vbFalse 0
vbObjectError -2 147 221 504
Символ с нулевым кодом
Нулевая строка
Символ табуляции
Символ вертикальной табуляции
Использовать значения по умолчанию из
региональных настроек системы
Логическое значение Истина
Логическое значение Ложь
Определяет минимальное значение для
номеров ошибок, задаваемых
пользователем
Массивы
Массивы в VBScript могут быть двух видов: статические (фиксированной
длины) и динамические (переменной длины). Объявляются массивы, как и
обычные переменные, с помощью ключевого слова Dim.
Для объявления статического массива нужно после его названия указать
в круглых скобках наибольшее значение, которое может принимать индекс
элемента в, этом массиве, например:
Dim MyArr(lO)
В языке VBScript (в отличие, например, от VBA) нумерация в массивах
всегда начинается с нуля, поэтому объявленный ранее массив муАгг будет
содержать 11 элементов, обращаться к которым нужно следующим образом:
МуАгг(0)="Это первый элемент"
МуАгг(1)="Это второй элемент"
MyVar=MyArr(0)
Можно объявить двумерный массив, указав максимальные значения
индексов для строк и столбцов соответственно, например:
Dim MyArr(5,10) 'Массив из б строк и 11 столбцов
При объявлении динамического массива его размеры в круглых скобках не
указываются:
Dim MyArr()
Для использования динамического массива в сценарии применяется
оператор ReDim, который определяет конкретную длину массива, например:
ReDim MyArray(lO)
После этого к элементам динамического массива можно обращаться так же,
как и к элементам обычного:
МуАгг(0)="Это первый элемент"
МуАгг(1)="Это второй элемент"
Отметим, что размеры динамического массива можно менять неоднократно
(с помощью того же ReDim). Для сохранения при этом содержимого массива
следует в операторе ReDim использовать ключевое слово Preserve,
например:
ReDim Preserve MyArray(20)
Операторы
В VBScript поддерживаются операторы нескольких типов, которые описаны
далее.
Арифметические операторы
Арифметические операторы языка VBScript представлены в табл. П4.29.
Таблица П4.29. Арифметические операторы
Оператор Описание
- (унарный оператор) Изменение знака аргумента на противоположный
- (бинарный оператор) Вычитание двух чисел
+ Сложение двух чисел
* Умножение двух чисел
/ Деление двух чисел
\ Целочисленное деление двух чисел
Mod Вычисление остатка от деления двух чисел
Оператор возведения в степень
Операторы отношения
и логические операторы
Операторы отношения используются для сравнения значений двух
переменных. Эти операторы (табл. П4.30) могут возвращать только логические
значения True ИЛИ False.
Таблица П4.30. Операторы отношения
Оператор Условие, при котором возвращается True
> Левый операнд больше правого
>= Левый операнд больше или равен правому
< Левый операнд меньше правого
<= Левый операнд меньше или равен правому
Левый операнд равен правому
<> Левый операнд не равен правому
Также внутри условных операторов могут применяться логические
операторы (табл. П4.31).
Таблица П4.31. Логические операторы
Оператор Описание
Not Оператор отрицания. Возвращает True, если операнд равен
False. В противном случае возвращает False
Or Оператор отношения ИЛИ. Возвращает True, если один из
операндов равен True. В противном случае возвращает False
Хог Оператор отношения ИСКЛЮЧАЮЩЕЕ ИЛИ. Возвращает True,
если один из операндов равен True, а другой равен False.
В противном случае возвращает False
And Оператор отношения И. Возвращает True, если оба операнда
равны True. В противном случае возвращает False
Условные операторы
В VBScript поддерживается условный оператор if ... Then ... Else. Общий
вид этого оператора:
If условие_1 Then
выражение_ 1
[Elself условие_2 Then
выражение_2]
[Else
выражение_3 ]
End If
При выполнении оператора if ... Then ... Else оценивается логическое
условие {условие_1), стоящее после ключевого слова if. Если в результате
ОЦеНКИ УСЛОВИЯ ПОЛУЧИЛОСЬ Значение True, TO ВЫПОЛНЯеТСЯ выражение_1 И
происходит выход из оператора. В противном случае начинают по очереди
проверяться условия, стоящие после ключевых слов Eiseif; если одно из
этих условий истинно, то выполняется соответствующее выражение, после
чего управление передается следующему после End if оператору. Если ни
одно из проверяемых условий не является истинным, выполняется
выражение, стоящее после ключевого слова Else. Пример:
If (theCount > 1) Then
theMoments = "До взрыва осталось " & theCount & " сек!"
Else
theMoments = "Осталась секунда!"
End If
Другим оператором, позволяющим делать выбор из нескольких вариантов,
является select Case. Синтаксис этого оператора:
Select Case выражение
Case значение_1
выражение_ 1
[Case значение_2
выражение_2]
[Case Else
выражение_3]
End Select
Здесь сначала вычисляется значение выражения, которое затем по очереди
сравнивается со значениями, стоящими после ключевых слов case. В случае
совпадения выполняются операторы в соответствующем блоке case. Если
же ни одно из имеющихся значений не совпадает со значением выражения,
то выполняются операторы, стоящие после слова case Else. Пример
использования оператора Select Case!
Select Case MyVar
Case vbRed
Color = "Красный"
Case vbGreen
Color = "Зеленый"
Case vbBlue
Color = "Синий"
Case Else
Color = "Цвет непонятен"
End Select
Операторы циклов
В VBScript ПОДДерЖИВаЮТСЯ НесКОЛЬКО ТИПОВ ЦИКЛОВ: ЦИКЛ For ... Next, ЦИКЛ
Do ... Loop, ЦИКЛ While ... Wend, ЦИКЛ For Each ... Next. Рассмотрим КаЖДЫЙ
из них подробнее.
Цикл For... Next
В общем случае оператор цикла For ... Next записывается следующим образом:
For counter=start To end [Step step]
тело цикла
[Exit For]
тело цикла
Next
Параметр counter здесь является счетчиком цикла, start — начальное
значение этого счетчика, end— конечное значение, step— шаг приращения
счетчика. Если ключевое слово step не указано, то шаг приращения берется
равным единице. Выход из цикла For ... Next происходит, когда значение
счетчика counter становится больше, чем значение параметра end.
Выражение Exit For используется для безусловного выхода из цикла.
Пример использования данного цикла приведен в листинге П4.7.
Листинг П4.7. Пример использования цикла For ... Next
Dim howFar 'Верхний предел для счетчика цикла
Dim sum(10) 'Массив из 11 элементов, индексы от 0 до 10
Dim icount, theSum
howFar =10
theSum = 0
sum(0) = 0
'Цикл выполнится 11 раз
For icount = 0 To howFar
the Sum= the Sum+ i с oun t
sum (icount) = theSum
Next
Цикл For Each... Next
Оператор цикла For Each ... Next предназначен лля перебора всех элементов
массива или коллекции:
For Each element In group
тело цикла
[Exit For]
тело цикла
Next [element]
Здесь параметр element является переменной, в которую будет записываться
значение текущего элемента массива или коллекции при итерациях,
group — имя массива или коллекции объектов.
( Замечание ^
Напомним, что в JScript для перебора всех элементов коллекции необходимо
использовать вспомогательный объект Enumerator.
С помощью оператора Exit For можно осуществить немедленный выход из
цикла.
Пример использования данного цикла приведен в листинге П4.8.
'Объявляем переменные
Dim FSO, Folder, Files, File, s
s="CnncoK файлов" & vbCrLf
'Создаем объект FileSystemObject
Set FSO = CreateObject("Scripting.FileSystemObject")
' Создаем объект Folder для корневого каталога диска С
Set Folder = FSO.GetFolder("С:\")
'Создаем коллекцию Files всех файлов в корневом каталоге диска С
Set Files = Folder.Files
'Перебираем все элементы коллекции Files
For Each File In Files
'Выделяем имя файла для текущего элемента File коллекции
s = s & File.Name & vbCrLf
Next
'Выводим сформированную строку на экран
WScript.Echo s
Цикл While... Wend
Цикл while ... wend записывается в следующем виде:
While условие
тело цикла
Wend
Листинг П4.6. Пример использования цикла For Each ... Next
Таким образом, в цикле while ... wend условие выполнения тела цикла
проверяется перед началом очередной итерации. Если условие равно True, то
тело цикла выполняется, в противном случае цикл завершается.
Пример использования данного цикла приведен в листинге П4.9.
Листинг П4.9. Пример использования цикла while ... wend
Dim theMoments, theCount
theMoments = ""
theCount =42 'Начальное значение счетчика цикла
While (theCount >= 1)
If (theCount > 1) Then
theMoments = "До взрыва осталось " & theCount & " сек!"
Else
theMoments = "Осталась секунда1"
End If
theCount=theCount - 1 'Уменьшаем значение счетчика
Wend
theMoments = "ВЗРЫВ'"
Цикл Do... Loop
Этот цикл может применяться в двух видах:
□ с предусловием, которое проверяется до начала очередной итерации:
Do [While | Until] условие
тело цикла
[Exit Do]
тело цикла
Loop
□ с постусловием, которое проверяется после окончания итерации:
Do
тело цикла
[Exit Do]
тело цикла
Loop [While | Until] условие
Если в цикле используется ключевое слово while, то итерации
продолжаются до тех пор, пока условие равно True; если же применяется until, то, как
только значением условия станет True, произойдет выход из цикла.
Оператор Exit do позволяет выйти из цикла до завершения его итераций.
Пример использования данного цикла приведен в листинге П4.10.
Dim howFar 'Верхний предел для счетчика цикла
Dim sum(10) 'Массив из 11 элементов, индексы от 0 до 10
Dim icount, theSum
howFar =10
theSum = 0
sum(0) = 0
'Цикл выполнится 11 раз
Do
theSum - theSum+icount
sum(icount) = theSum
icount=icount+l
Loop While (icount < howFar)
Прочие операторы
Рассмотрим еще несколько часто применяемых операторов (табл. П4.32).
Таблица П4.32. Прочие операторы
Оператор Описание
Точка. Применяется для доступа к свойству объекта или для
вызова его метода
() Скобки. Применяются для изменения порядка вычисления
выражений, или для передачи параметров функциям, или для
индексирования массива
& Оператор конкатенации (склеивание между собой)
символьных строк
with ... End with Позволяет обращаться к свойствам объекта без написания
имени этого объекта
Обработка исключительных ситуаций
Режим обработки исключительных ситуаций в VBScript включается с
помощью оператора On Error Resume Next. ЕСЛИ ПОСЛе ЭТОГО При исполнении
какого-либо оператора в сценарии произойдет ошибка времени
выполнения, то управление передастся следующему оператору в тексте.
Листинг П4.10. Пример использования цикла Do ... Loop
Для анализа ошибок используется специальный объект егг, который
содержит ДВа СВОЙСТВа: Number — ЧИСЛОВОЙ КОД ВОЗНИКШеЙ ОШИбки И
Description — краткое описание этой ошибки.
В качестве примера приведем часть сценария, в которой происходит
обработка исключительных ситуаций при подключении сетевого диска:
On Error Resume Next ' Включаем обработку ошибок времени выполнения
' Подключаем сетевой диск
WshNetwork.MapNetworkDrive Drive,NetPath
If Err.Number<>0 Then
Mess="0mn6Ka при подключении диска " & Drive & " к " & NetPath &_
"Код ошибки: " & е.number & "Описание: " & е.description
WshShell.Popup Mess,0,"Подключение сетевого диска",vbCritical
Else
' Все в порядке
Mess="flncK " & Drive & " успешно подключен к " & NetPath
WshShell.Popup Mess,0,"Подключение сетевого диска",vblnformation
End If
Для отмены режима обработки исключительных ситуаций нужно выполнить
оператор On Error Goto 0.
Процедуры и функции
В сценариях VBScript поддерживаются два вида подпрограмм: встроенные
функции и функции/процедуры пользователя.
Математические функции
Имеющиеся в VBScript функции, предназначенные для математических
вычислений, описаны в табл. П4.33.
Таблица П4.33. Математические функции
Функция Описание
Abs (x) Возвращает абсолютное значение числа х
Atn (х) Возвращает арктангенс числа х
Cos(x) Возвращает косинус числа х
Ехр(х) Экспоненциальная функция, возвращает число е,
возведенное в степень х
int (х) Возвращает целую часть числа х
Log (х) Возвращает натуральный логарифм числа х
Таблица П4.33 (окончание)
Функция
Описание
Rnd[(x)]
Round(x [, numdecimal],
Sgn(x)
Sin(x)
Sqr (x)
Tan(x)
Возвращает случайное число от 0 до 1
Возвращает результат округления числа х с
точностью до numdecimal знаков после запятой
Знаковая функция числа х
Возвращает синус числа х
Вычисляет квадратный корень из числа х и
возвращает полученное значение
Возвращает тангенс числа х
Символьные функции
Наиболее часто используемые функции, с помощью которых можно
производить различные операции над символьными строками, описаны в табл. П4.34.
Таблица П4.34. Символьные функции
Функция
Описание
Asc(str)
Chr(code)
InStr([start,] strl,
str2[, compare])
InStrRev(strl, str2[,
start[, compare]] )
Join(list[, delim])
LCase(str)
Возвращает ASCII-код первого символа в строке str
Возвращает символ с ASCII-кодом code
Возвращает индекс символа, с которого начинается
первое вхождение подстроки str2 в строку strl.
Параметр start задает номер символа, с которого
следует начинать поиск. Если этот параметр не
задан, то поиск выполняется с начала строки. Поиск
производится слева направо. Параметр compare
задает режим сравнения при обработке строк (о —
двоичное сравнение, 1 — текстовое сравнение)
То же самое, что функция InStr, но поиск
осуществляется справа налево, т. е. возвращается номер
последнего символа, с которого начинается вхождение
подстроки str2 в строку strl
Возвращает строку, полученную в результате
конкатенации подстрок, содержащихся в массиве list.
Параметр delim задает символ, разделяющий
подстроки (по умолчанию таким символом является
пробел)
Возвращает строку, в которой все алфавитные
символы преобразованы к нижнему регистру
Таблица П4.34 (окончание)
Функция
Описание
Left(str, len)
Len(str)
LTrim(str),
RTrim(str), Trim(str)
Mid(str, start[,
len])
Replace(expr, find,
replacewith[, start[,
count[, compare]]])
Right(str, len)
Space(x)
Split(Expr[, delim[,
count[, compare]]])
StrComp(strJ, str2[,
compare])
String(number, char)
UCase(str)
Возвращает len символов с начала строки str
Возвращает число символов в строке str
Удаляет из строки str начальные, конечные или и те
и другие пробелы соответственно
Возвращает из строки str подстроку, которая
начинается с позиции start и имеет длину Jen. Если
параметр length не указан, то возвращаются все
символы, начиная с позиции start до конца строки str
Возвращает строку, которая получается из строки
expr путем замен входящих в нее подстрок find на
подстроки replacewith. Параметр count
определяет число подстрок, которые будут обработаны таким
образом (по умолчанию производятся все возможные
замены). Параметр compare задает режим сравнения
при работе со строками (О — двоичное сравнение, 1 —
текстовое сравнение)
Возвращает Jen символов с конца строки str
Возвращает строку, состоящую из х пробелов
Возвращает массив строк, полученных в результате
разбиения строки Expr на подстроки. Параметр
delim задает символ, разделяющий подстроки (по
умолчанию таким символом является пробел).
Параметр count определяет число подстрок, которые
будут обработаны таким образом (по умолчанию в
массив записываются все подстроки). Параметр compare
задает режим сравнения при работе со строками (о —
двоичное сравнение, 1 — текстовое сравнение)
Возвращает число— результат сравнения строк str J
и str2. Если strJ<str2, то возвращается -1; если
strJ=str2, то возвращается 0; если strJ>str2, то
возвращается 1. Параметр compare задает режим
сравнения при работе со строками (о — двоичное
сравнение, 1 — текстовое сравнение)
Возвращает строку, состоящую из number символов
char
Возвращает строку, в которой все алфавитные
символы преобразованы к верхнему регистру
Функции для работы с датой и временем
Для работы с датой и временем в VBScript имеется большой набор функций,
основные из которых приведены в табл. П4.35.
Таблица П4.35. Функции для работы с датой и временем
Функция
Описание
Date
DateAdd(interval, number,
date)
DateDiff(interval,
datel, date2[,
firstdayofweek[,
firstweekofyear] ] )
DatePart{interval, date
[, firstdayofweek[,
firstweekofyear]] )
DateSerial{year, month,
day)
DateValue(date)
Hour(time)
IsDate(expr)
Minute(time)
Возвращает текущую системную дату
Возвращает дату, отстоящую от даты date на
number интервалов, заданных параметром
interval, который может принимать следующие
значения: уууу — год, q — квартал, m — месяц, у —
день года, d — день, w — неделя, ww — неделя года,
h — час, m — минута, s — секунда
Возвращает разницу в интервалах interval
(возможные значения этого параметра те же, что и
в функции DateAdd) между датами datel и
date2. Параметр firs tdayofweek— это
константа, показывающая, какой из дней недели следует
считать первым (см. табл. П4.22, П4.23). Параметр
firstweekofyear— это константа,
показывающая, какую неделю следует считать первой в году
(см. табл. П4.23).
Возвращает ту часть даты date, которая
соответствует параметру interval. Значения параметров
interval, firstdayofweekи firstweekofyear
здесь те же, что и в функции DateDif f
Возвращает переменную подтипа Date, которая
соответствует указанным году (параметр year),
месяцу (параметр month) и дню (параметр day)
Возвращает переменную Variant подтипа Date,
которая соответствует дате, заданной символьным
параметром date
Выделяет номер часа из даты или момента
времени, заданных параметром time. Возвращает
целое число от 0 до 23
Возвращает True, если параметр ехрг задает
корректную дату, и False в противном случае
Выделяет количество минут из даты или момента
времени, заданных параметром time. Возвращает
целое число от 0 до 59
Таблица П4.35 (окончание)
Функция
Описание
Month(date)
MonthName(топth[, abbr]
Now
Time
Timer
TimeSerial{hour, minute,
second)
TimeValue(time)
Weekday(date[, firstday-
ofweek] ) •
WeekdayName(weekday [,
abbr [, firstdayof-
week]])
Year(date)
Выделяет номер месяца из даты, заданной
параметром date. Возвращает целое число от 1 до 12
Возвращает наименование для месяца с номером
month. Если логический параметр abbr равен
True, то наименование месяца представляется в
виде аббревиатуры, в противном случае — в
полном виде
Возвращает текущие дату и время в виде,
соответствующем региональным настройкам Windows
Возвращает текущее системное время
Возвращает количество секунд, прошедших с
полуночи
Возвращает переменную подтипа Date, которая
соответствует указанным часу (параметр hour),
минуте (параметр minute) и секунде (параметр
second)
Возвращает переменную подтипа Date, которая
соответствует времени, заданному символьным
параметром time
Возвращает целое число — день недели для даты,
заданной параметром date. Параметр
firstday of week— это константа, показывающая,
какой из дней недели следует считать первым (см.
табл. П4.23)
Возвращает наименование для дня недели с
порядковым номером weekday. Если логический
параметр abbr равен True, то наименование дня
недели представляется в виде аббревиатуры,
в противном случае — в полном виде. Значение
параметра firstdayofweek здесь то же, что и
в функции Weekday
Выделяет год из даты, заданной параметром date,
и возвращает это целое число
Функции для работы с массивами
В табл. П4.36 приведены функции, с помощью которых можно создавать
новые массивы и получать сведения об уже имеющихся.
Таблица П4.36. Функции для работы с массивами
Функция
Описание
Array (arglist)
Is Array (varname)
LBound(arrayname[,
dimension])
UBound(arrayname[,
dimension])
Возвращает значение типа Variant, которое является
массивом, составленным из элементов списка
arglist. Отдельные элементы в arglist должны быть
отделены друг от друга запятой
Возвращает True, если переменная varname является
массивом, и False в противном случае
Возвращает наименьшее значение, которое может
принимать индекс в массиве arrayname. Числовой
параметр dimension определяет номер индекса в
многомерном массиве, для которого ищется это
наименьшее значение. По умолчанию dimension равен 1
Возвращает наибольшее значение, которое может
принимать индекс в массиве arrayname. Числовой
параметр dimension определяет номер индекса в
многомерном массиве, для которого ищется это наибольшее
значение. По умолчанию dimension равен 1
Функции для работы с подтипами данных
При рассмотрении подтипов данных мы уже описывали функции
конвертации, которые применяются для преобразования переменной к тому или
иному подтипу (см. табл. П4.20).
В табл. П4.37 приведены функции, с помощью которых можно узнать, к
какому подтипу принадлежит заданная переменная.
Таблица П4.37. Функции для работы с подтипами данных
Функция
Описание
IsArray(expr)
IsDate(expr)
IsEmpty(expr)
IsNull(expr)
IsNumeric(expr)
Возвращает True, если параметр expr является
массивом, и False в противном случае
Возвращает True, если параметр expr задает
корректную дату (т. е. переменная expr является переменной
подтипа Date), и False в противном случае
Возвращает True, если переменная expr объявлена, но
не инициализирована
Возвращает True, если переменная expr не содержит
никаких корректных данных.
Возвращает True, если выражение expr может быть
рассмотрено в качестве числа, и False в противном случае
Таблица П4.37 (окончание)
Функция
Описание
Is Obj ее t(ехрг)
VarType(varname)
Возвращает True, если переменная ехрг является
указателем на внешний объект, и False в противном случае
Возвращает числовое значение, соответствующее
подтипу переменной varname (см. табл. П4.27)
Прочие функции
Опишем еще несколько часто используемых функций (табл. П4.38).
Таблица П4.38. Некоторые прочие функции
Функция
Описание
CreateObject
(servername. typename[,
location])
GetOhject([pathname] [,
classname])
Hex(number)
InputВox(prompt[,
title] [, default]
[, xpos] [,ypos] [,
helpfile, context])
Создает экземпляр объекта-сервера
автоматизации и возвращает ссылку на него. Здесь
servernam — имя приложения, являющегося
сервером, typename — тип или класс
создаваемого объекта, location— сетевое имя компьютера,
на котором будет создан объект
Возвращает ссылку на объект класса classname,
который хранится в отдельном файле, путь к
которому задается параметром pathname
Возвращает шестнадцатеричное представление
(в символьном виде) числа number
Выводит на экран диалоговое окно со строкой
ввода и кнопками ОК, Отмена и возвращает
введенную в этом окне символьную строку. Параметр
prompt задает сообщение, которое печатается
перед строкой ввода, title определяет заголовок
диалогового окна, default— значение, которое
выводится по умолчанию в строку ввода.
Параметры xpos и ypos определяют координаты левого
верхнего угла окна.
В случае необходимости элементам диалогового
окна можно сопоставить контекстно-зависимую
помощь. Параметр helpfile задает путь к файлу
помощи, а число context— идентификатор
содержания помощи
Таблица П4.38 (окончание)
Функция Описание
MsgBox(prompt [, buttons] Выводит на экран диалоговое окно с сообщением
[, title] [, helpfile, и различными кнопками и возвращает результат
context] ) нажатия на одну из кнопок (возможные варианты
возвращаемых функцией значений приведены в
табл. П4.26). Параметр prompt задает сообщение,
title определяет заголовок диалогового окна.
Числовой параметр buttons определяет, какие
именно кнопки должны быть представлены в окне
(возможные значения этого параметра
приведены в табл. П4.25). Параметр helpfile и
context имеют то же значение, что и в функции
InputBox
ОсЬ(пияюег) Возвращает восьмеричное представление (в
символьном виде) числа number
Функции и процедуры пользователя
Для определения процедуры, т. е. подпрограммы, которая не возвращает
никакого значения, в VBScript используется конструкция sub ... End sub.
После названия процедуры в круглых скобках указывается список ее
параметров, например:
Sub MyProcedure(Paraml, Param2)
Dim Sum
Sum = Paraml+Param2
End Sub
Если процедура не имеет параметров, то в скобках после имени ничего
указывать не нужно:
Sub MyProcedure()
End Sub
Вызывать процедуру из сценария можно двумя способами. Во-первых,
можно просто написать имя нужной процедуры и указать через пробел список
передаваемых параметров, например:
MyProcedure 3,10
Во-вторых, можно использовать специальный оператор call, при этом
список параметров обязательно должен быть заключен в круглые скобки:
Call MyProcedure(3,10)
Для определения функции, т. е. подпрограммы, которая возвращает
определенное Значение, Применяется КОНСТРУКЦИЯ Function ... End Function.
Как и при описании процедур, после названия функции в круглых скобках
указывается список ее параметров, например:
Function MyFunction(Paraml, Param2)
End Function
Для того чтобы возвратить из функции какое-либо значение, нужно внутри
функции присвоить это значение переменной, название которой совпадает
с именем функции:
Function MyFunction(Paraml, Param2)
Dim Sum
Sum = Paraml+Param2
MyFunction = Sum
End Function
Если возвращаемое функцией значение не нужно присваивать никакой
переменной, то функция вызывается так же, как и процедура — пишется имя
этой функции и через пробел указывается список ее аргументов:
MyFunction 3,5
Если же необходимо записать значение функции в какую-либо переменную,
то аргументы функции заключаются в круглые скобки:
Dim a
а = MyFunction(3,5)
Приложение 5
Описание прилагаемого
компакт-диска
Большинство примеров сценариев WMI и командных файлов WMIC,
которые приведены в данной книге, можно загрузить с прилагаемого компакт-
диска. Примеры находятся в папках, названных в соответствии с
нумерацией глав, к которым они относятся: \Chapter3, \Chapter4, ..., \Chapter7 (см.
табл. П5.1).
Таблица /75.1. Структура компакт-диска
Папка
Содержание
\Chapter3 Примеры командных файлов WMIC, MOF-файлы с описанием новых
псевдонимов, XSL-файл с описанием нового формата вывода
\Chapter4 VBScript- и JScript-сценарии, которые иллюстрируют использование
стандартных объектов WSH 5.6 и объекта FileSystemObject.
Сценарии WMI для просмотра информации о пространствах имен и
классах CIM
\Chapter5 Примеры основных типов сценариев WMI
\Chapter6 Типичные администраторские сценарии WMI для управления
компьютером, анализа системной информации, манипулирования реестром,
журналами событий, процессами и службами, мониторинга состояния
операционной системы и т. д.
\Chapter7 WMI-утилита Sample_WMI_Tool.vbs для администрирования рабочих
станций и сценарий Invent.hta для централизованного проведения
инвентаризации оборудования
Для использования примеров нужно скопировать соответствующий каталог
с компакт-диска на жесткий диск, после чего можно просматривать,
редактировать и запускать нужные сценарии.
Замечание
э
Перед запуском сценария Invent.hta из папки \Chapter7 требуется
предварительно настроить источник данных ODBC с именем invent (см. главу 7).
Список литературы
1. Borge S. Managing Enterprise Systems with the Windows script Host. —
APress, 2001. - 950 p.
2. Lissoir A. Advanced WMI Scripting With Windows and Exchange.. — Digital
Equiment Corp., 2003. - 400 p.
3. Meggitt A., Lavy M. M. Windows Management Instrumentation (WMI). —
New Riders Publishing, 2001. — 432 p.
4. Microsoft Windows 2000 Scripting Guide. — Microsoft Press, 2003. —
1328 p.
5. Policht M. WMI Essentials for Automating Windows Management. — SAMS,
2001.-624 p.
6. Tunstall G., Cole G. Developing WMI Solutions: A Guide to Windows
Management Instrumentation. — Addison-wesley, 2002. — 816 p.
7. Андерсон К. Сценарии Windows и управление системой // Windows & .Net
Magazine/RE. 2002. №5. (http://www.osp.ru/win2000/2002/05/053.htm)
8. Андерсон К. Сценарии WMI для начинающих// Windows & .Net
Magazine/RE. 2001. №5. (http://www.osp.ru/win2000/2001/05/070.htm)
9. Виланский Э. Командная строка WMIC // Windows & .Net Magazine/RE.
2002. №5. (http://www.osp.ru/win2000/programme/6prg05.htm)
10. Внутри Windows Management Interface // Windows & .Net Magazine/RE.
2000. №3. (http://www.osp.ru/win2000/2000/03/032.htm)
11. Мар-Элиа Д. Дополнительные рычаги управления Windows 2000 //
Windows & .Net Magazine/RE. 2000. №5. (http://www.osp.ru/win2000/
2000/05/009.htm)
12. Попов A. B. Windows Script Host для Windows 2000/XP. - СПб.: БХВ-
Петербург, 2003. - 640 с.
13. Попов А. В. Командные файлы и сценарии Windows Script Host. — СПб.:
БХВ-Петербург, 2002. - 320 с.
14. Рот Э. Создание сценариев с помощью WMI // Windows & .Net Magazine/RE.
2003. №6. (http://www.osp.ru/win2000/programme/ 200306pr266.htm)
15. Саной Д. Надежный способ запуска сценариев регистрации //
Windows & .Net Magazine/RE. 2002. №12. (http://www.osp.ru/win2000/
programme/ 200212prl20.htm)
16. Уэллс Б. WMI-моникеры // Windows & .Net Magazine/RE. 2001. №10.
(http://www.osp.ru/win2000/worknt/701.htm)
17. Уэллс Б. Инструменты управления Windows: помощник системного
администратора // Windows & .Net Magazine/RE. 2000. №6. (http://www.osp.ru/
win2000/2000/06/073.htm)
18. Уэллс Б. Удаленное администрирование с помощью WMI // Windows & .Net
Magazine/RE. 2003. №4. (http://www.osp.ru/win2000/2003/02/016.htm)
19. Экк Т. Сценарии ADSI для системного администрирования Windows NT/2000:
Пер. с англ. - М. - СПб. - К.: Вильяме, 2000. - 576 с.
Ссылки на ресурсы Internet
Сайты компании Microsoft
Адрес Описание
http://msdn.microsoftxom/msdnmag/default.asp
http://msdn.microsoft.com/library/
default.asp?url=/library/
en-us/dnclinic/html/vbsvjs.asp
http://communities.msn.com/windowsscript/
http://www.microsoft.com/technet/columns/
scripts/default.asp
http://www.microsoft.com/technet/scriptcenter/
default.asp
http://msdn.microsoft.com/scripting/
http://msdn.microsoft.com/developer/default.htm
Журнал "MSDN Magazine".
Публикуются статьи по различным технологиям
Microsoft
"MSDN Online Voices". Здесь находятся
статьи разработчика компании
Microsoft Эндрю Клиника (Andrew Clinick),
посвященные сценариям WSH
Документация, статьи, примеры
сценариев, ответы на часто задаваемые
вопросы (Frequently Asked Questions, FAQ)
Рубрика "Tales from the Script", в
которой публикуются статьи о сценариях
WSH, WMI и ADSI
Сайт TechNet Script Center содержит
электронную версию книги
"Windows 2000 Scripting Guide",
большое количество примеров сценариев
WMI, ответы на часто задаваемые
вопросы
Сайт Microsoft Windows Script
Technologies, посвященный ActiveX-
сценариям. Отсюда можно скачать
последнюю версию WSH,
документацию по WSH, JScript, VBScript,
отладчики сценариев
Электронная библиотека MSDN
(Microsoft Developer Network) содержит
подробную информацию об объектах
автоматизации, которые может
использовать WSH, в том числе об
объектах ADO, ADSI и WMI
Другие сайты
Адрес
Описание
http://scripting.winguides.com/
http://www.winscripter.com/
http://www.activestate.com
http://www.ddj.com/topics/altlang/
http://www.win32scripting.com/
Документация и примеры сценариев JScript и
VBScript
Статьи, примеры сценариев, ссылки на сайты
схожей тематики
Модули для WSH, поддерживающие языки Active
Perl, Active Python, Active XSLT
Журнал "Dr. Dobb's Journal", раздел "Scripting and
Alternative Languages Discussion Forum",
посвященный языкам сценариев
Журнал "Windows Scripting Solutions".
Освещаются различные аспекты использования сценариев
и командных файлов в Windows
Телеконференции
Адрес
Описание
microsoft.public.Win32.programmer.wmi Телеконференция Microsoft, посвященная
WMI
microsoft.public. scripting, wsh
Телеконференция Microsoft, посвященная
WSH
Предметный указатель
А
Access Control Entry. См. Запись
таблицы контроля доступа
Access Control List. См. Таблица
контроля доступа
АСЕ. См. Запись таблицы
контроля доступа
ACL. См. Таблица контроля доступа
ADSI-технология 570
связывание 571, 572
с
CIM. См. Common Information Model
CIM Object Manager. См. Common
Information Model: менеджер
объектов CIM
CIM object path. См. Путь
к объекту CIM
CI MOM. См. Common Information
Model: менеджер объектов CIM
Common Information Model 5
класс CIM 12
менеджер объектов CIM 11
пространство имен CIM 13
репозиторий CIM 12
cscript.exe 247
D
DCOM Impersonation Levels. См.
Уровни олицетворения протокола
DCOM
J
JScript:
Escape-последовательности 674
false 675
null 675
true 675
undefined 675
ключевые слова 672
коллекции 692
комментарии 671
массивы 687
математические вычисления 694
методы 674
обработка исключительных
ситуаций 683
объект 674
Array 687
Date 689
Enumerator 692
Math 694
String 695
оператор:
break 682
continue 682
бинарный 676
логический 676
отношения 677
присваивания 677
сдвига 676
унарный 675
условный 678
переменные 672
(окончание рубрики на стр. 728)
Jscript (окончание):
свойства 674
текстовые строки 674, 695
типы данных 673
функции встроенные 685
функции пользователя 686
цикл:
do while 681
for 679
for in 680
while 680
M
Managed Object Format 16, 105, 111
Management applications. См.
Управляющие программы
Microsoft Script Debugger 664
Managed resources. См.
Управляемые ресурсы
MOF. См. Managed Object Format
MOF Compiler Wizard 111
MOF Generator Wizard 105
Mofcomp.exe 136
o,p
ODBC-адаптер WMI 647
Primalscript редактор 655
s
SD. См. Дескриптор безопасности
Security Descriptor. См. Дескриптор
безопасности
Security IDentifier. См.
Идентификатор безопасности
SID. См. Идентификатор
безопасности
V
VBScript:
комментарии 698
константы 700
массивы 704
обработка исключительных
ситуаций 711
операторы
арифметические 705
логические 706
отношения 705
условные 706
переменные 698
подтипы данных 699
процедуры пользователя 719
функции:
для работы с датой и
временем 715
для работы с массивами 716
для работы с подтипами
данных 717
математические 712
пользователя 719
символьные 713
цикл:
Do Loop 710
For Next 708
For Each Next 708
While Wend 709
w
WBEM 5. Cm. Web-Based Enterprise
Management
wbemcntl.exe 41
wbemtest.exe 52
Web-Based Enterprise Management 5
Windows Management
Instrumentation 1
провайдеры WMI 9
ядро WMI 7
Windows Script Host 245
WMI Command-line 149
интерактивный режим работы 149
пакетный режим работы 150, 224
псевдонимы 155
роли 155
форматы вывода 196
WMI Control. См. Элемент
управления WMI
WMI event consumers. См.
Потребители событий WMI
WMI event providers. См.
Провайдеры событий WMI
WMI infrastructure. См. Windows
Management Instrumentation: ядро
WMI
WMI providers. См. Windows
Management Instrumentation:
провайдеры WMI
WMI Query Language 639
AND 639
ASSOCIATORS OF 639, 641
CLASS 639
FALSE 640
FROM 639
GROUP 639
HAVING 639, 645
IS 639
ISA 639, 644, 645
A
Административные утилиты WMI 79
WMI CIM Studio 79, 84
WMI Event Registration
Tool 80, 126
WMI Event Viewer 80, 142
WMI Object Browser 80, 114
Б
Библиотека поддержки
сценариев WMI 385
Безопасность WMI:
на уровне операционной
системы 36
на уровне пространств имен 37
на уровне протокола DCOM 39
Библиотека поддержки
сценариев WMI:
объект SWbemEventSource 388
LIKE 640
NOT 640
NULL 640
OR 640
PREFERENCES OF 640
REFERENCES OF 643
SELECT 640, 641
TRUE 640
WHERE 640
WITHIN 640, 644
WMI Scripting Library. См.
Библиотека поддержки сценариев
WMI
WMI Tools. См. Административные
утилиты WMI
WMIC. См. WMI Command-line
wmic.exe 155
wmimgmt.msc 41
WQL. Cm. WMI Query Language
wscript.exe 248
WSH. Cm. Windows Script Host
объект SWbem Last Error 387
объект SWbem Locator 386, 388
объект SWbemMethod 386
объект SWbemMethodSet 386
объект SWbemnamedValue 387
объект
SWbemNamedValueSet 387
объект SWbemObject 386
объект SWbemObjectPath 387
объект SWbemObjectSet 386
объект SWbemPrivilege 388
объект SWbemPrivilegeSet 387
объект SWbemProperty 387
объект SWbemPropertySet 387
объект SWbemQualifier 387
объект
SWbemQualifierSet 387
объект SWbemsecurity 387
объект SWbemServices 386
объект SWbemSink 388
Библиотека типов объекта 281
Г
Глобальные параметры WMIC:
/APPEND 170
/AUTHLEVEL 166
/IMPLEVEL 166
/INTERACTIVE 171
/LOCALE 167
/NAMESPACE 165
/NODE 165
/OUTPUT 170
/PASSWORD 172
/PRIVILEGES 167
/RECORD 167
/ROLE 165
/TRACE 167
/USER 172
Д,з,и
Дескриптор безопасности 37
Запись таблицы контроля
доступа 37
Идентификатор безопасности 37
к
Квалификатор:
класса 27
метода 29
свойства 28
Классы CIM:
ActiveScriptEventConsumer 135
CIM_DataFile 13
CmdTriggerConsumer 135
CommandLineEventConsumer 135
EventViewerConsumer 135
LogFileEventConsumer 135
NTEventLogEventConsLimer 135
ScriptingStandardConsumer-
Setting 135
SMTPEventConsumer 135
Win32_Base Board 13
Win32_BIOS 13
Win32_Bus 13
Win32_Desktop 14
Win32_Directory 14
Win32_DiskPartition 13
Win32_Floppy Drive 13
Win32_Keyboard 13
Win32_OperatingSystem 13
Win32_ Process 14
Win32_Processor 13
Win32_Service 14
Win32_Share 14
абстрактные 16
ассоциативные 17
динамические 17
модели расширения 18
общей модели 17
основной модели 17
системные 17
статические 17
Команды WMIC:
CLASS 163
EXIT 164
PATH 164
QUIT 164
м
Метод класса 24
Моникер WMI 392
О
Объекты WSH
WScript 250
WshArguments 250
WslrControllei-251
WshEnvironment 251
WshNamed 250
WshNetwork251
Wsh Remote 251
WshRemoteError 251
WshScriptExec 251
WshShell 250
WshShortcut 251
WshSpecialFolders 251
WshUnnamed 250
WshUrlShortcut 251
Операторы WMIC:
ASSOC 180
CALL 182
CREATE 185
DELETE 187
GET 187
LIST 194
SET 186
П
Параметры команд WMIC:
ALL 190
EVERY 193
FORMAT 191
REPEAT 194
TRANSLATE 193
VALUE 190
Потребители событий WMI 31
временные 33
постоянные 34, 135
Провайдеры событий WMI 31
Профиль пользователя 580, 287,
254,261 284,291,294
Псевдонимы WMIC
ALIAS 173
BASEBOARD 173
BIOS 173
BOOTCONFIG 173
CDROM 173
COMPUTERSYSTEM 173
CPU 173
CS PRODUCT 173
DATAFILE 174
DCOMAPP 174
DESKTOP 174
DESKTOPMONITOR 174
DEVICEMEMORYADDRESS 174
DISKDRIVE 174
DISKQUOTA 174
DMACHANNEL 174
ENVIRONMENT 174
FSDIR 174
GROUP 174
IDECONTROLLER 174
IRQ 174
JOB 174
LOADORDER 174
LOGICALDISK 174
LOGON 175
MEMCACHE 175
MEMLOGICAL 175
MEMPHYSICAL 175
NETCLIENT 175
NETLOGIN 175
NETPROTOCOL 175
NETUSE 175
NIC 175
NICCONFIG 175
NTDOMAIN 175
NTEVENT 175
NTEVENTLOG 175
ONBOARDDEVICE 175
OS 175
PAGEFILE 175
PAGEFILESET 176
PARTITION 176
PORT 176
PORTCONN ECTOR 176
PRINTER 176
PRINTERCONFIG 176
PRINTERJOB 176
PROCESS 176
PRODUCT 176
QFE 176
QUOTASETTING 176
RECOVEROS 176
REGISTRY 176
SCSICONTROLLER 176
SERVER 176
SERVICE 176
SOFTWAREELEMENT 177
SOFTWAREFEATURE 177
SOUNDDEV 177
STARTUP 177
SYSACCOUNT 177
SYSDRIVER 177
SYSTEMENCLOSURE 177
SYSTEM LOT 177
TAPEDRIVE 177
TEMPERATURE 177
TIMEZONE 177
UPS 177
USERACCOUNT 177
VOLTAGE 177
VOLUMEQUOTASETTING 178
WMISET 178
Путь к объекту CIM 15
P
Режимы выполнения
методов WMI:
асинхронный 397
полусинхронный 397
синхронный 397
с
Свойство класса 18
Служба каталога 570
События WMI 30
внешние 32
внутренние 31
таймера абсолютного типа 130
таймера интервального типа 131
фильтр событий 34, 133
Схема CIM. См. Common
Information Model
Сценарий:
WSH 246, 247
отладка 664
включения 581
входа 581, 585
выключения 581, 583
выхода 581, 585
т
Таблица контроля доступа 37
Тестер WMI 52
Типы сценариев WMI:
вызов методов объекта 421
изменение свойств объекта 420
чтение свойств объекта 416
получение экземпляров
управляемых ресурсов 398
создание временного
потребителя событий 435
создание нового экземпляра
управляемого ресурса 428
создание постоянного
потребителя событий 445
удаление экземпляра
управляемого ресурса 429
у
Управляемые ресурсы 7
Управляющие программы 7
Уровни олицетворения протокола
DCOM 39
Ф
Файлы:
js 246
.vbs 246
э
Элемент управления WMI 41