代码改变世界

如何获得硬盘序列号

2008-07-18 14:31  Virus-BeautyCode  阅读(3862)  评论(0编辑  收藏  举报
本文是我摘抄网上的东西,谢谢



硬盘序列号(Serial Number)不等于卷标号(Volume Name),后者虽然很容易得到,但是格式化分区后就会重写,不可靠。遗憾的是很多朋友往往分不清这一点。


要得到硬盘的物理序列号,可以通过WMI,也就是Win32_PhysicalMedia.SerialNumber。可惜的是Windows 98/ME的WMI并不支持这个类,访问时会出现异常。


受陆麟的例子的启发,我们还可以通过S.M.A.R.T.接口,直接从RING3调用API DeviceIoControl()来获取硬盘信息,而不需要写VXD或者DRIVER。这样这个问题就解决了,我对它进行了封装,大量使用了 P/Invoke技术,一个完整的Library。支持Windows 98-2003。
使用上很简单:


HardDiskInfo hdd = AtapiDevice.GetHddInfo(0); // 第一个硬盘
Console.WriteLine("Module Number: {0}", hdd.ModuleNumber);
Console.WriteLine("Serial Number: {0}", hdd.SerialNumber);
Console.WriteLine("Firmware: {0}", hdd.Firmware);
Console.WriteLine("Capacity: {0} M", hdd.Capacity);


下面是全部代码:


using System;
using System.Runtime.InteropServices;
using System.Text;


namespace Sunmast.Hardware
{
[Serializable]
public struct HardDiskInfo
{
/// <summary>
/// 型号
/// </summary>

public string ModuleNumber;
/// <summary>
/// 固件版本
/// </summary>

public string Firmware;
/// <summary>
/// 序列号
/// </summary>

public string SerialNumber;
/// <summary>
/// 容量,以M为单位
/// </summary>

public uint Capacity;
}



Internal Structs


/// <summary>
/// ATAPI驱动器相关
/// </summary>

public class AtapiDevice
{


DllImport


GetHddInfo
}

}




注:


在Windows 98/ME中,S.M.A.R.T并不缺省安装,请将SMARTVSD.VXD拷贝到%SYSTEM%\IOSUBSYS目录下。
在Windows 2000/2003下,需要Administrators组的权限。
不要在装有SCSI硬盘的机器上尝试了,因为SCSI硬盘根本不存在序列号。