Как получить букву CD / DVD-ROM по серийному номеру - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь взаимодействовать с Primera Disc Duplicator, используя предоставленный им PTRobot API.Их API возвращает информацию о дисках рекордера в роботизированной системе, но не хватает важной части - это буква диска.

Возвращаемая ими информация - это название модели, прошивка и серийный номер.

Мне нужно различать несколько одинаковых накопителей в устройстве, и серийный номер - единственное предоставленное уникальное значение.

Я нашел много примеров, обращающихся наоборот (используя букву диска, чтобы получить модель или серийный номер), но ни один из них не может быть перевернут для моего использования.

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Похоже, вы могли бы получить диск, серийный номер которого совпадает с тем, который вы ищете, затем получить его разделы, и для каждого раздела получить букву диска от логического диска.

Например:

using System.Collections.Generic
using System.Management;

public static List<string> GetDriveLettersForSerialNumber(string driveSerialNumber)
{        
    var results = new List<string>();
    if (driveSerialNumber == null) return results;

    var drive = new ManagementObjectSearcher(
        "SELECT DeviceID, SerialNumber, Partitions FROM Win32_DiskDrive").Get()
        .Cast<ManagementObject>()
        .FirstOrDefault(device =>
            device["SerialNumber"].ToString().Trim()
                .Equals(driveSerialNumber.Trim(), StringComparison.OrdinalIgnoreCase));

    if (drive == null) return results;

    var partitions = new ManagementObjectSearcher(
        $"ASSOCIATORS OF {{Win32_DiskDrive.DeviceID='{drive["DeviceID"]}'}} " +
        "WHERE AssocClass = Win32_DiskDriveToDiskPartition").Get();

    foreach (var partition in partitions)
    {
        var logicalDrives = new ManagementObjectSearcher(
            "ASSOCIATORS OF {{Win32_DiskPartition.DeviceID=" + 
            $"'{partition["DeviceID"]}'}} " +
            "WHERE AssocClass = Win32_LogicalDiskToPartition").Get();

        foreach (var logicalDrive in logicalDrives)
        {
            var volumes = new ManagementObjectSearcher(
                "SELECT Name FROM Win32_LogicalDisk WHERE " +
                $"Name='{logicalDrive["Name"]}'").Get().Cast<ManagementObject>();

            results.AddRange(volumes.Select(v => v["Name"].ToString()));
        }
    }

    return results;
}

Для CDROM это выглядит намного проще - и «Id», и «SerialNumber» содержатся в одном объекте:

public static string GetDriveLetterForCDROMSerialNumber(string driveSerialNumber)
{
    return new ManagementObjectSearcher(
        "SELECT Id, SerialNumber FROM Win32_CDROMDrive").Get()
        .Cast<ManagementObject>()
        .Where(drive => drive.GetPropertyValue("SerialNumber").ToString().Trim()
            .Equals(driveSerialNumber.Trim(), StringComparison.OrdinalIgnoreCase))
        .Select(drive => drive.GetPropertyValue("Id").ToString())
        .FirstOrDefault() ?? "Unknown";
}
0 голосов
/ 11 декабря 2018

Спасибо за предложения и указание использовать WMI-запросы.Это был просто вопрос, какой из них обладал необходимой мне информацией (Win32_CDROMDrive).Вот мой рабочий код:

public static string GetDriveLetter(string serialNum){
    if (serialNum != null)
    {
        var moc = new ManagementObjectSearcher("SELECT SerialNumber, Drive FROM Win32_CDROMDrive");

        foreach(var mo in moc.Get())
        {
            string driveSerial = (string)mo.GetPropertyValue("SerialNumber");
            if (driveSerial != null)
            {
                if (driveSerial.Trim().Equals(serialNum.Trim(), StringComparison.OrdinalIgnoreCase))
                {
                    return (string)mo.GetPropertyValue("Drive");
                }
            }
        }
    }
    return "Unknown";
}
0 голосов
/ 08 декабря 2018

Вы можете написать подпрограмму для создания словаря накопителей, хэшированных по серийному номеру, проверяя каждый накопитель.Затем у вас есть недостающая информация, необходимая для работы с API PTRobot.

Редактировать:

Из поиска c # получить серийный номер для привода

Код из примера того, как получить серийный номер жесткого диска.Не проверено, поскольку у меня больше нет устройства с Windows

Следующее может помочь вам:

searcher = new
ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");

int i = 0;
foreach(ManagementObject wmi_HD in searcher.Get())
{
 // get the hard drive from collection
// using index
HardDrive hd = (HardDrive)hdCollection[i];

// get the hardware serial no.
if (wmi_HD["SerialNumber"] == null)
 hd.SerialNo = "None";
else
 hd.SerialNo = wmi_HD["SerialNumber"].ToString();

++i;
}
...