基于事件从命令行运行程序

CommandLineEventConsumer 类在指定事件发生时从命令行运行指定的可执行程序。 此类是 WMI 提供的标准事件使用者。

使用 CommandLineEventConsumer 时,应保护要启动的可执行文件。 如果可执行文件不在安全位置或不受强大的访问控制列表 (ACL) 的保护,则没有访问权限的用户可以将你的可执行文件替换为其他可执行文件。 可以使用 Win32_LogicalFileSecuritySettingWin32_LogicalShareSecuritySetting 类以编程方式更改文件或共享的安全性。 有关详细信息,请参阅在 C++ 中为新对象创建安全描述符

使用标准使用者的基本过程始终相同,记录在使用标准使用者监视和响应事件中。 以下过程添加到基本过程中,且特定于 CommandLineEventConsumer 类,描述了如何创建运行程序的事件使用者。

注意

CommandLineEventConsumer 类具有特殊的安全限制。 此标准使用者必须由本地计算机上 Administrators 组的本地成员配置。 如果使用域帐户创建订阅,则 LocalSystem 帐户必须对域具有必要的权限,以验证创建者是否是本地 Administrators 组的成员。

CommandLineEventConsumer 不能用于启动交互式运行的进程。

 

以下过程描述了如何创建从命令行运行进程的事件使用者。

创建从命令行运行进程的事件使用者

  1. 在托管对象格式 (MOF) 文件中,创建 CommandLineEventConsumer 的实例以接收在查询中请求的事件。 有关详细信息,请参阅设计托管对象格式 (MOF) 类
  2. 创建 __EventFilter 的实例并为其命名。
  3. 创建查询以指定事件类型。 有关详细信息,请参阅使用 WQL 进行查询
  4. 创建 __FilterToConsumerBinding 的实例以将筛选器与 CommandLineEventConsumer 的实例相关联。
  5. 使用 Mofcomp.exe 编译 MOF 文件。

示例

以下代码示例创建名为“MyCmdLineConsumer”的新类,以在 MOF 末尾创建新类的实例时生成事件。 该示例采用 MOF 代码,但你可以使用 WMI 的脚本 APIWMI 的 COM API 以编程方式创建实例。

以下过程描述如何创建名为 MyCmdLineConsumer 的新类。

创建名为 MyCmdLineConsumer 的新类

  1. 使用执行可见程序(如“calc.exe”)的命令创建 c:\cmdline_test.bat 文件。
  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";
};

使用标准使用者监视和响应事件