Содержание
Введение
Структура книги
Принятые в книге соглашения
Как связаться с авторами?
Глава 1. Общие сведения о WMI
Установка WMI
Общая структура WMI
Ядро WMI
Менеджер объектов CIM
Репозиторий CIM. Пространства имен
Путь к классам и объектам CIM
Структура классов WMI
Свойства классов WMI
Методы классов WMI
Квалификаторы классов, свойств и методов
Квалификаторы свойств
Квалификаторы методов
События WMI
Внешние события
События таймера
Временные и постоянные потребители событий
Безопасность при работе с WMI
Глава 2. Интерактивная работа с WMI
Запуск элемента управления WMI
Настройка журнала ошибок WMI
Архивирование и восстановление репозитория CIM
Управление безопасностью на уровне пространства имен
Дополнительные возможности элемента управления WMI
Подключение к пространству имен
Смена пространства имен
Редактирование классов и объектов
Просмотр и изменение свойств класса или объекта
Просмотр и изменение методов класса или объекта
Просмотр ассоциативных связей для класса или объекта
Формирование списка классов или объектов
Выполнение методов класса или объекта
Выполнение обычных WQL-запросов
Выполнение запросов для подписки на уведомления о наступлении событий
Подключение к пространству имен WMI
WMI CIM Studio
Поиск класса
Просмотр экземпляров класса
Просмотр и изменение квалификаторов класса или объекта
Просмотр и изменение свойств класса или объекта
Просмотр и изменение методов класса или объекта
Просмотр ассоциативных связей для класса или объекта
Выполнение методов класса
Выполнение WQL-запросов
Генерация MOF-файлов для классов или объектов
Компиляция MOF-файлов
WMI Object Browser
Пример: просмотр информации о жестком диске
WMI Event Registration
Создание событий таймера
Создание фильтров событий
Создание постоянного потребителя событий
Установка связи между фильтром и потребителем событий
WMI Event Viewer
Создание и регистрация потребителя класса EventViewerConsumer
Просмотр информации о возникающих событиях
Запуск WMIC. Использование встроенной справки
Архитектура WMIC
Интерактивная работа с WMIC
Команды WMIC
Команда CLASS
Команда PATH
Команды QUIT и EXIT
Параметр /NAMESPACE
Параметр /ROLE
Параметр /NODE
Параметры /IMPLEVEL и /AUTHLEVEL
Параметр /LOCALE
Параметр /PRIVILEGES
Параметр /TRACE
Параметр /RECORD
Параметры /OUTPUT и /APPEND
Параметр /INTERACTIVE
Параметры /USER и /PASSWORD
Псевдонимы WMIC
Оператор ASSOC
Оператор CALL
Оператор CREATE
Оператор SET
Оператор DELETE
Оператор GET
Оператор LIST
Форматы вывода данных WMIC
Вывод в XML-файл
Вывод в HTML-файл
Вывод в текстовый файл
Вывод в CSV-файл
Примеры команд WMIC
Перезагрузка и выключение компьютера
Вывод информации о BIOS
Просмотр параметров загрузки
Вывод свойств операционной системы
Получение информации о процессоре
Получение информации об оперативной памяти
Вывод и изменение параметров журналов событий Windows
Вывод записей из журналов событий Windows
Получение информации о свойствах и состоянии служб
Запуск и остановка служб
Создание и завершение процессов
Мониторинг информации о процессах
Пакетный режим работы WMIC
Расширение схемы WMIC
Определение новых форматов вывода
Глава 4. Сценарии WSH как средство доступа к WMI
Запуск сценария из командной строки в графическом режиме
Запуск сценария с помощью меню Пуск
Стандартные объекты WSH 5.6
Типичные примеры сценариев WSH
Методы Write и WriteLine объекта WScript.StdOut
Функция MsgBox языка VBScript
Ввод строк текста
Ввод строк в графическом режиме
Получение свойств WSH и запущенного сценария
Работа с параметрами командной строки сценария
Выход из сценария с определенным кодом завершения
Запуск из сценариев внешних программ
Переключение между приложениями, имитация нажатий клавиш
Запуск независимых консольных приложений и команд Windows
Запуск дочерних консольных приложений и команд DOS, использование их входных и выходных потоков
Доступ к специальным папкам Windows XP
Создание ярлыков в специальных папках
Работа с системным реестром Windows
Работа с ресурсами локальной сети
Получение списка подключенных сетевых дисков и принтеров
Подключение и отключение сетевых дисков и принтеров
Выполнение основных операций с файловой системой
Получение сведений о каталоге
Получение сведений о файле
Проверка существования диска, каталога или файла
Получение списка всех имеющихся дисков
Получение списка всех подкаталогов заданного каталога :
Получение списка всех файлов заданного каталога
Создание каталога
Создание текстового файла
Операции чтения и записи строк для текстового файла
Копирование и перемещение файлов и каталогов
Удаление файлов и каталогов
Просмотр информации о пространствах имен и классах CIM
Получение списка всех классов в пространстве имен
Получение списка классов определенного типа
Просмотр сведений о классе
Просмотр методов класса
Просмотр квалификаторов класса
Вывод описания класса в MOF- и XML-файлы
Глава 5. Механизм работы и основные типы сценариев WMI
Соединение с подсистемой WMI
Соединение посредством моникера WMI
Настройки безопасности в моникере
Путь к объекту WMI в моникере
Основные типы сценариев WMI
Получение экземпляров управляемых ресурсов
Полусинхронный режим получения экземпляров
Асинхронный режим получения экземпляров
Чтение свойств объекта WMI
Изменение свойств объекта WMI
Вызов методов объекта WMI
Создание нового экземпляра управляемого ресурса
Удаление экземпляра управляемого ресурса
Создание временных потребителей событий WMI
Подписка на события в полусинхронном режиме
Подписка на события в асинхронном режиме
Создание постоянных потребителей событий WMI
Создание потребителя событий
Установка связи между фильтром и потребителем
Глава 6. Типичные администраторские сценарии WMI
Перезагрузка компьютера
Выключение компьютера
Получение и анализ системной информации
Вывод информации о BIOS
Вывод списка команд, выполняемых при загрузке системы
Вывод свойств операционной системы
Определение номера последнего обновления, установленного на компьютере
Вывод списка установленных программных продуктов
Вывод списка установленных программных продуктов со всеми компонентами
Сбор сведений о подключенных устройствах
Получение информации о процессоре
Получение информации о физической памяти
Получение списка устройств Plug-and-Play
Получение информации о клавиатуре
Получение информации о мыши
Получение информации о параллельных и последовательных портах
Получение информации о звуковой карте
Получение информации о видеокарте
Получение информации о сетевом адаптере
Работа с журналом событий
Резервирование и очистка журналов событий, размер которых превышает заданный
Резервирование журнала событий в файл с именем, содержащим текущую дату
Копирование записей из журнала событий в базу данных
Поиск в журнале всех событий краха системы
Вывод всех событий из определенного журнала
Вывод всех событий за определенную дату
Вывод всех событий с определенным кодом
Вывод свойств определенного журнала событий
Работа с системным реестром
Проверка прав доступа к разделам и параметрам
Чтение подразделов и параметров
Изменение значений параметров
Удаление подразделов и параметров
Управление службами и процессами
Запуск и восстановление работы служб
Изменение пароля учетной записи службы
Создание процессов
Завершение процессов
Получение информации о процессах
Определение владельца процесса
Работа с файловой системой
Получение информации о разделах жесткого диска
Получение информации о логических дисках и папках
Копирование файлов и папок
Удаление файлов и папок
Манипуляции с папками для совместного доступа
Изменение свойств папки для совместного доступа
Определение имени папки на жестком диске для папки совместного доступа
Удаление папки для совместного доступа
Мониторинг состояния системы
Мониторинг создания процессов
Защита от запуска процесса
Мониторинг изменений реестра
Мониторинг изменений файловой системы
Мониторинг журналов событий
Управление учетными записями пользователей и групп
Список всех доступных доменов в локальной сети
Создание пользователя и группы на рабочей станции
Вывод информации о пользователе и смена его пароля
Удаление пользователя и группы на рабочей станции
Список всех групп на рабочей станции
Список всех пользователей в группе
Автоматический запуск сценария на одном компьютере
Сценарии, выполняемые при завершении работы операционной системы
Сценарии входа для всех локальных пользователей
Сценарий выхода для всех локальных пользователей
Сценарий входа для одного пользователя
Запуск сценария на нескольких компьютерах
Задание имен компьютеров в текстовом файле
Выполнение сценария для всех компьютеров в домене
Глава 7. Более сложные сценарии WMI
Разработка HTML-формы для диалогового окна
Вывод HTML-формы из сценария WMI
Сценарий Sample_WMI_Tool.vbs
Сценарий для инвентаризации оборудования на рабочих станциях
НТА-файл для интерфейса сценария
Сценарий Invent.hta
Заключение
Приложение 1. Справочник по языку запросов WQL
Оператор ASSOCIATORS OF
Оператор REFERENCES OF
Запросы к событиям WMI
Подписка на одиночные внутренние события. Ключевые слова WITHIN к ISA
Подписка на групповые события. Ключевые слова GROUP к HAVING
Приложение 2. Работа с ODBC-адаптером WMI
Использование источника данных WM1 в Microsoft Access
Приложение 3. Средства разработки и отладки сценариев WSH
Открытие существующего одиночного сценария
Запуск одиночного сценария
Подписывание сценариев
Возможности пользовательского интерфейса
Другие редакторы
Отладка сценариев в Microsoft Script Debugger
Команды отладчика
Выполнение сценария
Просмотр стека вызовов
Просмотр и изменение значений переменных
Приложение 4. Справочник по языкам VBScript и JScript
Переменные
Типы данных
Текстовые строки
Объекты
Логические данные
Преобразование типов данных
Операторы
Бинарные операторы
Операторы побитовых логических операций и сдвига
Операторы присваивания
Операторы отношения
Условные операторы
Операторы циклов
Оператор break
Оператор continue
Прочие операторы
Обработка исключительных ситуаций
Порядок выполнения операторов
Функции
Функции пользователя
Объект Array
Объект Date
Объект Enumerator
Объект Math
Объект String
Язык VBScript
Переменные
Подтипы данных
Ссылки на объекты
Константы
Массивы
Операторы
Операторы отношения и логические операторы
Условные операторы
Операторы циклов
Прочие операторы
Обработка исключительных ситуаций
Процедуры и функции
Символьные функции
Функции для работы с датой и временем
Функции для работы с массивами
Функции для работы с подтипами данных
Прочие функции
Приложение 5. Описание прилагаемого компакт-диска
Список литературы
Ссылки на ресурсы Internet
Другие сайты
Телеконференции
Предметный указатель
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-обозначения (&it; и &gt; соответственно). Если необходимо выводить именно символы < и > (например, при
формировании выходного XML-файла), то нужно вместе с оператором get использовать параметр /translate со значением basicxml. Например: ENVIRONMENT GET /FORMAT:RAWXML /TRANSLATE:BASICXML Здесь параметр /translate:basicxml указывает на то, что выходной поток символов будет преобразован в соответствии с таблицей basicxml, в которой указывается, что символы &it; должны быть заменены на <, а символы &gt; — На >. Отметим, что на вид выводимых данных влияет порядок следования ключей /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&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN ID="optDomain"> <SELECT STYLE="WIDTH: 150px" NAME="selDomain"> </SELECT> </SPAN> </TD> <TD> MMH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <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> &nbsp; <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> &nbsp;MAC anpec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<INPUT SIZE=17 NAME="txtMAC"><BR> &nbsp;IP anpec&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <INPUT SIZE=17 NAME="txtIP"><BR> &nbsp;Пользователь&nbsp;&nbsp; <INPUT NAME="txtCurrUser" SIZE=17> <BR>&nbsp; </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"> Процессы пользователя &nbsp; <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