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


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

Класс 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";
};

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