Question

Récemment, j'ai découvert WMI et WQL. J'ai découvert la liste des classes Win32 (à partir de MSDN) que je peux interroger, mais je ne parviens pas à obtenir la liste des classes d'événements (devrait-il s'agir du sous-ensemble de la liste des classes Win32, n'est-ce pas?) avez-vous une liste ou une sorte de aide-mémoire pour cela? Je demande simplement ceci par curiosité.

Exemple pour une classe d'événements - Win32_ProcessStartTrace

Était-ce utile?

La solution

Voici comment répertorier les classes d'événement WMI dans l'espace de noms root \ cimv2 avec C # et 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 \ cimv2 est l'espace de noms WMI par défaut. Vous ne devez donc pas utiliser d'instance ManagementScope . La requête WQL transmise à ManagementObjectSearcher est une requête de métadonnées WMI. Il utilise:

  • Meta_Class pour désigner la requête en tant que requête de schéma et
  • __ Cette propriété permet de répertorier de manière récursive les sous-classes __ Event

(voir ici et ici ).

La classe WMI est une classe d'événements si son fournisseur est implémenté en tant que fournisseur WMI d'événements et doit être une sous-classe de __ Event . Cela ne signifie pas que vous ne pouvez pas utiliser de classes WMI "ordinaires" telles que Win32_Process et Win32_Service dans les requêtes d'événements WQL. Il vous suffit d'utiliser l'une des classes d'aide dérivées __ InstanceOperationEvent telles que __ InstanceCreationEvent ou __ InstanceDeletionEvent , et WMI utilisera son propre sous-système d'événements pour transmettre des événements.

Voici un exemple de requête WQL qui souscrit aux événements de création Win32_Process :

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

Dans ce cas, vous devez utiliser le Dans la clause.

Autres conseils

créateur de code WMI est un excellent outil d’apprentissage de WMI qui vous permet, entre autres, d’explorer les classes d’événements WMI sur l’ordinateur local ou distant et de générer du code pour la réception des notifications d’événement.

Modifier: Étant donné que vous avez étiqueté votre question comme C # , le code permettant d'obtenir la liste des classes d'événements dérivées d'une classe particulière peut vous intéresser:

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 ne dispose-t-il pas d'une liste de tous les Les classes MSMCA ici

MISE À JOUR:
Je ne fais pas des tonnes de travail avec WMI, mais je viens de trouver ceci outil WMI aurait été utile. Il vous donne une interface graphique pour visualiser la hiérarchie d'objets WMI et vous permet même d'enregistrer et de consommer des événements. Cela devrait vous donner les informations dont vous avez besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top