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

Следующий пример показывает, как получить информацию обо всех переменных окружения (Environment variables), которые, как вы знаете играют важную роль в жизни программиста. Они, например, объясняют тот факт, что набрав devenv в окне диалога Run, мы запустим Visual Studio, но если мы наберем там word, то Word не запустится.

SelectQuery query = new SelectQuery ("Win32_Environment");

ManagementObjectSearcher searcher = new ManagementObjectSearcher (query);

foreach (ManagementBaseObject mo in searcher.Get())

  Console.WriteLine("Variable : {0}, = {1}", mo["Name"], mo["VariableValue"]);

Класс ManagementBaseObject является базовым для класса ManagementObject, поэтому имеет меньшую функциональность, но ее вполне достаточно для нашего запроса. Класс SelectQuery является специализированным потомком класса WqlObjectQuery и работает с запросами типа SELECT. Другие дети класса WqlObjectQuery (их всего два: RelationshipQuery и RelatedObjectQuery) дают возможность определить взаимосвязи классов и объектов. Например, запрос к объекту класса Win32_LogicalDisk, созданный с помощью класса RelationshipQuery, выдает множество классов WMI, ассоциированных с ним. Ассоциации обозначают связи, существующие между таблицами базы данных WMI.

string s = "References of { Win32_LogicalDisk.DeviceID='C:' }";

RelationshipQuery query = new RelationshipQuery (s);

ManagementObjectSearcher searcher = new ManagementObjectSearcher (query);

foreach (ManagementObject assoc in searcher.Get())

  Console.WriteLine (assoc["__CLASS"]);

Этот фрагмент выводит следующий список связей:

Win32_LogicalDiskRootDirectory

Win32_DiskQuota

Win32_SystemDevices

Win32_LogicalDiskToPartition

Win32_VolumeQuotaSetting

Второй класс, производный от WqlObjectQuery, позволяет узнать все объекты системы, которые связаны с данным. Например, следующий фрагмент выводит объекты, связанные с диском C:.

RelatedObjectQuery query = new RelatedObjectQuery ("Win32_LogicalDisk='C:'");

ManagementObjectSearcher searcher = new ManagementObjectSearcher (query);

foreach (ManagementObject related in searcher.Get())

  Console.WriteLine (related.ToString());

Фрагмент производит следующий вывод:

\\AVALON\root\cimv2:Win32_Directory.Name="c:\\"

\\AVALON\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0"

\\AVALON\root\cimv2:Win32_SystemAccount.Domain="AVALON",Name="Administrators"

\\AVALON\root\cimv2:Win32_ComputerSystem.Name="AVALON"

\\AVALON\root\cimv2:Win32_QuotaSetting.VolumePath="C:\\"

Здесь я позволил себе заменить имя моего сервера на более знакомое вам имя AVALON. Имена классов: Directory, DiskPartition, SystemAccount, ComputerSystem, QuotaSetting раскрывают суть объектов системы, которые связаны с логическим диском C:. Следующий пример показывает, как вывести все методы WMI-класса, опекающего логические диски.

ManagementClass mc = new ManagementClass ("Win32_LogicalDisk");

Console.WriteLine ("\nMethods of class win32_logicaldisk\n");

foreach (MethodData m in mc.Methods)

  Console.WriteLine("Method : " + m.Name);

События в WMI

Классы из пространства System.Management позволяют не только получать информацию из базы данных, но и обеспечить реакцию на некоторые события в системе. Класс ManagementEventWatcher позволяет подписаться на получение уведомлений о событиях, которые указаны в запросе. Следующий пример показывает, как, кроме вывода списка всех активных процессов, включить наблюдателя (или слушателя событий). В нашем случае роль наблюдателя играет объект класса ManagementEventWatcher.

Этот класс поддерживает событие EventArrived типа EventArrivedEventHandler. Вы помните, что тип события совпадает с типом его делегатов. Мы добавим своего делегата в список делегатов события, а наблюдатель уведомит наше приложение при возникновении события. При этом он запустит функцию обратного вызова, которую мы назвали ArrivedHandler. Последнюю необходимо указать в качестве задания делегату типа EventArrivedEventHandler.