1

我熟悉 VolumeSerialNumber,我需要与 diskpart 中所示相同的磁盘 ID:

WD My Passport 0740 USB 设备 磁盘 ID:08B29B51 类型:USB 状态:在线路径:0 目标:0 LUN ID:0 位置路径:不可用当前只读状态:无只读:无引导盘:无页面文件磁盘:无休眠文件磁盘:否 Crashdump 磁盘:否群集磁盘:否

我在网络 (WMI) 或论坛上找不到任何支持此请求的内容。有人有想法吗?

4

2 回答 2

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"));
    }
}
于 2014-11-16T13:17:46.850 回答
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();
   }
于 2014-11-16T16:21:07.823 回答