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

¨  Installed Applications Classes,

¨  WMI Service Management Classes,

¨  Performance Counter Classes.

Но следует отметить, что все классы невозможно рассортировать по этим категориям. Думаю, что каждый класс WMI приблизительно соответствует одной из таблиц базы данных WMI. Синтаксис выражения mo["Caption"] напоминает обращение к определенному столбцу текущей записи в таблице базы данных. На самом деле оно добывает объект класса, свойствами которого мы можем воспользоваться.

Большинство классов WMI обитает в пространстве имен root\cimv2, поэтому в нашем примере его можно было и опустить, но это нельзя делать, если надо обеспечить доступ к классу из другого пространства имен. Здесь вступает в игру еще один класс семейства WMI — ManagementScope.

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

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 mo in searcher.Get())

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

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

Следующий пример показывает, как получить информацию о переменных окружения (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 mo in searcher.Get())

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

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

Win32_LogicalDiskRootDirectory

Win32_DiskQuota

Win32_SystemDevices

Win32_LogicalDiskToPartition

Win32_VolumeQuotaSetting

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

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