Только что мы с помощью объекта 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,
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.