基于事件运行脚本

ActiveScriptEventConsumer 类实现的标准使用者允许计算机在发生重要事件时运行脚本并采取行动,以确保计算机能够自动检测和解决问题。

默认情况下,此使用者在 root\subscription 命名空间中加载。

通过在 ScriptingStandardConsumerSetting 的单个实例中设置 TimeoutMaximumScripts 属性的值,可以配置系统上 ActiveScriptEventConsumer 所有实例的性能。

使用标准使用者的基本过程始终相同,并且位于使用标准使用者监视和响应事件中。 以下过程添加到基本过程中,特定于 ActiveScriptEventConsumer 类,并介绍如何创建运行脚本的事件使用者。

注意

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

 

以下过程介绍如何创建执行脚本的事件使用者。

创建执行脚本的事件使用者

  1. 编写脚本,以在事件发生时运行。

    可以使用任何语言编写脚本,但请确保计算机上安装了所选语言的脚本引擎。 该脚本不必使用 WMI 脚本对象。

    只有管理员才能设置脚本使用者,并且脚本在 LocalSystem 凭据下运行,这为使用者提供了除网络访问之外的广泛功能。 但是,该脚本无权访问特定的用户登录数据,例如环境变量和网络共享。

  2. 在托管对象格式 (MOF) 文件中,创建 ActiveScriptEventConsumer 的实例,以接收查询中请求的事件。

    可以将脚本的文本放在 ScriptText 中,也可以在 ScriptFileName 中指定脚本的路径和文件名。 有关详细信息,请参阅设计托管对象格式 (MOF) 类

  3. 创建 __EventFilter 的实例,为其命名,然后创建一个查询来指定触发执行脚本的事件类型。

    有关详细信息,请参阅利用 WQL 进行查询

  4. 创建 __FilterToConsumerBinding 的实例,将筛选器与 ActiveScriptEventConsumer 的实例相关联。

  5. 使用 Mofcomp.exe 编译 MOF 文件。

下一节中的示例显示了实现事件驱动脚本的两种方法。 第一个示例使用在外部文件中定义的脚本,第二个示例使用内置于 MOF 代码中的脚本。 这些示例位于 MOF 代码中,但可以使用适用于 WMI 的脚本 API适用于 WMI 的 COM API 以编程方式创建实例。

使用外部脚本的示例

以下过程介绍如何使用外部脚本示例。

使用外部脚本示例

  1. 创建一个名为 c:\Asec.vbs 的文件,然后将本例中的脚本复制到其中。

  2. 将 MOF 列表复制到文本文件中,并以 .mof 扩展名保存。

  3. 在命令提示符窗口中,使用以下命令编译 MOF 文件。

    Mofcomp filename**.mof**

  4. 运行计算器,创建 calc.exe 进程。 等待五秒钟以上,关闭“计算器”窗口,然后在 C:\ 目录中查找名为 ASEC.log 的文件。

    以下文本与 ASEC.log 文件中包含的文本类似。

    Time: 12/31/2002 2:56:33 PM; Entry made by: ASEC
    Application closed. UserModeTime:  1562500; 
    KernelModeTime: 3125000 [hundreds of nanoseconds]
    

以下 VBScript 代码示例显示了当永久使用者接收到事件时调用的脚本。 TargetEvent 对象是一个 __InstanceDeletionEvent 实例,因此它具有名为 TargetInstance 的属性,这是一个用于触发事件的 Win32_Process 实例。 Win32_Process 类具有 UserModeTimeKernelModeTime 属性,这些属性被放入脚本创建的日志文件中。

' asec.vbs script
Dim objFS, objFile
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile = objFS.OpenTextFile("C:\ASEC.log", 8, true)
objFile.WriteLine "Time: " & Now & "; Entry made by: ASEC"

objFile.WriteLine "Application closed. UserModeTime:  " & _
    TargetEvent.TargetInstance.UserModeTime & _
    "; KernelModeTime: " & _
    TargetEvent.TargetInstance.KernelModeTime & _
    " [hundreds of nanoseconds]"
objFile.Close

以下 MOF 代码示例在收到事件时调用脚本。 它在 root\subscription 命名空间中创建筛选器、使用者以及它们之间的绑定。

#pragma namespace ("\\\\.\\root\\subscription")

instance of ActiveScriptEventConsumer as $Cons
{
    Name = "ASEC";
    ScriptingEngine = "VBScript";
    ScriptFileName = "c:\\asec2.vbs";
};

instance of __EventFilter as $Filt
{
    Name = "EF";
    Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 "
        "WHERE TargetInstance ISA \"Win32_Process\" "
        "AND TargetInstance.Name = \"calc.exe\"";
    QueryLanguage = "WQL";
    EventNamespace = "root\\cimv2";
};

instance of __FilterToConsumerBinding
{
    Filter = $Filt;
    Consumer = $Cons;
};

使用内联脚本的示例

以下过程介绍如何使用内联脚本示例。

使用内联脚本示例

  1. 将本节中的 MOF 列表复制到文本文件中,并以 .mof 扩展名保存。

  2. 在命令提示符窗口中,使用以下命令编译 MOF 文件。

    Mofcomp filename**.mof**

以下 MOF 代码示例创建了筛选器、使用者以及它们之间的绑定,还包含内联脚本。

#pragma namespace ("\\\\.\\root\\subscription")

instance of ActiveScriptEventConsumer as $Cons
{
    Name = "ASEC";
    ScriptingEngine = "VBScript";
    
    ScriptText =
        "Dim objFS, objFile\n"
        "Set objFS = CreateObject(\"Scripting.FileSystemObject\")\n"
        "Set objFile = objFS.OpenTextFile(\"C:\\ASEC.log\","
        " 8, true)\nobjFile.WriteLine \"Time: \" & Now & \";"
        " Entry made by: ASEC\"\nobjFile.WriteLine"
        " \"Application closed. UserModeTime:  \" & "
        "TargetEvent.TargetInstance.UserModeTime &_\n"
        "\"; KernelModeTime: \" & "
        "TargetEvent.TargetInstance.KernelModeTime "
        "& \" [hundreds of nanoseconds]\"\n"
        "objFile.Close\n";
};

instance of __EventFilter as $Filt
{
    Name = "EF";
    Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 "
        "WHERE TargetInstance ISA \"Win32_Process\" "
        "AND TargetInstance.Name = \"calc.exe\"";
    QueryLanguage = "WQL";
    EventNamespace = "root\\cimv2";
};

instance of __FilterToConsumerBinding
{
    Filter = $Filt;
    Consumer = $Cons;
};

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