Windows Management Instrumentation. События в WMI. Библиотека классов MyWMI. Особенности работы с большим деревом, страница 2

Чтобы вы смогли приблизительно оценить объем работы, проведенной командой Microsoft, которая занималась рассматриваемой нами технологией, приведу результаты статистики, проведенной мной путем анализа документации к студии. Множество классов WMI, обозначаемое как Win32 Classes, насчитывает пять категорий и 439 классов. Вот эти категории:

1.  Computer System Hardware Classes:         90 классов,

2.  Operating System Classes:                         192 класса,

3.  Installed Applications Classes:                    62 класса,

4.  WMI Service Management Classes:                        3 класса,

5.  Performance Counter Classes:                    92 класса.

Итак, мы можем пользоваться классами WMI для получения информации о системе и управления ею. Следующий фрагмент показывает, как с помощью объекта ManagementClass узнать объем свободного дискового пространства.

ManagementClass mc = new ManagementClass ("Win32_LogicalDisk");

foreach (ManagementObject disk in mc.GetInstances())

{

  try

  {

    double d = double.Parse (disk["FreeSpace"].ToString()) / (1024*1024*1024);

    Console.WriteLine("Disk {0} Free space = {1:f1} Gb", disk["Name"], d);

  }

  catch {}

}

Метод GetInstances возвращает коллекцию экземпляров выбранного класса, то есть список всех логических дисков. Здесь пришлось задействовать механизм обработки исключений, который игнорирует исключение, вызванное обращением к пустому Floppy-дисководу. Обойти исключение можно было и без помощи операторов try-catch, например, с помощью анализа: if (disk["Name"].ToString() != "A:"). Рассматриваемый фрагмент производит такой вывод (с точностью до цифр):

Disk C: Free space = 27.4 Gb

Disk D: Free space = 4.7 Gb

Disk F: Free space = 0.0 Gb

Следующий фрагмент выводит список всех активных процессов, запущенных на вашей машине.

ManagementClass mc = new ManagementClass (@"root\cimv2:Win32_Process");

foreach (ManagementObject process in mc.GetInstances())

  Console.WriteLine (process["Caption"].ToString());

Загадочное сокращение cimv2 означает, что используется вторая версия подхода к управлению системой, который получил имя Common Information Model (CIM). Префикс: "root\cimv2:" в параметре конструктора класса ManagementClass представляет собой путь к пространству имен, в котором определен нужный нам класс WMI. В нашем случае им является Win32_Process, так как мы делаем запрос о запущенных процессах. Примерами других имен классов WMI могут быть: Win32_Environment, Win32_Share и много других.

Синтаксис выражения proc["Caption"] напоминает обращение к определенному столбцу текущей записи в таблице базы данных. На самом деле оно добывает экземпляр интересующего нас класса. Большинство классов WMI обитает в прстранстве имен root\cimv2, поэтому в нашем примере его можно было и опустить, но его нельзя опустить, если надо обеспечить доступ к какому-либо другому классу. Здесь вступает в игру еще один класс семейства WMI — ManagementScope.

string s = "Select * from MicrosoftBizTalkServer_ReceiveFunction";

ManagementScope scope = new ManagementScope ("root\\MicrosoftBizTalkServer");

WqlObjectQuery query = new WqlObjectQuery (s);

ManagementObjectSearcher searcher = new ManagementObjectSearcher (scope , query);

foreach (ManagementObject function in searcher.Get())

  Console.WriteLine (function ["Name"]);

Пример предполагает, что в исследуемой системе установлен сервер BizTalk — инструмент, поддерживающий разработку больших распределенных в пространстве и времени приложений. Метод Get класса ManagementObjectSearcher возвращает коллекцию (ManagementObjectCollection) произвольных объектов. В примере выводится список специальных функций (ReceiveFunction). Они определены в пространстве имен BizTalk. До сих пор строка запроса подавались на вход конструктора ManagementObjectSearcher. В этом же примере использован новый класс WqlObjectQuery, который обобщает функциональность запросов в формате WQL.