Выполнение скрипта на основе события

Стандартный потребитель, реализованный классом ActiveScriptEventConsumer , позволяет компьютеру выполнять скрипт и предпринимать действия при возникновении важных событий, чтобы компьютер автоматически обнаруживал и устранял проблемы.

Этот потребитель загружается по умолчанию в пространство имен root\subscription .

Вы можете настроить производительность всех экземпляров ActiveScriptEventConsumer в системе, задав значения свойства Timeout или MaximumScripts в одном экземпляре ScriptingStandardConsumerSetting.

Базовая процедура использования стандартных потребителей всегда одинакова и находится в разделе Мониторинг и реагирование на события с помощью стандартных потребителей. Следующая процедура, которая добавляется к базовой процедуре, связана с классом ActiveScriptEventConsumer и описывает, как создать объект-получатель события, запускающий скрипт.

Внимание!

Класс ActiveScriptEventConsumer имеет специальные ограничения безопасности. Этот стандартный потребитель должен быть настроен локальным членом группы администраторов на локальном компьютере. Если для создания подписки используется учетная запись домена, учетная запись LocalSystem должна иметь необходимые разрешения в домене, чтобы убедиться, что создатель является членом локальной группы администраторов.

 

В следующей процедуре описывается создание потребителя события, выполняющего скрипт.

Создание потребителя событий, выполняющего скрипт

  1. Напишите скрипт для выполнения при возникновении события.

    Вы можете написать скрипт на любом языке, но убедитесь, что на компьютере установлен обработчик сценариев для выбранного языка. Скрипту не нужно использовать объекты скриптов WMI.

    Только администратор может настроить потребителя скрипта, и сценарий выполняется с учетными данными LocalSystem, что предоставляет потребителю широкие возможности, за исключением доступа к сети. Однако скрипт не имеет доступа к определенным данным входа пользователя, например к переменным среды и сетевым папкам.

  2. В MOF-файле создайте экземпляр ActiveScriptEventConsumer для получения событий, запрашиваемых в запросе.

    Вы можете поместить текст скрипта в ScriptText или указать путь и имя файла скрипта в разделе ScriptFileName. Дополнительные сведения см. в разделе Designing Managed Object Format (MOF) Classes.

  3. Создайте экземпляр __EventFilter, присвойте ему имя, а затем создайте запрос, чтобы указать тип события, которое запускает выполнение скрипта.

    Дополнительные сведения см. в разделе Запросы с помощью WQL.

  4. Создайте экземпляр __FilterToConsumerBinding , чтобы связать фильтр с экземпляром ActiveScriptEventConsumer.

  5. Скомпилируйте MOF-файл с помощью Mofcomp.exe.

В примерах в следующем разделе показаны два способа реализации сценария, управляемого событиями. В первом примере используется скрипт, определенный во внешнем файле, а во втором — скрипт, встроенный в MOF-код. Примеры приведены в MOF-коде, но экземпляры можно создать программным способом с помощью API скриптов для WMI или COM API для WMI.

Пример использования внешнего скрипта

В следующей процедуре описывается использование примера внешнего скрипта.

Использование примера внешнего скрипта

  1. Создайте файл с именем c:\Asec.vbs, а затем скопируйте в него скрипт из этого примера.

  2. Скопируйте список MOF в текстовый файл и сохраните его с расширением MOF.

  3. В окне командной строки скомпилируйте MOF-файл с помощью следующей команды.

    Имя файлаMofcomp**.mof**

  4. Запустите калькулятор, который создает calc.exe процесс. Подождите более пяти секунд, закройте окно Калькулятор, а затем найдите C:\ каталог для файла с именем ASEC.log.

    Следующий текст аналогичен тексту, который будет содержаться в файле ASEC.log.

    Time: 12/31/2002 2:56:33 PM; Entry made by: ASEC
    Application closed. UserModeTime:  1562500; 
    KernelModeTime: 3125000 [hundreds of nanoseconds]
    

В следующем примере кода VBScript показан скрипт, который вызывается при получении события постоянным потребителем. Объект TargetEvent является экземпляром __InstanceDeletionEvent , поэтому у него есть свойство с именем TargetInstance, которое является экземпляром Win32_Process , используемым для запуска события. Класс Win32_Process имеет свойства UserModeTime и KernelModeTime , которые помещаются в файл журнала, созданный скриптом.

' asec.vbs script
Dim objFS, objFile
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile = objFS.OpenTextFile("C:\ASEC.log", 8, true)
objFile.WriteLine "Time: " & Now & "; Entry made by: ASEC"

objFile.WriteLine "Application closed. UserModeTime:  " & _
    TargetEvent.TargetInstance.UserModeTime & _
    "; KernelModeTime: " & _
    TargetEvent.TargetInstance.KernelModeTime & _
    " [hundreds of nanoseconds]"
objFile.Close

Следующий пример кода MOF вызывает скрипт при получении события. Он создает фильтр, объект-получатель и привязку между ними в пространстве имен root\subscription .

#pragma namespace ("\\\\.\\root\\subscription")

instance of ActiveScriptEventConsumer as $Cons
{
    Name = "ASEC";
    ScriptingEngine = "VBScript";
    ScriptFileName = "c:\\asec2.vbs";
};

instance of __EventFilter as $Filt
{
    Name = "EF";
    Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 "
        "WHERE TargetInstance ISA \"Win32_Process\" "
        "AND TargetInstance.Name = \"calc.exe\"";
    QueryLanguage = "WQL";
    EventNamespace = "root\\cimv2";
};

instance of __FilterToConsumerBinding
{
    Filter = $Filt;
    Consumer = $Cons;
};

Пример использования встроенного скрипта

В следующей процедуре описывается использование примера встроенного скрипта.

Использование примера встроенного скрипта

  1. Скопируйте список MOF в этом разделе в текстовый файл и сохраните его с расширением MOF.

  2. В окне командной строки скомпилируйте MOF-файл с помощью следующей команды.

    Имя файлаMofcomp**.mof**

В следующем примере кода MOF создаются фильтр, потребитель и привязка между ними, а также содержится встроенный скрипт.

#pragma namespace ("\\\\.\\root\\subscription")

instance of ActiveScriptEventConsumer as $Cons
{
    Name = "ASEC";
    ScriptingEngine = "VBScript";
    
    ScriptText =
        "Dim objFS, objFile\n"
        "Set objFS = CreateObject(\"Scripting.FileSystemObject\")\n"
        "Set objFile = objFS.OpenTextFile(\"C:\\ASEC.log\","
        " 8, true)\nobjFile.WriteLine \"Time: \" & Now & \";"
        " Entry made by: ASEC\"\nobjFile.WriteLine"
        " \"Application closed. UserModeTime:  \" & "
        "TargetEvent.TargetInstance.UserModeTime &_\n"
        "\"; KernelModeTime: \" & "
        "TargetEvent.TargetInstance.KernelModeTime "
        "& \" [hundreds of nanoseconds]\"\n"
        "objFile.Close\n";
};

instance of __EventFilter as $Filt
{
    Name = "EF";
    Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 "
        "WHERE TargetInstance ISA \"Win32_Process\" "
        "AND TargetInstance.Name = \"calc.exe\"";
    QueryLanguage = "WQL";
    EventNamespace = "root\\cimv2";
};

instance of __FilterToConsumerBinding
{
    Filter = $Filt;
    Consumer = $Cons;
};

Мониторинг и реагирование на события с помощью стандартных потребителей