【问题标题】:Diskpart UniqueID - C# how to get that idDiskpart UniqueID - C# 如何获取该 ID
【发布时间】:2015-01-13 10:54:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# wmi disk unique-id


    【解决方案1】:

    查看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"));
        }
    }
    

    【讨论】:

    • 那是因为 D: 不是磁盘驱动器,它是磁盘驱动器上的逻辑卷。
    【解决方案2】:

    这是我创建的用于从 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();
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多