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

ManagementObjectSearcher searcher = new ManagementObjectSearcher (query);

foreach (ManagementObject mo in searcher.Get())

Console.WriteLine (mo.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, опекающего логические диски. Здесь использован вспомогательный класс MethodData.

ManagementClass c = new ManagementClass ("Win32_LogicalDisk");

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

foreach (MethodData m in c.Methods)

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

Сходным образом можно получить список всех свойств класса или список всех его описателей. Например:

ManagementClass c = new ManagementClass("Win32_ComputerSystemProduct");

Console.WriteLine("\nProperties of class Win32_ComputerSystemProduct\n");

foreach (PropertyData p in c.Properties)

Console.WriteLine(p.Name);

Console.WriteLine("\nQualifiers of class Win32_ComputerSystemProduct\n");

foreach (QualifierData q in c.Qualifiers)

Console.WriteLine(q.Name + ": " + q.Value);

Используйте указанный фрагмент в тестовом консольном приложении и просмотрите его результат.

Заметим, что значение q.Value описателя (Qualifier) объекта класса ManagementClass мы смогли получить, а значение свойства p.Value не сможем (оно всегда будет равно null). Это происходит потому, что мы опрашиваем объект типа ManagementClass, а не экземпляр (instance) объекта этого класса. Экземпляр имеет тип ManagementObject.

Для определения значения свойства объекта (типа ManagementObject) надо сначала его получить, а затем обратиться к нему с помощью строкового индексатора, как было показано ранее. С учетом сказанного, приведем новую версию опроса свойств объекта класса Win32_ComputerSystemProduct.

ManagementClass c = new ManagementClass("Win32_ComputerSystemProduct");

Console.WriteLine("\nProperties of class Win32_ComputerSystemProduct\n");

foreach (ManagementObject mo in c.GetInstances())

{

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

foreach (PropertyData p in c.Properties)

Console.WriteLine(p.Name + ": " + mo[p.Name]);

}

Первый цикл в нашем случае не имеет смысла, так как в системе существует только один объект (ManagementObject) класса (ManagementClass) с именем Win32_ComputerSystemProduct, но для других классов WMI это не так. Например, если заменить имя класса на: Win32_NetWorkAdapter, то мы получим значения свойств всех сетевых адаптеров. Приведу здесь лишь имена (mo["Name"]) адаптеров, обнаруженных в моей домашней системе. Их количество меня сильно удивило.

WAN Miniport (SSTP), WAN Miniport (IKEv2), WAN Miniport (L2TP), WAN Miniport (PPTP), WAN Miniport (PPPOE), WAN Miniport (IPv6), WAN Miniport (Network Monitor), Realtek PCIe GBE Family Controller, WAN Miniport (IP), Адаптер Microsoft ISATAP, RAS Async Adapter, Teredo Tunneling Pseudo-Interface

Вывод: я имею лишь слабое представление о начинке своего компьютера. Думаю, что вы — тоже.

События WMI

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