6

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

イベントクラスの例-Win32_ProcessStartTrace

4

3 に答える 3

6

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

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

root\cimv2ManagementScopeはデフォルトのWMI名前空間であるため、インスタンスを使用する必要はありません。渡されるWQLクエリManagementObjectSearcherは、WMIメタデータクエリです。それは使用しています:

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

ここここを参照)。

WMIクラスは、そのプロバイダーがイベントWMIプロバイダーとして実装されている場合はイベントクラスであり、のサブクラスである必要があります__Event。これは、WQLイベントクエリのようWin32_Processに「通常の」WMIクラスを使用できないことを意味するものではありません。またはのような派生ヘルパークラスWin32_Serviceの1つを使用するだけで、WMIは独自のイベントサブシステムを使用してイベントを配信します。__InstanceOperationEvent__InstanceCreationEvent__InstanceDeletionEvent

Win32_Process作成イベントをサブスクライブするサンプルWQLクエリを次に示します。

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

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

于 2009-06-25T19:52:51.897 に答える
6

WMIコードクリエーターは、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);
}
于 2009-06-25T13:29:54.060 に答える
3

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

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

于 2009-06-25T10:48:01.033 に答える