C#: Простой способ работы с WMI запросами

Сегодня речь пойдет о работе с WMI запросами ОС Windows. Кто не знает — данные запросы позволяют получать информацию о системе и оборудовании, причем достаточно обширную (серийные номера, объем памяти, производитель, название устройств и прочие). Так же я приведу пример функции, позволяющей легко совершать даные запросы и обрабатывать необходимые данные.


Для работы нам понадобятся неймспейсы:

using System.Management;
using Microsoft.Win32;
using System.Runtime.InteropServices;

Сами запросы WMI по своей структуре совпадают со структурой запросов SQL, поэтому если есть опыт работы с SQL запросами, тот с WMI запросами разбираться Вам не придется.

Вот пример самого простого запроса:

SELECT Name FROM Win32_DiskDrive

Что и где брать в деталях можно посмотреть тут. По указанной ссылке приведено очень подробное описание всех «таблиц» и их «полей». Однако иногда некоторые «поля» не срабатывают (возможно связанно это с причудами той или иной железки или версии ОС… но речь не об этом).

Код же полноценного запроса имеет вид:

string Q = "SELECT Name FROM Win32_DiskDrive";
string result = String.Empty;
ManagementObjectSearcher searcher = new ManagementObjectSearcher(Q);
foreach (ManagementObject obj in searcher.Get())
{
   result = obj["Name"].ToString().Trim();
}

Как видно из кода в итоге мы получаем массив, элементами которого являются запрашиваемые «поля» (в нашем случае ‘Name’).

Для более удобной работы рекомендую использовать списки типа string и следующую функцию:

private List<string> GetDeviceArray(string FromWIN32Class, string ClassItemAdd)
{
  List<string> result = new List<string>();
  ManagementObjectSearcher searcher = 
           new ManagementObjectSearcher("SELECT * FROM " + FromWIN32Class);
  try  {
    foreach (ManagementObject obj in searcher.Get())
    {
      result.Add(obj[ClassItemAdd].ToString().Trim());
    }
  }
  catch (Exception ex)
  {
     MessageBox.Show(ex.Message);
  }
  return result;
}

И более правильный вариант использования предыдущего примера:

List<string> res = GetDeviceArray("Win32_DiskDrive", "Name");
if (res.Count > 0)
{
   for (int i = 0; i < res.Count; ++i)
      MessageBox.Show(res[i]);
}

Примечание: Данный вариант более правильный так как на компьютере может быть установленно более 1ого винчестера, а следовательно получить нужно имена всех. В связи с этим стоит заранее убедится сколько значений может вернуть запрос: одно или, возможно, несколько.

Так же в вышеупомянутую функцию можно добавить передачу параметров для фильтра "WHERE", например если нужно получить имена винчестеров у которых статус "Error". Объявление функции примет вид:

private List<string> GetDeviceArray(
             string  FromWIN32Class,
             string ClassItemAdd,
             string WhereKey,
             string WhereKeyValue)
{
//...Код 
}
Запись опубликована в рубрике C# с метками , , . Добавьте в закладки постоянную ссылку.