イベントに基づいてコマンド ラインからプログラムを実行する
CommandLineEventConsumer クラスは、指定したイベントが発生したときに、コマンド ラインから、指定した実行可能プログラムを実行します。 このクラスは、WMI に用意されている標準的なイベント コンシューマーです。
CommandLineEventConsumer を使用する場合は、開始する実行可能ファイルをセキュリティで保護する必要があります。 実行可能ファイルが安全な場所にない場合や強力なアクセス制御リスト (ACL) で保護されていない場合は、アクセス特権のないユーザーが実行可能ファイルを別の実行可能ファイルに置き換えることができます。 Win32_LogicalFileSecuritySetting または Win32_LogicalShareSecuritySetting クラスを使用して、ファイルまたは共有のセキュリティをプログラムで変更できます。 詳細については、「C++ での新しいオブジェクトのセキュリティ記述子の作成」を参照してください。
標準コンシューマーを使用する基本手順は常に同じであり、「標準コンシューマーによるイベントの監視と対応」に記載されています。 次の手順は基本手順の追加であり、CommandLineEventConsumer クラスに固有です。ここでは、プログラムを実行するイベント コンシューマーを作成する方法について説明します。
注意事項
CommandLineEventConsumer クラスには、特別なセキュリティ制約があります。 この標準コンシューマーは、ローカル コンピューター上の Administrators グループのローカル メンバーによって構成される必要があります。 ドメイン アカウントを使用してサブスクリプションを作成する場合、LocalSystem アカウントには、作成者がローカル Administrators グループのメンバーであることを検証するために必要なドメインに対するアクセス許可が必要です。
CommandLineEventConsumer を使用して、対話形式で実行されるプロセスを開始することはできません。
次の手順では、コマンド ラインからプロセスを実行するイベント コンシューマーを作成する方法について説明します。
コマンド ラインからプロセスを実行するイベント コンシューマーを作成するには
- Managed Object Format (MOF) ファイルで、クエリで要求したイベントを受信する CommandLineEventConsumer のインスタンスを作成します。 詳細については、Managed Object Format (MOF) クラスの設計に関するページを参照してください。
- __EventFilter のインスタンスを作成し、名前を付けます。
- イベントの種類を指定するクエリを作成します。 詳細については、「WQL を使用したクエリ」を参照してください。
- __FilterToConsumerBinding のインスタンスを作成して、フィルターを CommandLineEventConsumer のインスタンスに関連付けます。
- Mofcomp.exe を使用して MOF ファイルをコンパイルします。
例
次のコード例では、MOF の最後に新しいクラスのインスタンスが作成されたときにイベントを生成する、"MyCmdLineConsumer" という名前の新しいクラスを作成します。 この例は MOF コードにありますが、WMI 用スクリプト API または WMI 用 COM API を使用して、プログラムでインスタンスを作成できます。
次の手順では、MyCmdLineConsumer という名前の新しいクラスを作成する方法について説明します。
MyCmdLineConsumer という名前の新しいクラスを作成するには
- "calc.exe" などの表示されるプログラムを実行するコマンドで c:\cmdline_test.bat ファイルを作成します。
- MOF をテキスト ファイルにコピーし、.mof 拡張子で保存します。
- コマンド ウィンドウで、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";
};
関連トピック