質問

最近、WMIとWQLについて学びました。クエリできるWin32クラスのリスト(MSDNから)を見つけましたが、イベントクラスのリストを見つけることができません(Win32クラスのリストのサブセットである必要がありますか?)このためのリストやチートシートがありますか?私は好奇心からこれを求めています。

イベントクラスの例- Win32_ProcessStartTrace

役に立ちましたか?

解決

C#およびroot\cimv2を使用してSystem.Management名前空間のWMIイベントクラスを一覧表示する方法は次のとおりです。

using System;
using System.Management;

class Program
{
    static void Main()
    {
        string query =
            @"Select * From Meta_Class Where __This Isa '__Event'";

        ManagementObjectSearcher searcher =
            new ManagementObjectSearcher(query);

        foreach (ManagementBaseObject cimv2Class in searcher.Get())
        {
            Console.WriteLine(cimv2Class.ClassPath.ClassName);
        }
    }
}

ManagementScopeはデフォルトのWMI名前空間であるため、ManagementObjectSearcherインスタンスを使用する必要はありません。 Meta_Classに渡されるWQLクエリは、WMIメタデータクエリです。以下を使用します。

  • __Thisクエリをスキーマクエリとして指定する
  • __Eventプロパティーを再帰的にリストするWin32_Processサブクラス

こちらおよびこちら)。

WMIクラスは、そのプロバイダーがイベントWMIプロバイダーとして実装されている場合、イベントクラスであり、Win32_Serviceのサブクラスでなければなりません。これは、WQLイベントクエリで__InstanceOperationEvent__InstanceCreationEventなどの「通常の」WMIクラスを使用できないという意味ではありません。 __InstanceDeletionEventWithinなどの<=>派生ヘルパークラスのいずれかを使用するだけで、WMIは独自のイベントサブシステムを使用してイベントを配信します。

<=>作成イベントをサブスクライブするサンプルWQLクエリは次のとおりです。

Select * From __InstanceCreationEvent Within 5 Where TargetInstance Isa 'Win32_Process'

この場合、 <=を使用する必要があります。 > 句。

他のヒント

WMIコードCreator は、WMIを学習するための優れたツールです。特に、ローカルまたはリモートコンピューター上のWMIイベントクラスを探索し、イベント通知を受信するためのコードを生成できます。

編集:質問に C#のタグを付けたため、特定のクラスから派生したイベントクラスのリストをプログラムで取得するコードに興味があるかもしれません。

using System.Management;
...

string ancestor = "WMIEvent";     // the ancestor class
string scope = "root\\wmi";       // the WMI namespace to search within

try
{
    EnumerationOptions options = new EnumerationOptions();
    options.ReturnImmediately = true;
    options.Rewindable = false;

    ManagementObjectSearcher searcher =
        new ManagementObjectSearcher(scope, "SELECT * FROM meta_class", options);

    foreach (ManagementClass cls in searcher.Get())
    {
        if (cls.Derivation.Contains(ancestor))
        {
            Console.WriteLine(cls["__CLASS"].ToString());
        }
    }
}
catch (ManagementException exception)
{
    Console.WriteLine(exception.Message);
}

MSDNにはすべてののリストはありませんMSMCAクラスはこちら

更新:
私はWMIで多くの作業を行いませんが、この WMIツールがあれば便利でした。オブジェクトのWMI階層を表示するためのGUIを提供し、イベントを登録して使用することもできます。これにより、必要な情報が得られます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top