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