イベントに基づくスクリプトの実行

ActiveScriptEventConsumer クラスによって実装される標準コンシューマーを使用すると、コンピューターでスクリプトを実行し、重要なイベントが発生したときにアクションを実行して、コンピューターが問題を自動的に検出して解決できるようにできます。

このコンシューマーは、既定で root\subscription 名前空間に読み込まれます。

システム上の ActiveScriptEventConsumer のすべてのインスタンスのパフォーマンスを構成するには、Timeout または MaximumScripts プロパティの値を ScriptingStandardConsumerSetting の単一インスタンスに設定します。

標準コンシューマーを使用するための基本的な手順は常に同じであり、「標準コンシューマーを使用したイベントの監視と対応」に記載されています。 基本手順に追加する次の手順は、ActiveScriptEventConsumer クラスに固有であり、スクリプトを実行するイベント コンシューマーを作成する方法について説明します。

注意事項

ActiveScriptEventConsumer クラスには、特別なセキュリティ制約があります。 この標準コンシューマーは、ローカル コンピューター上の Administrators グループのローカル メンバーによって構成される必要があります。 ドメイン アカウントを使用してサブスクリプションを作成する場合、LocalSystem アカウントには、作成者がローカル Administrators グループのメンバーであることを確認するために、ドメインのアクセス許可が必要です。

 

次の手順では、スクリプトを実行するイベント コンシューマーを作成する方法について説明します。

スクリプトを実行するイベント コンシューマーを作成する方法

  1. イベントが発生したときに実行するスクリプトを記述します。

    スクリプトは任意の言語で記述できますが、選択した言語のスクリプト エンジンが使用しているコンピューターにインストールされていることを確認してください。 スクリプトで WMI スクリプト オブジェクトを使用する必要はありません。

    スクリプト コンシューマーを設定できるのは管理者だけです。このスクリプトは LocalSystem 資格情報で実行されます。この資格情報は、ネットワーク アクセスを除く広範な機能をコンシューマーに提供します。 ただし、スクリプトは、環境変数やネットワーク共有など、特定のユーザー ログオン データにはアクセスできません。

  2. Managed Object Format (MOF) ファイルで、クエリで要求したイベントを受信するための ActiveScriptEventConsumer のインスタンスを作成します。

    スクリプトのテキストを ScriptText に配置することも、スクリプトのパスとファイル名を ScriptFileName に指定することもできます。 詳細については、「管理オブジェクトフォーマット (MOF) クラスの設計」を参照してください。

  3. __EventFilter のインスタンスを作成し、名前を付け、スクリプトの実行をトリガーするイベントの種類を指定するクエリを作成します。

    詳細については、「WQL を使用したクエリの実行」を参照してください。

  4. フィルターを ActiveScriptEventConsumer のインスタンスに関連付ける __FilterToConsumerBinding のインスタンスを作成します。

  5. Mofcomp.exe を使用して MOF ファイルをコンパイルします。

次のセクションのサンプルでは、イベント ドリブン スクリプトを実装する 2 つの方法を示しています。 最初のサンプルでは、外部ファイルで定義されているスクリプトを使用し、2 番目のサンプルでは MOF コードに組み込まれているスクリプトを使用します。 サンプルは MOF コードですが、WMI 用スクリプト API または WMI 用の COM API を使用して、プログラムでインスタンスを作成することができます。

外部スクリプトを使用したサンプル

次の手順では、外部スクリプトのサンプルを使用する方法について説明します。

外部スクリプトのサンプルの使用方法

  1. c:\Asec.vbs という名前のファイルを作成し、このサンプルのスクリプトをコピーします。

  2. MOF リストをテキスト ファイルにコピーし、.mof の拡張子を付けて保存します。

  3. コマンド プロンプト ウィンドウで、次のコマンドを使用して MOF ファイルをコンパイルします。

    Mofcomp filename**.mof**

  4. 電卓を実行し、calc.exe プロセスを作成します。 5 秒以上待ってから、[電卓] ウィンドウを閉じ、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 ファイルをコンパイルします。

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

標準コンシューマーを使用したイベントの監視と応答