![](/img/trans.png)
[英]C# and diskpart: how to select by disk label and not by a number?
[英]Diskpart UniqueID - C# how to get that id
我熟悉VolumeSerialNumber,我需要与diskpart中所示相同的磁盘ID:
WD My Passport 0740 USB设备磁盘ID:08B29B51类型:USB状态:联机路径:0目标:0 LUN ID:0位置路径:不可用当前只读状态:否只读:否引导盘:否Pagefile磁盘:否休眠文件磁盘:否故障转储磁盘:否群集磁盘:否
我在网络(WMI)或论坛上找不到支持此请求的任何内容。 有人有主意吗?
签出Win32_DiskDrive WMI类。 它有一个名为Signature
的字段,其中包含此ID。 但是请注意,这不是string ,而是数字。 如果要匹配在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"));
}
}
这是我创建的用于从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(); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.