网上查了很多,都是通过win的ManagementClass中Win32_PhysicalMedia或者Win32_PhysicalMedia来获取要硬盘SerialNumber和PNPDeviceID。
但是这种方法只能准确读出系统盘的SN码,对于挂接的硬盘无法获取(能读到信息,但绝不是SN码)。个人感觉上述方法读到的是驱动而不是硬盘本身。
有没有什么方法可以解决这个问题?
PS:像AIDA64这种软件是怎么准确读到硬盘SN码的?提供个研究方向也好。
打开cmd后输入wmic diskdrive get serialnumber
想了半天哈哈哈哈哈
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();
}
```