イベントに基づいてコマンドラインからプログラムを実行する

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

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

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

注意事項

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

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

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

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

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

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

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

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

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

注意

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

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