Frage

Vor kurzem habe ich über WMI und WQL lernen. Ich fand die Liste der Win32-Klassen aus (von MSDN), die ich für abfragen kann, aber ich bin nicht in der Lage, die Liste der Ereignisklassen, um herauszufinden, (sollte die Teilmenge der Liste der Win32-Klassen sein, nicht wahr?) Gibt es irgendein hat eine Liste oder eine Art Spickzettel für das? Ich frage jsut diese aus Neugier.

Beispiel für eine Ereignisklasse - Win32_ProcessStartTrace

War es hilfreich?

Lösung

Hier ist, wie WMI-Ereignisklassen im root\cimv2 Namespace mit C # und System.Management zur Liste:

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\cimv2 ist der Standard-WMI-Namensraum, so dass Sie keine ManagementScope Instanz verwenden. Die WQL-Abfrage zu ManagementObjectSearcher geben wird, ist eine WMI-Metadaten-Abfrage. Genutzt werden:

  • Meta_Class die Abfrage als Schemaabfrage zu bezeichnen, und
  • __This Eigenschaft rekursiv __Event Subklassen Liste

(siehe hier und hier ).

WMI-Klasse ist ein Ereignis, Klasse, wenn sein Anbieter als Ereignis WMI-Anbieter implementiert und muss eine Unterklasse von __Event sein. Dies bedeutet nicht, dass Sie nicht ‚normale‘ WMI-Klassen wie Win32_Process und Win32_Service in WQL Ereignisabfragen verwenden können. Sie haben nur eine der __InstanceOperationEvent abgeleiteten Helferklassen verwenden, wie __InstanceCreationEvent oder __InstanceDeletionEvent und WMI wird seine eigene Event Subsystem Ereignisse zu liefern, verwendet werden.

Hier ist ein Beispiel WQL-Abfrage, die Erstellung Ereignisse Win32_Process abonniert:

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

In diesem Fall müssen Sie verwenden die Within Klausel.

Andere Tipps

WMI-Code Creator ist ein großes Werkzeug WMI für das Lernen, dass unter anderem, können Sie WMI-Ereignisklassen auf dem lokalen oder Remote-Computer erkunden und Code generieren Ereignisbenachrichtigungen für den Empfang.

Edit: Da Sie Ihre Frage so markiert C # , die Sie in dem Code interessiert sein könnten die Liste der Ereignisklassen, die von einer bestimmten Klasse programmatisch für immer:

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

verfügt nicht über MSDN eine Liste aller MSMCA Klassen hier

UPDATE:
Ich mache nicht viel Arbeit mit WMI, aber ich habe gerade dieses WMI-Tool das wäre hilfreich gewesen. Es gibt Ihnen eine grafische Benutzeroberfläche für die WMI-Hierarchie von Objekten sehen, und auch ermöglicht es Ihnen, Ereignisse zu registrieren und konsumieren. Dies sollte Ihnen die Informationen, die Sie benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top