Вопрос

Недавно я узнал о WMI и WQL.Я нашел список классов Win32 (из MSDN), которые я могу запросить, но я не могу узнать список классов событий (должно быть подмножеством списка классов Win32, не так ли?) Кто-нибудь есть список или какая-то шпаргалка для этого?Я просто спрашиваю об этом из любопытства.

Пример класса событий – Win32_ProcessStartTrace

Это было полезно?

Решение

Вот как составить список классов событий 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\cimv2 — это пространство имен WMI по умолчанию, поэтому вам не нужно использовать ManagementScope пример.WQL-запрос, переданный ManagementObjectSearcher — это запрос метаданных WMI.Оно использует:

  • Meta_Class обозначить запрос как запрос схемы и
  • __This свойство для рекурсивного списка __Event подклассы

(видеть здесь и здесь).

Класс WMI является классом событий, если его поставщик реализован как поставщик событий WMI и должен быть подклассом __Event.Это не означает, что вы не можете использовать «обычные» классы WMI, такие как Win32_Process и Win32_Service в запросах событий WQL.Вам просто нужно использовать один из __InstanceOperationEvent производные вспомогательные классы, такие как __InstanceCreationEvent или __InstanceDeletionEvent, а WMI будет использовать собственную подсистему событий для доставки событий.

Вот пример запроса WQL, который подписывается на Win32_Process события создания:

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

В этом случае вам придется использовать Within пункт.

Другие советы

код 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 и даже позволяет регистрировать и использовать события.Это должно дать вам необходимую информацию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top