Получение информации об USB накопителях подключенных к ПЭВМ через WMI

      Рассмотрим пример получения информации о подключенных 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


Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!