如何得到硬盘序列号?.NET版本[C#]

8 篇文章 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);

下面是全部代码:

注:

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

最终版权归陆麟所有,任何人不得将此代码占为己有。

--------------- updated on 2005/06/06

http://blog.sunmast.com/Sunmast/archive/2005/06/06/2632.aspx

这里有老外写了更完美的例子,我这次采取了较“安全”的做法,采用C++.NET直接把它包装成托管的dll,这样C#这边不需要用P/Invoke就能使用,C++那边需要改动和增加的代码量都减到了最少,NT下不要求管理员权限,并且支持Win 98/ME系统。

源码(in C++)和例子(in C#)在这里下载

P.S.
准备用这个东西来保护你的托管程序集不被非法使用?事实上是不可行的。就算有也很弱。除了混淆器以外,唯一能提供有效保护的方法就是使用非托管语言(比如C++)来编写关键代码。在这里,也是C++.NET发挥价值的地方。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值