主题:关于使用WMI读取硬盘序列号的疑问的一些说明
本坛有几个相关的帖子
比如本人的:
http://bbs.pfan.cn/post-307523.html
其他网友的:
http://bbs.pfan.cn/post-282435-1.html
结果引起较大争论,有的人可以获取,有的人不能。其实还是有些问题没有说清楚,所以此处补充一下。
1、硬盘SN是什么?
标准中规定IDE接口的硬盘中有一个电子标签(SCSI硬盘标准好象没有这个,所以不能对它取硬盘SN),实际就是若干字节的ascii码,规定不同硬盘标签不一样,类似于网卡的MAC。
但是实际应用中据说三星硬盘没有序列号(或者说电子标签为空),不过这一点我不能确定,我怀疑可是使用后面描述的因为没有考虑到首字符为空格造成不能正确获取(这实际上是电子标签不标准)。
2、DOS下的获取
学过微机原理的都知道,访问硬件时一个通常的方法是使用IN和OUT指令往特定端口读写数据,获取硬盘序列号也是使用这个方法,具体就不多说了。
3、windows下为何变成一个难题
因为windows不让直接访问硬件,而此问题又必须访问硬件才行,我们去下载或找到的别人的代码或DLL什么的都是使用这个原理的,但是这么干难度真的非常大,很多玩VFP的朋友不具有这个能力。
4、为什么使用WMI能行?
微软自己也要查这个SN,所以在WMI中加入了这个功能,但是去调用时需要注意WMI是如何提供此类信息的:SELECT这个SQL命令,当成一个数据库表来访问。
5、什么版本的windows可以用WMI?
Windows 2K/XP和Windows 98 都支持WMI;如果为NT 4.0和Windows 95加上了 Service Pack 4或更高版本,NT 4.0和Win95也支持WMI。VISTA和WIN7当然也行。
可以参考这里: http://baike.baidu.com/view/442461.htm
6、访问WMI需要权限
如果没有权限可能就不能得到正确的结果,这一点就是不使用WMI方法也是一样的。
7、WMI的版本差异
有的方法在XP下面能工作,在win7或vista下面就不行,原因就是版本的问题。
综上,想要很简单的找到一个完美的方法几乎不可能,本人总结了一下WMI的使用要点如下(相关程序发在2楼)
如果硬盘号前面不是空格,直接使用WMI的最好,但是需要判断是XP还是vista或WIN7,XP就使用WMI的方法1的直接结果,否则最好使用WMI的方法2进行转换。
如果硬盘号前面是空格,在XP下面使用WMI不能得到正确结果,需要使用传统方法,而在vista或WIN7下面,传统方法需要关闭UAC才能得到正确结果,所以应该使用WMI来突破权限的限制,建议使用WMI的方法2,因为不用进行UAC的判断(这点很重要,也可能没关UAC但是运行时使用了管理员权限),只有方法2才结果才是固定的。
综上可得最佳方案:
1、获取操作系统各类;
2、如果是2000、XP或2003则使用传统方法;
3、如果是VISTA或WINDOWS 7则使用WMI的方法2,并且需要对结果进行转换(其实传统方法一样要转换的!)。
比如本人的:
http://bbs.pfan.cn/post-307523.html
其他网友的:
http://bbs.pfan.cn/post-282435-1.html
结果引起较大争论,有的人可以获取,有的人不能。其实还是有些问题没有说清楚,所以此处补充一下。
1、硬盘SN是什么?
标准中规定IDE接口的硬盘中有一个电子标签(SCSI硬盘标准好象没有这个,所以不能对它取硬盘SN),实际就是若干字节的ascii码,规定不同硬盘标签不一样,类似于网卡的MAC。
但是实际应用中据说三星硬盘没有序列号(或者说电子标签为空),不过这一点我不能确定,我怀疑可是使用后面描述的因为没有考虑到首字符为空格造成不能正确获取(这实际上是电子标签不标准)。
2、DOS下的获取
学过微机原理的都知道,访问硬件时一个通常的方法是使用IN和OUT指令往特定端口读写数据,获取硬盘序列号也是使用这个方法,具体就不多说了。
3、windows下为何变成一个难题
因为windows不让直接访问硬件,而此问题又必须访问硬件才行,我们去下载或找到的别人的代码或DLL什么的都是使用这个原理的,但是这么干难度真的非常大,很多玩VFP的朋友不具有这个能力。
4、为什么使用WMI能行?
微软自己也要查这个SN,所以在WMI中加入了这个功能,但是去调用时需要注意WMI是如何提供此类信息的:SELECT这个SQL命令,当成一个数据库表来访问。
5、什么版本的windows可以用WMI?
Windows 2K/XP和Windows 98 都支持WMI;如果为NT 4.0和Windows 95加上了 Service Pack 4或更高版本,NT 4.0和Win95也支持WMI。VISTA和WIN7当然也行。
可以参考这里: http://baike.baidu.com/view/442461.htm
6、访问WMI需要权限
如果没有权限可能就不能得到正确的结果,这一点就是不使用WMI方法也是一样的。
7、WMI的版本差异
有的方法在XP下面能工作,在win7或vista下面就不行,原因就是版本的问题。
综上,想要很简单的找到一个完美的方法几乎不可能,本人总结了一下WMI的使用要点如下(相关程序发在2楼)
如果硬盘号前面不是空格,直接使用WMI的最好,但是需要判断是XP还是vista或WIN7,XP就使用WMI的方法1的直接结果,否则最好使用WMI的方法2进行转换。
如果硬盘号前面是空格,在XP下面使用WMI不能得到正确结果,需要使用传统方法,而在vista或WIN7下面,传统方法需要关闭UAC才能得到正确结果,所以应该使用WMI来突破权限的限制,建议使用WMI的方法2,因为不用进行UAC的判断(这点很重要,也可能没关UAC但是运行时使用了管理员权限),只有方法2才结果才是固定的。
综上可得最佳方案:
1、获取操作系统各类;
2、如果是2000、XP或2003则使用传统方法;
3、如果是VISTA或WINDOWS 7则使用WMI的方法2,并且需要对结果进行转换(其实传统方法一样要转换的!)。