イベントに基づいてスクリプトを実行する

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

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

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

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

注意事項

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

 

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

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

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

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

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

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

    ScriptText にスクリプトのテキストを配置することも、ScriptFileName にスクリプトのパスとファイル名を指定することもできます。 詳細については、Managed Object Format (MOF) クラスの設計に関するページを参照してください。

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

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

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

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

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

外部スクリプトの使用例

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

外部スクリプトの例を使用するには

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

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

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

    Mofcompfilename**.mof**

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

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