Поделиться через


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

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

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

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

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

Внимание

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

 

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

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

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

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

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

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

    Текст скрипта можно поместить в ScriptText или указать путь и имя файла скрипта в ScriptFileName. Дополнительные сведения см. в разделе "Проектирование классов управляемого объекта (MOF).

  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 filename**.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 filename**.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;
};

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