Windows Management Instrumentation - инфраструктура управления операционной системой

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

25 страниц (Word-файл)

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

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 (смотрите в MSDN тему: Classes and Mapping in CLI and WMI).

Чтобы вы смогли приблизительно оценить объем работы, проведенной командой Microsoft, которая занималась рассматриваемой нами технологией, приведу результаты статистики, проведенной мной путем анализа документации к студии. Множество классов WMI, обозначаемое как Win32 Classes насчитывает пять категорий и 439 классов. Вот эти категории:

1.  Computer System Hardware Classes:          90 классов,

2.  Operating System Classes:                          192 класса,

3.  Installed Applications Classes:                     62 класса,

4.  WMI Service Management Classes:             3 класса,

5.  Performance Counter Classes:                    92 класса.

Итак, мы можем пользоваться классами WMI для получения информации о системе и управления ею. Следующий фрагмент показывает, как с помощью объекта ManagementClass узнать объем свободного дискового пространства.

ManagementClass mc = new ManagementClass ("Win32_LogicalDisk");

foreach (ManagementObject disk in mc.GetInstances())

{

  try

  {

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

     Console.WriteLine("Disk {0} Free space = {1:f1} Gb", disk["Name"], d);

  }

  catch {}

}

Метод GetInstances возвращает коллекцию экземпляров выбранного класса, то есть список всех логических дисков. Здесь пришлось задействовать механизм обработки исключений, который игнорирует исключение, вызванное обращением к пустому Floppy-дисководу. Обойти исключение можно было и без помощи операторов try-catch, например, с помощью анализа: if (disk["Name"].ToString() != "A:"). Рассматриваемый фрагмент производит приблизительно такой вывод:

Disk C: Free space = 27.4 Gb

Disk D: Free space = 4.7 Gb

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

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