我正在尝试使用 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/