基于事件运行脚本

通过由 ActiveScriptEventConsumer 类实现的标准使用者,计算机可以运行脚本并在发生重要事件时采取措施,以确保计算机可以自动检测并解决问题。

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

可以通过在 ScriptingStandardConsumerSetting 的单个实例中设置 Timeout 或 MaximumScripts 属性的值来配置系统上所有 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 的脚本 APIWMI 的 COM API 以编程方式创建实例。

使用外部脚本的示例

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

使用外部脚本示例

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

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

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

    Mofcompfilename**.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 类具有 UserModeTime 和 KernelModeTime 属性,这些属性将放入由脚本创建的日志文件中。

' 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 文件。

    Mofcompfilename**.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;
};

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