给定一个硬盘号,我怎样才能得到制造商的序列号?

本文关键字:制造商 序列号 一个 硬盘 | 更新日期: 2023-09-27 18:06:41

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

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

在Stackoverflow中有许多关于如何使用WMI检索制造商序列号的例子和Q/A,然而所有这些问题和答案都是针对CURRENT驱动器的,而Win32_PhysicalMediaWin32_DiskDrive类似乎没有暴露一个属性,我可以使用WHERE来查询给定驱动器号或其系统序列号的特定驱动器的序列号

我打开解决方案意味着中间步骤,如"首先需要得到一个设备id从驱动器就可以使用这个值来查询WMI "(当然最好是使用WinAPI函数避免负面的性能影响的 WMI 调用),问题是我不知道如何做一个需要检索引用,因为卷管理功能似乎没有一个有用的函数来检索磁盘驱动器信息,只是GetVolumeInformation函数,我只能检索系统的串行信息,这是一个值,我不能用它来对WMI进行查询,以及磁盘标题,我也不能使用,因为不止一个磁盘可以有相同的标题…

给定一个硬盘号,我怎样才能得到制造商的序列号?

没有简单的方法可以根据卷字母获得硬盘驱动器的序列号-例如,在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,获取硬件信息就不容易了——你很可能不得不自己编写库来与硬件交互。