Не осталась в стороне и Microsoft, предложившая технологию WMI (Windows Management Instrumentation) — фундаментальное решение для централизованного управления и слежения за работой различных частей компьютерной сети под управлением Windows. Технология оказалась очень полезной для администраторов и разработчиков программного обеспечения. Изначально ее было удобно применять для администрирования компьютеров через Windows Script Host. Сейчас доступ к WMI имеется в современной оболочке Power Shell, также ничто не мешает использовать компоненты WMI чисто «программистским» путем, например в проектах C++. А с появлением Delphi Prism полноценная возможность работы с WMI стала доступна и Delphi-программистам.

Архитектура WMI

Главный компонент WMI — менеджер объектов CIM (Common Information Model Object Manager, CIMOM). Он обрабатывает все запросы, приходящие к WMI от конечных приложений, и отвечает за доставку результата в виде подготовленного объекта с ответной информацией. В Windows имеется утилита winmgmt.exe (находится в папке …System32wbem), выполняющая такую задачу в режиме системной службы. Если вы не нашли эту программу, то смело идите на сайт Microsoft за инсталляционным файлом wmicore.exe.

У менеджера CIM имеется хранилище классов — отдельная база данных. Каждый класс CIM описывает какую-то сущность и содержит соответствующие свойства и методы для работы с ней. Большинство таких классов хранится в MOF-файлах (Managed Object Format). Когда потребитель (например, какое-то клиентское приложение) отправляет в WMI запросы, то получает в ответ экземпляры этих классов. Потребитель получает результат в виде объекта от соответствующего провайдера WMI. Таким образом, вся внутренняя кухня скрыта от пользователя, на поверхности только удобная структурированная информация для мониторинга интересующей его части компьютерной инфраструктуры. Кроме того, существуют средства WMI SDK, для того чтобы независимые разработчики могли создавать собственные провайдеры WMI.

Клиентское приложение способно осуществить запрос к WMI на получение информации о любом удаленном компьютере, поддерживающем данную технологию, и после соединения с соответствующим CIMOM получить ответ. Им могут быть данные об аппаратном обеспечении и его конфигурации, о настройках операционной системы, системных событиях, службах, процессах. Для удобства также существует специальный язык запросов WMI — это WQL. Его смело можно называть SQL для WMI, потому что он создан как подмножество ANSI SQL (http://msdn.microsoft.com/en-us/library/aa394606(VS.85).aspx).

Пример запроса WQL:

SELECT * FROM meta_class
WHERE __this ISA «Win32_BaseService»

Такой запрос позволяет получить всю информацию об элементах, содержащихся в классе Win32_BaseService, дающем доступ к информации о системных службах и драйверах. Иначе говоря, класс может выдать список, куда входит «любой процесс или услуга, которая не принадлежит конкретному пользователю и обеспечивает интерфейс для некоторых функций при поддержке компьютерной системы» (http://msdn.microsoft.com/en-us/library/aa394073(VS.85).aspx).

А чтобы узнать, к каким еще объектам допустимо обращаться в данной системе, достаточно набрать в консоли команду:

wmic alias list brief

Результаты работы команды можно вывести в файл, например

wmic product list brief >c:products.tsv

WMI.NET

Утилита WMI реализована на платформах Win32, Win64 и .NET. Наибольший интерес представляет, конечно же, доступ к WMI через программную платформу .NET. Программисту предоставляется специальное пространство имен System.Management, а также System.Management.Instrumentation, благодаря чему можно осуществлять программные обращения к менеджеру WMI из клиентских приложений.

Рассмотрим несколько примеров работы с WMI в среде Delphi Prism. В первом примере (листинг 1) получим информацию о процессоре локальной машины.

Оказалось, для того чтобы пример заработал, мало использовать пространство имен System.Management, необходимо еще в лоб указать среде разработки (MS Visual Studio 2008) ссылку на соответствующую сборку. Ее нужно выбрать из списка в окне .NET, которое откроется после выбора команды Solusion Explorer•Solusion•ConsoleApplication1•References•Add Reference…

Первое, что мы сделали в программе, — использовали класс ManagementClass для указания интересующей нас информации. Этот класс и подарил нам необходимый экземпляр в соответствии с аргументом, указанным в конструкторе. Для разминки можно получить описание свойств необходимого нам объекта в виде XML, набрав в командной строке волшебную команду:

wmic /namespace: ootcimv2 class Win32_Processor
WMIC — это реализация поддержки WMI через командную строку. Работает она в Windows XP/ Server 2003/ Server 2008.
А чтобы получить уже живые данные, чуть-чуть изменим запрос:
wmic /namespace: ootcimv2 path Win32_Processor
Или сразу из командной строки, не написав отдельную программу, отправим готовую информацию в файл:
wmic /namespace: ootcimv2 path Win32_Processor > C:proc.tsv

Как видно, сам по себе командный интерфейс без дополнительного программирования — серьезное средство для работы с системой.

Используя WMIC, можно уже без дополнительных инструментов управлять несколькими машинами с разными версиями Microsoft Windows. Неблокирующая реализация (т.е. когда программа не задерживается в ожидании какого-либо ответа со стороны клиента) данной команды позволяет успешно использовать ее в скриптах и командных файлах. Чтобы более подробно узнать об этой команде, обратитесь к справочной системе Windows или, к примеру, к http://technet.microsoft.com/ru-ru/library/cc784966.aspx либо просто наберите в командной строке Wmic -?.

Кстати, если формат вывода данных вас раздражает, поменяйте настройки командной строки. Вернемся к нашему первому примеру. Мы получили объект, который формально может содержать в себе целую коллекцию. Для перебора этой коллекции используем метод GetInstances. И теперь мы наконец добрались до самих данных, которые оказались представлены всего одной строкой..

К сожалению, нам не удалось запустить программу под управлением платформы Mono ни в Windows, ни в Linux, хотя в Delphi Prism имеется возможность делать сборки, специально «заточенные» под Mono. Очевидно, в данном случае проблема явно связана с System.Management.dll.

Результат работы утилиты MoMA

У проекта Mono есть интересная веточка — MoMA — Mono Migration Analizer (http://mono-project.com/MoMA) . Эта утилита просто констатировала факт непригодности программы для платформы Mono, хотя сборка и была сделана как раз для нее. Судя по тому, как обсуждалась проблема на форуме разработчиков Mono (http://go-mono.com/), кривые руки оказались не только у автора статьи. Но до сих пор ее решение не найдено. Во втором примере (листинг 2) мы опять получим системную информацию, но на этот раз с помощью языка WQL. Использован класс System.Management.ManagementScope.

В официальном руководстве сухо сказано, что он «представляет область (пространство имен) для управляющих операций» (http://msdn.microsoft.com/ru-ru/library/system.management.managementscope.aspx). Значит, в атрибутах объекта данного класса мы должны указать, к какому источнику информации хотим подключиться.

В WMI принцип организации доступа к информации сильно напоминает работу с базой данных. Запрос на получение нужной информации используется в классе System.Management.ObjectQuery, название которого говорит само за себя. Данные о требуемом источнике системной информации и о запросе объединяются вместе в промежуточном классе ManagementObjectSearcher. Экземпляр этого класса и осуществляет необходимый нам запрос через метод Get().На таком принципе построены все три запроса примера.

Следующий пример (листинг 3) демонстрирует использование возможностей класса Win32_LogicalDisk. Здесь мы получаем уже несколько строк в ответе, так что воспользуемся оператором for each.

Последний пример (листинг 4) демонстрирует применение WMI для извлечения данных о пользователях и группах локальной системы. В нем применяется класс SelectQuery, еще более упрощающий использование запроса типа SELECT.

В этой статье мы рассмотрели отдельный спектр задач — извлечение системной информации из локальной машины. Но сам интерфейс WMI предполагает функции управления как для локальной машины, так и для группы компьютеров. WMI.NET — удобный вариант программного доступа к компьютерным системам на базе Windows XP/Vista/ Server 2003/Server 2008. Технология WMI отличается своей универсальностью, относительной простотой и интегрируемостью.


Листинг и результат работы первого примера

Основные составляющие технологии WMI

Листинг 2

Листинг 3 и 4