我熟悉VolumeSerialNumber,我需要磁盘ID,如diskpart所示:
WD My Passport 0740 USB设备 磁盘ID:08B29B51 类型:USB 状态:在线 路径:0 目标:0 LUN ID:0 位置路径:无法使用 目前的只读状态:没有 只读:没有 启动盘:没有 页面文件磁盘:没有 休眠文件磁盘:没有 Crashdump磁盘:没有 集群磁盘:否
我无法在网络(WMI)或支持此请求的论坛上找到任何内容。 有人有想法吗?
答案 0 :(得分:3)
查看Win32_DiskDrive WMI类。它有一个名为Signature
的字段,其中包含此ID。但请注意,这是不是字符串,而是数字。如果您想匹配您在DiskPart中看到的内容,则必须将该数字显示为十六进制字符串(signature.ToString("X")
)
此处打印驱动器签名的代码:
public void PrintDiskDriveSignature()
{
var searcher = new ManagementObjectSearcher
(@"\\localhost\ROOT\CIMv2", "select * from Win32_DiskDrive");
var drives = searcher.Get();
foreach (var drive in drives)
{
string name = drive["Name"].ToString();
uint signature = (uint) drive["Signature"];
Console.WriteLine("{0}: {1}", name, signature.ToString("X"));
}
}
答案 1 :(得分:1)
这是我为从Driveletter获取DiskID而创建的方法。 可能是更好的方法来做到这一点,但现在这对我有用。 谢谢你的帮助。
public static string GetDiskID(char Drive) { uint volumeSerialNumber = 0; bool DriveFound = false; foreach (ManagementObject drive in new ManagementObjectSearcher("select DeviceID, Signature from Win32_DiskDrive").Get()) { foreach (ManagementObject partition in new ManagementObjectSearcher(String.Format("associators of {{Win32_DiskDrive.DeviceID='{0}'}} where AssocClass = Win32_DiskDriveToDiskPartition", drive["DeviceID"])).Get()) { if (partition != null) { ManagementObject logical = new ManagementObjectSearcher(String.Format("associators of {{Win32_DiskPartition.DeviceID='{0}'}} where AssocClass = Win32_LogicalDiskToPartition", partition["DeviceID"])).First(); if (logical != null) { if (logical["Name"] != null) { string logicalName = logical["Name"].ToString(); if (logicalName[0] == Drive) { volumeSerialNumber = (uint)drive["Signature"]; DriveFound = true; break; } } } } } if (DriveFound) break; } var serial = volumeSerialNumber.ToString("x"); while (serial.Length < 8) { serial = serial.Insert(0, "0"); } return serial.ToUpper(); }