Краткое описание
Технология WMI (Windows Management Instrumentation)
- это одна из базовых технологий Microsoft для централизованного управления и
слежения за работой различных частей компьютерной сети под управлением Windows.
С помощью WMI можно управлять устройствами,
учетными записями, сервисами, процессами, сетевыми интерфейсами и другими
программами, которые расширяют базовую структуру WMI своими классами.
Технология WMI - это расширенная и адаптированная под
Windows реализация стандарта WBEM (Web-Based Enterprise Management), принятого
многими компаниями, в основе которого лежит идея создания универсального
интерфейса мониторинга и управления различными системами и компонентами
распределенной информационной среды предприятия с использованием
объектно-ориентированных идеологий и протоколов HTML и XML.
Хранилище свойств объектов WMI называется
репозиторием и расположено в системной папке операционной системы Windows.
Политика безопасности
Если пользователь не имеет права делать какое-то действие
через операционную систему, он не сможет это сделать и через WMI.
Язык запросов
Для обращения к объектам WMI используется специфический язык
запросов WMI Query Language (WQL), который является одним из разновидностей
SQL. Основное его отличие от ANSI SQL - это невозможность изменения данных, то
есть с помощью WQL возможна лишь выборка данных с помощью команды SELECT. WQL
не поддерживает такие операторы как DISTINCT, JOIN, ORDER, GROUP,
математические функции.
Репозиторий
В результате подключения к WMI получается объект
SWbemServices, который обладает определенными свойствами и методами. Наиболее
часто используемые из них - это Get, ExecQuery, ExecMethod.
Ход работы.
Для работы с WMI, Framework .NET предоставляет сборку
System.Management.dll и одноименным неймспейсом.
- перед началом работы добавим System.Management в References. Следуем: (Проект - Добавить ссылку.. – NET - System.Management - OK)
- затем запишем
пространство в редакторе, чтобы можно было использовать методы WMI:
using System.Management;
(теперь приложения и службы могут запрашивать важные
сведения об управлении с помощью классов, производных от
ManagementObjectSearcher и ManagementQuery)
Работа с WMI начинается с класса ManagementScope, который
предназначен для подключению к серверу WMI. Основной конструктор этого класса
принимает 2 параметра:
- path - путь для подключения;
- options - параметры подключения.
Параметры path такие: string.Format(@"\\{0}\root\cimv2",
host).
Путь содержит хост компьютера к которому нужно подключиться,
и путь неймспейса WMI (имеет иерархическую структуру). Имеется много
нейсмпейсов, но наиболее используемый cimv2. (Менеджер объектов CIM (Common Information Model Object
Manager, CIMOM), который обеспечивает обработку всех запросов конечных
приложений к WMI и доставку информации от WMI к конечным приложениям. Классы
CIM группируются в пространства имён (namespaces), которые упорядочены
иерархически. Корневое пространство имён обозначается как Root. В любом
варианте установки WMI имеются четыре пространства имён, которые находятся на
один уровень ниже корневого пространства имён: CIMV2, Default, Security и WMI.)
Параметр options содержит следующие поля:
- Username - имя
пользователя Windows.
-
Password/SecurePassword - пароль пользователя Windows.
После создания объекта, производят подключение к WMI. Для этого
нужно вызвать метод Connect. Свойство IsConnected возвращает состояние подключения. ( Класс ManagementScope не имеет метода для разрыва связи, для
того чтобы переподключиться, нужно повторно вызвать метод Connect ).
Код для удаленного подключения к WMI:
ConnectionOptions
options = new ConnectionOptions();
options.Username
= username;
options.Password
= password;
ManagementScope
scope = new ManagementScope(string.Format("\\\\{0}\\root\\cimv2", "host”),
options);
scope.Connect();
Для локального подключения:
ManagementScope scope = new ManagementScope(@"\\.\root\cimv2");
scope.Connect();
После создания подключения, мы можем начать запрашивать
различную информацию от WMI. Для этого существует класс SelectQuery или ObjectQuery. В
конструкторе им передается строка с SQL-подобным запросом. После этого мы можем
использовать объект класса SelectQuery для передачи его в конструктор класса
ManagementObjectSearcher.
SelectQuery
query = new SelectQuery(@"Select DeviceID, FreeSpace, Size, DriveType from
Win32_LogicalDisk");
ManagementObjectSearcher
searcher = new ManagementObjectSearcher(scope,query);
ManagementObjectCollection
queryCollection = searcher.Get();
foreach
(ManagementObject mo in queryCollection)
{
Console.WriteLine("DeviceID: {0}", mo["DeviceID"]);
Console.WriteLine("FreeSpace: {0}",
mo["FreeSpace"]);
Console.WriteLine("Size: {0}",
mo["Size"]);
Console.WriteLine("DriveType :
{0}", mo["DriveType "]);
}
Console.ReadKey();
Отметим:
{0} – указывает, куда подставляется значение. Цифра, это
порядок следующих друг за другом значений, указанных в строчку. Отсчет
начинается с 0.
Пример: выводим имя компьютера
ManagementScope sc = new ManagementScope(@"\\.\root\cimv2");
sc.Connect();
ObjectQuery sq = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher os = new ManagementObjectSearcher(sc,
sq);
ManagementObjectCollection qc =
os.Get();
foreach (ManagementObject
mo in qc)
{
Console.WriteLine("Computer Name : {0}", mo["csname"]);
}
Console.ReadKey();