Рассмотрим пример получения информации о подключенных USB накопителях с использованием WMI (Windows Management Instrumentation) и его класса Win32_DiskDrive. Класс Win32_DiskDrive позволяет получить информацию о накопителях, подключенных к компьютеру, точнее технических параметрах. В состав класса входят 49 свойств, которые доступны только для чтения. Класс находится в пространстве имен CIMV2, MOF файл — Cimwin32.mof, динамическая библиотека Cimwin32.dll, провайдер Win32.
Так как данный класс возвращает информацию обо всех накопителях, а необходимо выделить только USB. Воспользуемся свойством «InterfaceType», содержащее информацию о типе интерфейса, через который подключено устройство.
Возможные значения:
- SCSI
- HDC
- IDE
- USB
- 1394
Функционал данного примера:
- Получение буквы накопителя, которую присвоила операционная система;
- Получение модели устройства;
- Ven;
- Prod;
- Rev;
- Серийный номер;
- Полный объем накопителя;
- Свободное пространство на накопителе;
- Используемое пространство.
Добавьте на главную форму, два компонента:
- ListBox – Для отображения информации о USB накопителях;
- Button – Запуск получения информации о USB накопителях.
У вас получится приведенный ниже пример:
Сделайте двойной клик левой клавишей мыши по компоненту «Button1», вы перейдете в автоматически созданный метод «button1_Click». Добавьте приведенный ниже листинг, в данный метод.
string diskName = string.Empty;
//предварительно очищаем список
listBox1.Items.Clear();
//Получение списка накопителей подключенных через интерфейс USB
foreach (System.Management.ManagementObject drive in
new System.Management.ManagementObjectSearcher(
"select * from Win32_DiskDrive where InterfaceType='USB'").Get())
{
//Получаем букву накопителя
foreach (System.Management.ManagementObject partition in
new System.Management.ManagementObjectSearcher(
"ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + drive["DeviceID"]
+ "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition").Get())
{
foreach (System.Management.ManagementObject disk in
new System.Management.ManagementObjectSearcher(
"ASSOCIATORS OF {Win32_DiskPartition.DeviceID='"
+ partition["DeviceID"]
+ "'} WHERE AssocClass = Win32_LogicalDiskToPartition").Get())
{
//Получение буквы устройства
diskName = disk["Name"].ToString().Trim();
listBox1.Items.Add("Буква накопителя=" + diskName);
}
}
//Получение модели устройства
listBox1.Items.Add("Модель=" + drive["Model"]);
//Получение Ven устройства
listBox1.Items.Add("Ven=" +
parseVenFromDeviceID(drive["PNPDeviceID"].ToString().Trim()));
//Получение Prod устройства
listBox1.Items.Add("Prod=" +
parseProdFromDeviceID(drive["PNPDeviceID"].ToString().Trim()));
//Получение Rev устройства
listBox1.Items.Add("Rev=" +
parseRevFromDeviceID(drive["PNPDeviceID"].ToString().Trim()));
//Получение серийного номера устройства
string serial = drive["SerialNumber"].ToString().Trim();
//WMI не всегда может вернуть серийный номер накопителя через данный класс
if (serial.Length > 1)
listBox1.Items.Add("Серийный номер=" + serial);
else
//Если серийный не получен стандартным путем,
//Парсим информацию Plug and Play Device ID
listBox1.Items.Add("Серийный номер=" +
parseSerialFromDeviceID(drive["PNPDeviceID"].ToString().Trim()));
//Получение объема устройства в гигабайтах
decimal dSize = Math.Round((Convert.ToDecimal(
new System.Management.ManagementObject("Win32_LogicalDisk.DeviceID='"
+ diskName + "'")["Size"]) / 1073741824), 2);
listBox1.Items.Add("Полный объем=" + dSize + " gb");
//Получение свободного места на устройстве в гигабайтах
decimal dFree = Math.Round((Convert.ToDecimal(
new System.Management.ManagementObject("Win32_LogicalDisk.DeviceID='"
+ diskName + "'")["FreeSpace"]) / 1073741824), 2);
listBox1.Items.Add("Свободный объем=" + dFree + " gb");
//Получение использованного места на устройстве
decimal dUsed = dSize - dFree;
listBox1.Items.Add("Используемый объем=" + dUsed + " gb");
listBox1.Items.Add("");
}
Так же в обозревателе решений добавьте ссылку на библиотеку «System.Management». Так же добавьте в листинг главной формы, четыре дополнительных метода.
private string parseSerialFromDeviceID(string deviceId)
{
string[] splitDeviceId = deviceId.Split('\');
string[] serialArray;
string serial;
int arrayLen = splitDeviceId.Length - 1;
serialArray = splitDeviceId[arrayLen].Split('&');
serial = serialArray[0];
return serial;
}
private string parseVenFromDeviceID(string deviceId)
{
string[] splitDeviceId = deviceId.Split('\');
string Ven;
//Разбиваем строку на несколько частей.
//Каждая чаcть отделяется по символу &
string[] splitVen = splitDeviceId[1].Split('&');
Ven = splitVen[1].Replace("VEN_","");
Ven = Ven.Replace("_"," ");
return Ven;
}
private string parseProdFromDeviceID(string deviceId)
{
string[] splitDeviceId = deviceId.Split('\');
string Prod;
//Разбиваем строку на несколько частей.
//Каждая чаcть отделяется по символу &
string[] splitProd = splitDeviceId[1].Split('&');
Prod = splitProd[2].Replace("PROD_", ""); ;
Prod = Prod.Replace("_", " ");
return Prod;
}
private string parseRevFromDeviceID(string deviceId)
{
string[] splitDeviceId = deviceId.Split('\');
string Rev;
//Разбиваем строку на несколько частей.
//Каждая чаcть отделяется по символу &
string[] splitRev = splitDeviceId[1].Split('&');
Rev = splitRev[3].Replace("REV_", ""); ;
Rev = Rev.Replace("_", " ");
return Rev;
}
Запустите ваш проект, нажав на клавиатуре, клавишу «F5». Нажмите на единственную кнопку, расположенную на вашей форме. Если у вас имеются подключенные USB накопители, то вы получите по ним информацию. Пример работы программы:
Ссылка для скачивания примера: Rusfolder.net
0.00 (0%) 0 votes












