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

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

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

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

Внимание!

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

CommandLineEventConsumer нельзя использовать для запуска интерактивного процесса.

 

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

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

  1. В MOF-файле создайте экземпляр CommandLineEventConsumer для получения событий, запрашиваемых в запросе. Дополнительные сведения см. в разделе Designing Managed Object Format (MOF) Classes.
  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.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";
};

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