среда, 13 февраля 2013 г.

WMI на C#

WMI (Windows Management Instrumentation) - это одна из базовых технологий для централизованного управления и слежения за работой различных частей компьютерной инфраструктуры под управлением платформы Windows. (Википедия)

Для работы с WMI Framework .NET предоставляет сборку System.Management.dll и одноименным неймспейсом.

Работа с WMI начинается с класса ManagementScope, который предназначен для подключению к серверу WMI, как локального компьютера, так и удаленного. Основной конструктор этого класса принимает 2 параметра:
  1. path - путь для подключения;
  2. options - параметры подключения.
Параметр path обычно: string.Format(@"\\{0}\root\cimv2", host). Пусть содержит хост компьютера к которому нужно подключиться, и путь неймспейса WMI (имеет иерархическую структуру). Имеется много нейсмпейсов, но наиболее используемый cimv2.
Параметр options содержит следующие поля:
  • Username - имя пользователя Windows.
  • Password/SecurePassword - пароль пользователя Windows.
  • Другия параметы - не использовал.
После создания объекта, для того чтобы подключения к WMI нужно вызвать метод Connect.
Исходный код подключения к WMI:
ConnectionOptions options = new ConnectionOptions();
options.Username = username;
options.Password = password;
scope = new ManagementScope(string.Format("\\\\{0}\\root\\cimv2", host),
    options);
scope.Connect();
Свойство IsConnected возвращает состояние подключения.
Важно: класс ManagementScope не имеет метода для разрыва связи, для того чтобы переподключиться, ножно повторно вызвать метод Connect.

После создания подключения, мы можем начать запрашивать различную информацию от WMI.
Для этого существует класс SelectQuery. В конструкторе ему передается строка с 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 "]);
}

Таким вот нехитрым способом можно получить с компа очень много системной информации.

2 комментария:

  1. А если во время выполнения запроса он зависает есть ли возможность его отменить ?

    ОтветитьУдалить
  2. Можно, например, запускать запрос в отдельном потоке.

    ОтветитьУдалить