给定硬盘信件,我如何获得制造商序列号?

时间:2016-09-12 09:35:09

标签: c# .net vb.net winapi wmi

我在尝试确定驱动器的制造商序列号时遇到了很多麻烦,这可能是最快的方法(而不是调用 WMI )。

我可以用来查询制造商序列号的信息是驱动器号(例如 C:\ )或操作系统分配给驱动器的数字序列号(例如。 4030771280 ),我通过指定一个名为 GetVolumeInformation 功能的驱动器号来检索该信息。

Stackoverflow中有很多关于如何使用 WMI 检索制造商序列号的示例和问答,但所有这些问题和答案都是针对 CURRENT 驱动器,并且 Win32_PhysicalMedia Win32_DiskDrive 类似乎没有公开我可以使用WHERE来查询的属性给定驱动器号或其系统序列号的特定驱动器的序列号

我愿意接受中间步骤的解决方案,例如“首先你需要从驱动器号中获取设备ID然后你可以使用该值来查询WMI ”(当然最好使用WinAPI)功能,以避免 WMI 调用的负面性能影响,问题是我不知道如何做引用所需的检索,因为 Volume Management Functions 似乎没有一个有用的函数来从驱动器号检索磁盘信息,只有GetVolumeInformation函数,我只能检索系统的序列信息,这是我不能用来查询的值WMI和磁盘标题,我不能使用,因为多个磁盘可能具有相同的标题...

1 个答案:

答案 0 :(得分:1)

根据Volume letter,没有简单的方法来获取硬盘的序列号 - 例如在案例或RAID 5中,有多个物理驱动器组成音量。获取硬盘驱动器的序列号将更容易:

// A little bit modified code from https://stackoverflow.com/questions/24022130/generate-activation-key-from-hardware-id
public string identifier(string wmiClass, string wmiProperty)
        {
            string result = "";
            System.Management.ManagementClass mc = new System.Management.ManagementClass(wmiClass);
            System.Management.ManagementObjectCollection moc = mc.GetInstances();
            foreach (System.Management.ManagementObject mo in moc)
            {
                //Only get the first one
                if (result == "")
                {
                    try
                    {
                        result = mo[wmiProperty].ToString();
                        break;
                    }
                    catch
                    {
                    }
                }
            }
            return result;
        }

并使用它:

identifier("Win32_DiskDrive", "SerialNumber"));

此源代码不会为您提供所需内容,但可能会找到解决方案。

编辑:没有WMI,没有简单的方法来获取硬件信息 - 您很可能必须编写自己的库来与硬件进行交互。