C# 开发,如何读取电脑所有硬盘准确SN码?

网上查了很多,都是通过win的ManagementClass中Win32_PhysicalMedia或者Win32_PhysicalMedia来获取要硬盘SerialNumber和PNPDeviceID。
但是这种方法只能准确读出系统盘的SN码,对于挂接的硬盘无法获取(能读到信息,但绝不是SN码)。个人感觉上述方法读到的是驱动而不是硬盘本身。
有没有什么方法可以解决这个问题?
PS:像AIDA64这种软件是怎么准确读到硬盘SN码的?提供个研究方向也好。

打开cmd后输入wmic diskdrive get serialnumber

img

想了半天哈哈哈哈哈
wmic diskdrive get serialnumber 就可以获取 感谢楼上 学到了

使用系统的动态库,读取不就可以了吗。明天找找发出来

先添加引用 System.Management


using System;
using System.Management;
using System.Runtime.InteropServices;
using System.Text;
namespace Sunmast.Hardware
{
    class Program
    {
        static void Main(string[] args)
        {
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_PhysicalMedia");
            String strHardDiskID = null;
            foreach (ManagementObject mo in searcher.Get())
            {
                strHardDiskID = mo["SerialNumber"].ToString().Trim();
                break;
            }
            Console.WriteLine("SerialNumber:" + strHardDiskID);
        }
    }
}






public string GetHardDiskSerialNumber()
{
    try
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
        string sHardDiskSerialNumber = "";
        foreach (ManagementObject mo in searcher.Get())
        {
            sHardDiskSerialNumber = mo["SerialNumber"].ToString().Trim();
            break;
        }
        return sHardDiskSerialNumber;
    }
    catch
    {
        return "";
    }
}


fileapi.h
可以试试这个函数GetVolumeInformationA
--
或者代码
SELECT * FROM Win32_LogicalDisk
SELECT * FROM Win32_DiskDrive


using System.Management;
public string GetHDDSerialNumber(string drive)
{

    if (drive == "" || drive == null)
    {
        drive = "C";
    }

    ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"" + drive +":\"");

    disk.Get();

    return disk["VolumeSerialNumber"].ToString();
}

创建一个类来存储有关硬盘的信息

class HardDrive
{
 private string model = null;
 private string type = null;
 private string serialNo = null; 
 public string Model
 {
  get {return model;}
  set {model = value;}
 } 
 public string Type
 {
  get {return type;}
  set {type = value;}
 } 
 public string SerialNo
 {
  get {return serialNo;}
  set {serialNo = value;}
 }
}

查询 Win32_DiskDrive

ManagementObjectSearcher searcher = new
 ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");

foreach(ManagementObject wmi_HD in searcher.Get())
{
 HardDrive hd = new HardDrive();
 hd.Model = wmi_HD["Model"].ToString();
 hd.Type  = wmi_HD["InterfaceType"].ToString();
 hdCollection.Add(hd);
}

从 Win32_PhysicalMedia 提取序列号

searcher = new
 ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");

int i = 0;
foreach(ManagementObject wmi_HD in searcher.Get())
{
 // get the hard drive from collection
 // using index
 HardDrive hd = (HardDrive)hdCollection[i];

 // get the hardware serial no.
 if (wmi_HD["SerialNumber"] == null)
  hd.SerialNo = "None";
 else
  hd.SerialNo = wmi_HD["SerialNumber"].ToString();

 ++i;
}

显示硬盘信息


```c#
foreach(HardDrive hd in hdCollection)
{
 Console.WriteLine("Model\t\t: " + hd.Model);
 Console.WriteLine("Type\t\t: " + hd.Type);
 Console.WriteLine("Serial No.\t: " + hd.SerialNo);
 Console.WriteLine();
}

```