イベントに基づくコマンド ラインからのプログラムの実行

CommandLineEventConsumer クラスは、指定したイベントが発生したときに、コマンド ラインから指定された実行可能プログラムを実行します。 このクラスは、WMI が提供する標準イベント コンシューマーです。

CommandLineEventConsumer を使用する場合は、開始する実行可能ファイルをセキュリティで保護する必要があります。 実行可能ファイルが安全な場所にない場合、または強力なアクセス制御リスト (ACL) でセキュリティで保護されていない場合、アクセス権のないユーザーは、実行可能ファイルを別の実行可能ファイルに置き換えることができます。 Win32_LogicalFileSecuritySettingまたはWin32_LogicalShareSecuritySetting クラスを使用して、ファイルまたは共有のセキュリティをプログラムで変更できます。 詳細については、「 C++ での新しいオブジェクトのセキュリティ記述子の作成」を参照してください。

標準コンシューマーを使用する基本的な手順は常に同じであり、 Standard コンシューマーによるイベントの監視と対応に関する説明にあります。 次のプロシージャは、基本的なプロシージャに追加され、 CommandLineEventConsumer クラスに固有であり、プログラムを実行するイベント コンシューマーを作成する方法について説明します。

注意事項

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

CommandLineEventConsumer を使用して、対話形式で実行されるプロセスを開始することはできません。

 

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

コマンド ラインからプロセスを実行するイベント コンシューマーを作成するには

  1. マネージド オブジェクト形式 (MOF) ファイルで、 CommandLineEventConsumer のインスタンスを作成して、クエリで要求したイベントを受信します。 詳細については、「 マネージド オブジェクト形式 (MOF) クラスの設計」を参照してください。
  2. __EventFilterのインスタンスを作成し、名前を付けます。
  3. イベントの種類を指定するクエリを作成します。 詳細については、「 WQL を使用したクエリ」を参照してください。
  4. フィルターを CommandLineEventConsumer のインスタンスに関連付ける__FilterToConsumerBindingのインスタンスを作成します。
  5. Mofcomp.exeを使用して MOF ファイルをコンパイルします。

次のコード例では、"MyCmdLineConsumer" という名前の新しいクラスを作成して、MOF の最後に新しいクラスのインスタンスが作成されたときにイベントを生成します。 この例は MOF コードにありますが、WMI 用スクリプト API または WMI 用 COM API を使用してプログラムでインスタンスを作成できます

次の手順では、MyCmdLineConsumer という名前の新しいクラスを作成する方法について説明します。

MyCmdLineConsumer という名前の新しいクラスを作成するには

  1. "calc.exe" などの表示プログラムを実行するコマンドを使用して、c:\cmdline_test.bat ファイルを作成します。
  2. MOF をテキスト ファイルにコピーし、拡張子が .mof で保存されます。
  3. コマンド ウィンドウで、 Mofcomp filename.mof コマンドを使用して MOF ファイルをコンパイルします。

Note

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

標準コンシューマーによるイベントの監視と対応