Запуск программы из командной строки на основе события

Класс CommandLineEventConsumer запускает указанную исполняемую программу из командной строки при возникновении указанного события. Этот класс является стандартным потребителем событий, который предоставляет WMI.

При использовании CommandLineEventConsumer необходимо защитить исполняемый файл, который требуется запустить. Если исполняемый файл не находится в безопасном расположении или не защищен со строгим списком управления доступом (ACL), пользователь без прав доступа может заменить исполняемый файл другим исполняемым файлом. Классы Win32_LogicalFileSecuritySetting или Win32_LogicalShareSecuritySetting можно использовать для программного изменения безопасности файлов или общего ресурса. Дополнительные сведения см. в разделе "Создание дескриптора безопасности для нового объекта в C++".

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

Внимание!

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

CommandLineEventConsumer нельзя использовать для запуска процесса, который выполняется в интерактивном режиме.

 

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

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

  1. В MOF-файле создайте экземпляр CommandLineEventConsumer для получения событий, запрашиваемых в запросе. Дополнительные сведения см. в разделе "Проектирование классов формата управляемых объектов ( MOF).
  2. Создайте экземпляр __EventFilter и присвойте ему имя.
  3. Создайте запрос, чтобы указать тип события. Дополнительные сведения см. в статье "Запросы с помощью WQL".
  4. Создайте экземпляр __FilterToConsumerBinding , чтобы связать фильтр с экземпляром CommandLineEventConsumer.
  5. Скомпилируйте MOF-файл с помощью Mofcomp.exe.

Пример

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

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

Создание нового класса с именем MyCmdLineConsumer

  1. Создайте файл c:\cmdline_test.bat с помощью команды, которая выполняет видимую программу, например "calc.exe".
  2. Скопируйте MOF-файл в текстовый файл и сохраните его с расширением MOF.
  3. В командном окне скомпилируйте MOF-файл с помощью следующей команды: Mofcomp filename.mof.

Примечание

Программа, указанная в cmdline_test.bat, должна выполняться.

 

// Set the namespace as root\subscription.
// The CommandLineEventConsumer is already compiled
// in the root\subscription namespace. 
#pragma namespace ("\\\\.\\Root\\subscription")

class MyCmdLineConsumer
{
 [key]string Name;
};

// Create an instance of the command line consumer
// and give it the alias $CMDLINECONSUMER

instance of CommandLineEventConsumer as $CMDLINECONSUMER
{
 Name = "CmdLineConsumer_Example";
 CommandLineTemplate = "c:\\cmdline_test.bat";
 RunInteractively = True;
 WorkingDirectory = "c:\\";
};    

// Create an instance of the event filter
// and give it the alias $CMDLINEFILTER
// The filter queries for instance creation event
// for instances of the MyCmdLineConsumer class

instance of __EventFilter as $CMDLINEFILTER
{
    Name = "CmdLineFilter";
    Query = "SELECT * FROM __InstanceCreationEvent"
        " WHERE TargetInstance.__class = \"MyCmdLineConsumer\"";
    QueryLanguage = "WQL";
};

// Create an instance of the binding
// between filter and consumer instances.

instance of __FilterToConsumerBinding
{
     Consumer = $CMDLINECONSUMER;
     Filter = $CMDLINEFILTER;
};

// Create an instance of this class right now. 
// The commands in c:\\cmdline_test.bat execute
// as the result of creating the instance
// of MyCmdLineConsumer.
 
instance of MyCmdLineConsumer
{
     Name = "CmdLineEventConsumer test";
};

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