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