C # USB flash PNPDeviceID отличается в некоторых системах - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь получить идентификатор флэш-накопителя USB, используя этот код:

ManagementObjectSearcher theSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'");
foreach (ManagementObject currentObject in theSearcher.Get())
{                    
    Console.WriteLine("PNPDeviceID: " + currentObject["PNPDeviceID"]);                    
}

На большинстве компьютеров я получаю что-то вроде этого: USBSTOR \ DISK & VEN_TQ & PROD_S1 & REV_1.10 \ 11100049977 & 0

, нов некоторых системах для одного и того же USB-накопителя я получаю что-то вроде этого: USBSTOR \ DISK & VEN_TQ & PROD_S1 & REV_1.10 \ 6 & 2D2B8A01 & 0 & 11100049977 & 0

Обратите внимание, что часть 6 & 2D2B8A01 & 0 & изменяется в зависимости от порта, который вставляется в USB-накопитель.

Как получить первую версию идентификатора в каждой системе независимо от того, в какой порт вставлен USB-накопитель?

UPDATE 1 : при использовании Win32_DiskDrive USB-накопительобнаружен на каждом ПК.Но при использовании Win32_USBHub USB-накопитель не обнаруживается на проблемных ПК.

ОБНОВЛЕНИЕ 2 : при использовании класса SystemUSBDrives из этого ответа , на проблемных ПК я получаю такой вывод:

Порт 1:

SystemUSBDrives PNPDeviceID: USBSTOR\DISK&VEN_TQ&PROD_S1&REV_1.10\6&2D2B8A01&0&11100049977&0
SystemUSBDrives DeviceID: \\.\PHYSICALDRIVE2
SystemUSBDrives SerialNumber:  
SystemUSBDrives VolumeSerialNumber: D6533504

Порт 2:

SystemUSBDrives PNPDeviceID: USBSTOR\DISK&VEN_TQ&PROD_S1&REV_1.10\6&7A722D3&0&11100049977&0
SystemUSBDrives DeviceID: \\.\PHYSICALDRIVE2
SystemUSBDrives SerialNumber:  
SystemUSBDrives VolumeSerialNumber: D6533504

Порт 3:

SystemUSBDrives PNPDeviceID: USBSTOR\DISK&VEN_TQ&PROD_S1&REV_1.10\6&32CECE73&0&11100049977&0
SystemUSBDrives DeviceID: \\.\PHYSICALDRIVE2
SystemUSBDrives SerialNumber:  
SystemUSBDrives VolumeSerialNumber: D6533504

Использование этого на других компьютерах возвращает правильный SystemUSBDrivesЗначение SerialNumber.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Я закончил тем, что удалил ParentIdPrefix из строки, и он хорошо работает для моего сценария:

public static string RemoveParentIdPrefix(string pnpDeviceId)
{
    int iSplit = pnpDeviceId.LastIndexOf("\\", StringComparison.InvariantCulture);
    string part1 = pnpDeviceId.Substring(0, iSplit);
    string part2 = pnpDeviceId.Substring(iSplit);
    int ampersandCount = 0;
    for (int i = part2.Length - 1; i >= 0; i--)
    {
        if (part2[i] == '&')
        {
            ampersandCount++;
        }

        if (ampersandCount == 2)
        {
            part2 = part2.Substring(i + 1);
            break;
        }
    }
    return part1 + "\\" + part2;
}
0 голосов
/ 04 октября 2018

С DriveInfo вы можете получить всю информацию о драйвере.

смотрите здесь DriveType

 var drivers = DriveInfo.GetDrives() //all Drivers
                    .Where(x => x.DriveType == DriveType.Removable); //Filter Removable Drivers

enter image description here

или если вам нужен PNPDeviceID

var deviceSearcher =
            new ManagementObjectSearcher("SELECT * FROM Win32_USBHub");
        foreach (var o in deviceSearcher.Get())
        {
            var usbDevice = (ManagementObject)o;
            var pnpDeviceId = usbDevice.Properties["PNPDeviceID"].Value.ToString();
        }
...