Windows Management Instrumentation. Опрос свойств, методов и описателей. Разработка компонента WMIControl, страница 2

Только что мы с помощью объекта ManagementObjectSearcher получили информацию о запущенных службах Windows. Если обратиться к объекту класса ManagementClass по имени "Win32_Service", то с его помощью можно получить сведения обо всех службах Windows (как запущенных, так и спящих). Например:

ManagementClass c = new ManagementClass("Win32_Service");

foreach (ManagementObject mo in c.GetInstances())

Console.WriteLine("Service: {0},  State: {1} ", mo["Caption"], mo["State"]);

В системе (точнее, в пространстве имен \\Имя_машины\root\CIM2) имеется много объектов класса с именем "Win32_Service". Наш код проходит по всему множеству этих объектов и получает информацию о значении двух свойств (Caption и State). Вывод показывает значения этих свойств для каждой реальной службы.

Классы WMI являются довольно странными отображениями обычных классов, хотя бы потому, что они содержат только public-члены. Документация Microsoft очень дипломатично описывает ("WMI has its own grammar for describing classes"), скорее обходит, те ограничения, которые связаны с классами WMI (смотрите в MSDN тему: Classes and Mapping in CLI and WMI). CLI — это Common Language Infrastructure, не путайте его с Call Level Interface (термином, используемым в технологии ODBC — Open Database Connectivity). Напомню, что в основе WMI лежит противоречивая технология COM (Component Object Model).

Класс Классы WMI размещены в множестве пространств имен с иерархической структурой. Во главе иерархии находится пространство имен root.

Рис.1. Дерево пространств имен, в которых размещены классы WMI.

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

ManagementClass c = new ManagementClass ("Win32_LogicalDisk");

foreach (ManagementObject mo in c.GetInstances())

{

try

{

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

(ulong)mo["FreeSpace"] / (1024.0 * 1024 * 1024));

}

catch {}

}

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

Disk C: Free space = 27.4 Gb

Disk D: Free space = 54.7 Gb

Disk F: Free space = 0.0 Gb

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

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

foreach (ManagementObject mo in c.GetInstances())

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

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

Чтобы приблизительно оценить объем работы, затраченной при разработке WMI, приведу результаты опроса классов, расположенных только в двух пространствах имен: root\cimv2 и root\WMI. Количество классов зависит от типа ОС. В моей системе (Windows 7) пространство имен root\cimv2 содержит 1232 класса, а root\WMI — 2286 классов. В документации MSDN вы встретите следующее условное деление классов WMI на категории:

¨  Computer System Hardware Classes,

¨  Operating System Classes,