Сегодня речь пойдет о работе с 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)
{
//...Код
}