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

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

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

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

Внимание!

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

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

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

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

  1. В файле MOF-файл (MOF) создайте экземпляр коммандлинивентконсумер для получения событий, которые вы запрашиваете в запросе. Дополнительные сведения см. в разделе Конструирование классов MOF-файл (MOF).
  2. Создайте экземпляр _ _ EventFilter и присвойте ему имя.
  3. Создайте запрос для указания типа события. Дополнительные сведения см. в разделе запросы с помощью WQL.
  4. Создайте экземпляр _ _ филтертоконсумербиндинг , чтобы связать фильтр с экземпляром коммандлинивентконсумер.
  5. Скомпилируйте MOF-файл с помощью Mofcomp.exe.

Пример

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

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

Создание нового класса с именем Микмдлинеконсумер

  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";
};

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