c# - 如何通过序列号获取CD/DVD-ROM盘符

标签 c# drive

我正在尝试使用 Primera 光盘复制器提供的 PTRobot API 进行交互。他们的 API 返回有关机器人中记录器驱动器的信息,但缺少的关键部分是驱动器号。

他们返回的信息是型号名称、固件和序列号。

我需要区分一个单元中的多个相同驱动器,序列号是提供的唯一唯一值。

我发现了很多相反的例子(使用驱动器号来获取型号或序列号),但它们看起来都无法翻转以供我使用。

最佳答案

听起来您可以获取序列号与您正在搜索的驱动器匹配的驱动器,然后获取它的分区,并为每个分区从逻辑驱动器获取它的驱动器号。

例如:

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";
}

关于c# - 如何通过序列号获取CD/DVD-ROM盘符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53677688/

相关文章:

c# - 将 System.Windows.Media.Color 转换为 System.Drawing.Color

c# - 附加行为的继承

javascript - 嵌入谷歌驱动器选择器作为页面的一部分

pdf - 在 Google 中从 PDF 中获取文本

json - 用于托管 JSON 的 Google Drive 'host' 终止(2016 年 8 月)

c# - 检测 UWP 应用中存在哪些 API

c# - 在 .NET 1.1 中获取编码列表

c# - 程序卸载时调用函数/Api

c# - 设置驱动器卷标

windows-services - 如何在 Windows 服务中为 Clearcase View 映射网络驱动器?