Domanda

Recentemente ho imparato a conoscere WMI e WQL. Ho scoperto l'elenco delle classi Win32 (da MSDN) per cui posso eseguire una query ma non sono in grado di trovare l'elenco delle classi di eventi (dovrebbe essere il sottoinsieme dell'elenco delle classi Win32, non è vero?) Qualcuno hai una lista o una specie di cheat sheet per questo? Lo sto chiedendo per curiosità.

Esempio per una classe di eventi - Win32_ProcessStartTrace

È stato utile?

Soluzione

Ecco come elencare le classi di eventi WMI nello spazio dei nomi root \ cimv2 con C # e 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 è lo spazio dei nomi WMI predefinito, quindi non è necessario utilizzare un'istanza ManagementScope . La query WQL passata a ManagementObjectSearcher è una query di metadati WMI. Usa:

  • Meta_Class per designare la query come query dello schema e
  • __Questa proprietà per elencare ricorsivamente le sottoclassi __Event

(vedi qui e qui ).

La classe WMI è una classe di evento se il suo provider è stato implementato come provider WMI di eventi e deve essere una sottoclasse di __Event . Ciò non significa che non è possibile utilizzare classi WMI "normali" come Win32_Process e Win32_Service nelle query di eventi WQL. Devi solo utilizzare una delle classi di supporto derivate __InstanceOperationEvent come __InstanceCreationEvent o __InstanceDeletionEvent e WMI utilizzerà il proprio sottosistema di eventi per fornire eventi.

Ecco una query WQL di esempio che si abbona agli eventi di creazione Win32_Process :

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

In questo caso devi usare il All'interno della clausola .

Altri suggerimenti

WMI Code Creator è un ottimo strumento per l'apprendimento di WMI che, tra le altre cose, ti consente di esplorare le classi di eventi WMI sul computer locale o remoto e generare codice per ricevere le notifiche degli eventi.

Modifica: poiché hai taggato la tua domanda come C # , potresti essere interessato al codice per ottenere a livello di codice l'elenco delle classi di eventi derivate da una determinata classe:

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 non ha un elenco di tutti i Classi MSMCA qui

UPDATE:
Non lavoro molto con WMI, ma ho appena trovato questo strumento WMI sarebbe stato utile. Ti dà una GUI per visualizzare la gerarchia WMI degli oggetti e ti consente persino di registrare e consumare eventi. Questo dovrebbe darti le informazioni di cui hai bisogno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top