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

Страницы работы

Содержание работы

Windows Management Instrumentation

С точки зрения пользователя Windows Management Instrumentation (WMI) — это инфраструктура управления операционной системой, использующая стандартный объектно-ориентированный интерфейс. С точки зрения программиста WMI — это семейство классов и API-функций, позволяющее получать общую информацию о системе и управлять ею. API-функции WMI позволяют разрабатывать системные утилиты (system tools), которые помогают администратору производить мониторинг компьютерной системы, организовывать работу в ней и управлять критически важными параметрами в режиме реального времени.

Visual Studio .NET и the Microsoft .NET Framework SDK предоставляют новое множество API-функций и классов, которое значительно упрощает разработку системных утилит, а также позволяет управлять распределенными приложениями. При управлении удаленными приложениями WMI использует технологию DCOM (Distributed Component Object Model) со специализированным маршалингом параметров. Это делается для повышения эффективности управления.

С помощью WMI ваше приложение может определить тип операционной системы (включая номер service pack), количество процессоров, запущенные сервисы, открытые сетевые соединения, каким доменам доверяет (in trust relationship) локальный домен host-компьютера. Вы можете запустить или остановить процесс или сервис, управлять доступностью дисков, рекурсивно выгрузить все Web-приложения из произвольной виртуальной директории IIS (Internet Information Services). Все это согласуется с правами клиента WMI.

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

WMI поддерживает специальный язык запросов — Windows Management Instrumentation Query Language (WQL), который является подмножеством языка SQL (Structured Query Language). Например, запрос: "Выдать список процессов, потребляющих более 10 Mb памяти, выглядит так:

Select * from Win32_Process where WorkingSetSize >= 10485760

WMI предоставляет клиентам набор классических COM-интерфейсов и вы можете работать с ними по правилам COM, заручившись поддержкой пространства имен .NET COM Interop. Но значительно более удобно работать без помощи технологии COM, так как .NET Framework имеет специальное пространство имен — System.Management, объекты которого предоставляют интуитивно-ясный интерфейс и позволяют работать с многочисленными данными и событиями.

Центральным классом в этом пространстве именявляется ManagementObject. Он инкапсулирует общую функциональность данных произвольного характера. Например, мы хотим узнать какой размер в гигабайтах имеет наш диск (в магазине он продавался как диск размером в 40 Гб). Для этого достаточно выполнить следующий фрагмент.

ManagementObject disk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");

disk.Get();

double d = double.Parse (disk["Size"].ToString()) / (1024*1024*1024);

Console.WriteLine ("Logical Disk Size = {0:f1} Gb", d);

Вы можете поместить его в функцию Main любого консольного проекта C#. Для того, чтобы он заработал, недостаточно добавить директиву:

using System.Management;

Пространство имен System.Management будет доступным лишь после того, как вы добавите ссылку на System.Management.dll. Для этого выберите команду Add Reference в контекстном меню узла Reference, который расположен внутри дерева компонентов текущего проекта (см. окно Solution Explorer), найдите DLL и добавьте ссылку. После этого фрагмент должен работать. В моем случае он вывел в такой результат:

Logical Disk Size = 37.3 Gb

Другим важным классом пространства имен Management является класс ManagementObjectSearcher. Он позволяет получить коллекцию данных с помощью запроса на языке WQL. Например, для того, чтобы получить список всех сервисов, которые стартовали в данной системе, можно использовать такой запрос:

ManagementObjectSearcher searcher = new ManagementObjectSearcher(

"Select * from Win32_Service where Started = TRUE");

foreach (ManagementObject service in searcher.Get())

Console.WriteLine ("Service = " + service["Caption"]);

Следующий фрагмент обходится без помощи класса ManagementObjectSearcher. Он пользуется услугами другого класса пространства имен Management — класса ManagementClass. Этот класс, производный от ManagementObject, позволяет создать, или скорее выбрать так называемый класс WMI. Классы WMI являются довольно странными отображениями обычных классов .NET, хотя бы потому, что они содержат только 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).

Похожие материалы

Информация о работе