040 Системный Администратор 03 2006

Page 10

администрирование Таблица 1. Список основных классов для подписки на внутренние (intrinsic) события WMI Внутренне классы событий

Описание

__ClassCreationEvent

Извещает подписчика о создании нового класса WMI

__ClassDeletionEvent

Извещает подписчика об удалении класса WMI

__ClassModificationEvent

Извещает подписчика об изменении класса WMI

__InstanceCreationEvent

Извещает подписчика о создании экземпляра объекта класса WMI

__InstanceOperationEvent

Извещает подписчика об изменении, удалении или создании экземпляра объекта класса.

__InstanceDeletionEvent

Извещает подписчика об удалении экземпляра объекта класса WMI

__InstanceModificationEvent

Извещает подписчика о модификации экземпляра объекта класса WMI

__NamespaceCreationEvent

Извещает подписчика о создании нового пространства имен WMI

__NamespaceDeletionEvent

Извещает подписчика об удалении пространства имен WMI

__NamespaceModificationEvent

Извещает подписчика об изменении в пространстве имен WMI

__ConsumerFailureEvent

Извещает подписчика о том, что некоторые события не были доставлены подписчику из-за ошибок на стороне подписчика

__EventDroppedEvent

Извещает подписчика о том, что некоторые события не были доставлены до их подписчика

__EventQueueOverflowEvent

Извещает подписчика о том, что некоторые события WMI не были доставлены до подписчика из-за переполнения очереди событий

__MethodInvocationEvent

Извещает подписчика о том, что был выполнен вызов метода WMI. Не поддерживается на Windows NT/2000

вуют и другие специальные классы отслеживания внутренних событий WMI, например: __InstanceDeletionEvent, __InstanceModificationEvent, __InstanceOperationEvent или __ClassCreationEvent, __ClassDeletionEvent и другие. Довольно очевидно из их названия, для отслеживания каких именно внутренних событий WMI эти специальные классы созданы. В таблице 1 перечислены все основные системные классы, обеспечивающие отслеживание внутренних событий WMI. Все они выведены из абстрактного WMI класса __Event. Далее обратим внимание на ключевое слово WITHIN в запросе WQL – в отличие от обычного языка SQL ключевое слово WITHIN в языке WQL определяет интервал опроса приходящих событий в секундах или служит для группировки событий (в сочетании с ключевым словом GROUP) в течение указанного количества секунд. В нашем конкретном случае временный подписчик событий WMI – это объект, который мы получаем в переменную objEvents в результате вызова метода ExecNotificationQuery. Он будет каждые 5 секунд осуществлять проверку всех событий WMI по созданию экземпляров объектов, соответствующих критериям, заданным после ключевого слова WHERE, а именно отслеживать появление новых объектов класса Win32_LogicalDisk, у которых свойство DriveType равно 2. Закончим разбор сценария анализом цикла ожидания событий. Вполне очевидно, что сам по себе цикл бесконечный и условия завершения не имеет. Внутри тела цикла вызывается метод NextEvent нашего экземпляра объекта objEvents – временного подписчика на события WMI.

8

Этот метод возвращает управление VBS-сценарию в тот момент, когда в системе происходит событие WMI, соответствующее условиям, заданным при создании объектаподписчика. Возвращаемый этим методом объект является объектом-описателем происшедшего события и имеет свойства TargetInstance и TIME_CREATED. Свойство TargetInstance содержит не что иное как ссылку на экземпляр объекта, вызвавшего это событие. Теперь необходимо обратить наше пристальное внимание на тот факт, что существуют два типа событий WMI. Внутренние (системные) события WMI и внешние (чуждые). Эти типы событий принципиально отличаются по своему происхождению, обслуживаются разными группами классов WMI и как следствие отличаются по некоторым приемам работы с ними. Все внутренние (intrinsic) классы отслеживания событий WMI выведены непосредственно из абстрактного класса __Event, как я уже упоминал ранее, а вот все внешние (extrinsic) классы событий выведены из класса __ExtrinsicEvent, который уже в свою очередь выведен из класса __Event. По сути дела за генерацию событий, доступ к которым обеспечивают классы внутренних событий, отвечает само ядро службы WMI, а за генерацию событий, доступ к которым обеспечивают классы внешних событий, отвечают уже WMI-провайдеры. Таким образом, если мы хотим отслеживать события WMI, используя внутренние механизмы службы WMI, то мы будем пользоваться универсальными внутренними (intrinsic) классами. Если же интересующий нас WMI-провайдер предоставляет свои собственные (внешние) классы отслеживания событий, то использовать следует именно их, так как они по определению будут работать эффективнее. К сожалению, далеко не все провайдеры предоставляют достаточный набор собственных внешних классов для отслеживания событий. В листинге 3 дан пример использования специального внешнего класса отслеживания событий Win32_ProcessStartTrace провайдера Win32. Также в этом листинге используется пример отслеживания событий таймера с использованием внутренних классов отслеживания событий. Хочу обратить ваше внимание на тот факт, что у всех внутренних классов отслеживания событий существует свойство TargetInstance, но его нет у внешних классов отслеживания событий WMI. Зато, как правило, внешние классы, отслеживающие внешние события WMI, обладают довольно широким дополнительным набором атрибутов, позволяющим легко устанавливать источник этого события. Также надо заметить, что ключевое слово WITHIN языка WQL, позволяющее подписчику устанавливать интервал опроса экземпляров внутренних классов отслеживания событий, не требуется использовать с внешними классами отслеживания событий.

Асинхронная обработка событий WMI в сценариях WSH Вернемся к сравнению синхронного и асинхронного способа обработки событий WMI. Синхронная обработка событий – это когда процесс ожидает события и более ничем не занят. Обычно это ожидание – бесконечный цикл про-


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.