主题:纯VFP代码实现取硬盘ID等硬件标志[重大更新,不看后悔!]
liupeisong
[专家分:2340] 发布于 2009-08-24 19:14:00
附件中是本人搜集的
VFP读取硬盘序列号(八种途径)更新.rar
好象是来自梅子论坛([url]http://www.meizvfp.com/bbs/index.asp[/url])
从这么多方法来看,其实取硬盘序号现在是个大众化的技术,没有什么特别的。WMI倒是可以好好研究一下
说明:这是利用WINDOWS内置的WMI实现,其实它的功能还远不只这一点,感兴趣的自己查资料吧。这个硬盘序号很多人在找,越搞越复杂了(特别是用VF来实现),特此提供。其实本方法也可用于其他语言的。以下内容保存为一个PRG文件就可以运行了(VISTA或WINDOWS7下必须有管理权限或关闭UAC,这一点和其他方法是一样的)
重磅炸弹(WMI Code Creator v1.0)见7楼,强烈推荐
整理了一下代码,添加了少量功能
2009-09-19修订(关于XP的,原来代码是在VISTA测试的)
**VFP读CPU序号、硬盘序号、网卡MAC地址、硬盘型号、IP地址
LOCAL oWMI AS OBJECT,oLocal AS OBJECT,oHARDWARE AS OBJECT,object1 AS OBJECT,lcCPUID,LcMAC,lcHDID,lcHDINFO,lcIP,lcHDID2
oWMI=CREATEOBJECT("WbemScripting.SWbemLocator")
oLocal=oWMI.ConnectServer(".", "root\cimv2")
*取CPU ID
oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_Processor")
FOR EACH object1 IN oHARDWARE
lcCPUID=object1.Properties_('ProcessorId').VALUE
EXIT
ENDFOR
*取硬盘物理ID
*此方法在XP下面有一个BUG,以即如果硬盘序列是前面有空格的(象我的ST 500G就是),
*在XP下面会取到一个NULL值!但是VISTA下面工作正常
oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_PhysicalMedia")
FOR EACH object1 IN oHARDWARE
lcHDID=object1.Properties_('SerialNumber').VALUE
EXIT
ENDFOR
*取MAC和IP
oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=1")
FOR EACH object1 IN oHARDWARE
LcMAC=object1.Properties_('MACAddress').VALUE
LcIP=object1.Properties_('IPAddress').VALUE
EXIT
ENDFOR
*取硬盘型号
oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_DiskDrive")
FOR EACH object1 IN oHARDWARE
lcHDINFO=object1.Properties_('Model').VALUE
*硬盘物理ID(另一方法)
*此属性在XP和2003下面不存在,VISTA和WIN7可以通过
lcHDID2=object1.Properties_('SerialNumber').VALUE
EXIT
ENDFOR
*显示结果
?'CPU序号:',lcCPUID
*以下两个方法得出结果好象不一样,其实只是第1种已经转换成标准字符串了,第2种是原始形式的(以16进制描述的)
?'硬盘序号:',lcHDID
?'硬盘物理ID(另一方法):',lcHDID2
?'网卡MAC地址:',LcMAC
?'网卡IP地址:',LcIP
?'硬盘型号:',lcHDINFO
最后更新于:2009-09-19 16:07:00
回复列表 (共14个回复)
沙发
ckjing [专家分:10] 发布于 2009-08-31 21:28:00
做个标记,好找
板凳
liupeisong [专家分:2340] 发布于 2009-09-01 21:31:00
转点WMI的资料,算是补充吧!
本人再给一点说明,WMI信息的获取实际上是以查询数据库的格式进行,所以对于VFP还是非常方便的,虽然下面的代码是ASP的,不过也很容易看到懂的。
认识win强大的管理工具——WMI(脚本篇)
日期:2005年10月31日 作者: 查看:[大字体 中字体 小字体]
好长时间没有写东西了,由于本人的文笔不怎么好,所以大家不要笑我。
以下内容均为自己理解的,如有错误之处还请大家指出。
我的技术面很窄,所以以下内容中的代码均为ASP+VBScript。
正文:
----------------------------------------------------------------------------------------------
WMI大家可能都听说过,就是Windows管理工具,看名字就知道他的功能有多么的强大,他可以管理windows的方方面面,从常见的文件操作到硬件管理,都可以通过WMI来实现。
WMI的语法十分简单,对于所有的命名空间、对象等用法几乎一模一样。
一、连接
WMI不仅可以管理本地计算机,也可以管理员成计算机,所以创建WMI的第一步就是连接计算机
Dim k
k = "Microsoft" '赋予命名空间
Set MyWMIObj = GetObject("winmgmts:\\.\root\"&k) '.代表本机
上面是我常用的代码,很简单,MSDN中给我们列出了完整的方法:
On Error Resume Next
Computer = "MyPC"
user = "MyPC\administrator"
pwd = "Password"
k = "Microsoft" '赋予命名空间
set MyWMIObj = CreateObject("WbemScripting.SWbemLocator")
set ProObj = MyWMIObj.ConnectServer(Computer, "root/" & k, user, pwd)
上面的方法让我们了解到如何来管理远程计算机,这样一来我们就可以写出可以集中管理的程序来。
二、枚举
每一个命名空间下都有很多的对象,每个对象我们都可以把它当作集合来处理。
-------------------------------------
DNS
On Error Resume Next
Computer = "MyPC"
user = "MyPC\administrator"
pwd = "Password"
k = "MicrosoftDNS" '赋予命名空间
set MyWMIObj = CreateObject("WbemScripting.SWbemLocator")
set ProObj = MyWMIObj.ConnectServer(Computer, "root/" & k, user, pwd)
Set Domain = ProObj.ExecQuery("Select * from MicrosoftDNS_Zone") '方法看起来很像SQL语法,没错,但是少了很多功能,比如like等等
For Each d in Domain
response.write d.Name & "<br>"
Next
---------------------------------
IIS
On Error Resume Next
Computer = "MyPC"
user = "MyPC\administrator"
pwd = "Password"
k = "MicrosoftIISv2" '赋予命名空间
set MyWMIObj = CreateObject("WbemScripting.SWbemLocator")
set ProObj = MyWMIObj.ConnectServer(Computer, "root/" & k, user, pwd)
Set IIS = ProObj.ExecQuery("Select * from IIsWebService WHERE AnonymousUserName = Adminstrator") 'AnonymousUserName 为站点中的一个元素
For Each d in IIS
response.write d.Name & "<br>"
Next
---------------------------------
用户和组
On Error Resume Next
Computer = "MyPC"
user = "MyPC\administrator"
pwd = "Password"
k = "cimv2" '赋予命名空间
set MyWMIObj = CreateObject("WbemScripting.SWbemLocator")
set ProObj = MyWMIObj.ConnectServer(Computer, "root/" & k, user, pwd)
Set us = ProObj.ExecQuery("Select * from Win32_Account")
For Each d in us
response.write d.Name & "<br>"
Next
---------------------------------
卷和分区
On Error Resume Next
Computer = "MyPC"
user = "MyPC\administrator"
pwd = "Password"
k = "cimv2" '赋予命名空间
set MyWMIObj = CreateObject("WbemScripting.SWbemLocator")
set ProObj = MyWMIObj.ConnectServer(Computer, "root/" & k, user, pwd)
Set disk = ProObj.ExecQuery("Select * from Win32_DiskPartition")
For Each d in disk
response.write d.Name & "<br>"
Next
以上列举了一些不同类型的命名空间的对象的枚举方法,从上面的方法中我们可以看到用法都是一样的。
三、创建
On Error Resume Next
Computer = "MyPC"
user = "MyPC\administrator"
pwd = "Password"
k = "cimv2" '赋予命名空间
set MyWMIObj = CreateObject("WbemScripting.SWbemLocator")
set ProObj = MyWMIObj.ConnectServer(Computer, "root/" & k, user, pwd)
---------------------------------------------------------------------
Set o = objWMIService.Get("Win32_Account")
o.CreateInstanceFromPropertyData ***,***,***,.....
---------------------------------------------------------------------
上面的代码上半部分与第二节中的一样
下面的为创建的代码 其中 ***,***,***,..... 为对象的元素,可参考MSDN
四、修改
On Error Resume Next
Computer = "MyPC"
user = "MyPC\administrator"
pwd = "Password"
k = "cimv2" '赋予命名空间
set MyWMIObj = CreateObject("WbemScripting.SWbemLocator")
set ProObj = MyWMIObj.ConnectServer(Computer, "root/" & k, user, pwd)
---------------------------------------------------------------------
Set colItems = objWMIService.ExecQuery("Select * from Win32_Account where Name = 'Administrator'")
For Each o In colItems
o.Modify ***,***,***,.....
Next
---------------------------------------------------------------------
上面的代码上半部分与第二节中的一样
下面的为修改的代码,要注意修改时要确定修改的唯一性,所以用到了 where
其中 ***,***,***,..... 为对象的元素,修改时,其元素不同于创建时的元素,应参考MSDN
到此,关于WMI的使用方法已基本介绍完了,通过以上的这些内容,我们可以看到,WMI竟然是如此的简单,功能是那么的强大。当然有关于WMI的并不仅仅是这些,由于本人水平有限所以有很多东西还是未知的,期待大家共同探讨。
六、权限
在使用前我们应该知道WMI只有在Administrators组成员,或者被授权的用户才能使用。
以下来自MS:授权 WMI 用户并设置权限
1、打开 WMI 控制。
2、在控制台树中,右键单击“WMI 控制”,然后单击“属性”。
3、单击“安全”选项卡。
4、选择要授予用户或组访问权限的名称空间,然后单击“安全”。
5、在“安全”对话框中,单击“添加”。
6、在“选择用户、计算机或组”对话框的“查找范围”框中,输入想要添加的对象(用户或组)的名称。单击“检查名称”以验证输入项,然后单击“确定”。您可能必须更改其位置或使用“高级”按钮查询对象。详细信息,请参阅该对话框帮助。
7、在“安全”对话框中的“权限”下,选择允许或拒绝新用户或组的权限。 级别 描述
执行方法 允许运行从 WMI 类别或范例中导出的方法。
全部写入 允许全部读取、写入和删除对所有 WMI 对象、类别和范例的访问权限。
部分写入 允许对静态 WMI 对象进行写入访问。
提供程序写入 允许对提供程序提供的对象进行写入访问。
启用帐户 允许对 WMI 对象进行读取访问。
远程启用 允许对名称空间进行远程访问。
读取安全 允许对 WMI 安全信息进行只读访问。
编辑安全 允许读取和写入 WMI 安全信息。
后记:由于本人英文水平过低,以至查阅MS文档十分困难,上述有些内容可能有错误,望高手指正。
我发现MS地说明文档总是让人难以理解,所以恳求对MS说明文档熟悉的朋友可以给我指点一下。
(出处:http://www.xmsc.com.cn)
3 楼
北京惬意 [专家分:1330] 发布于 2009-09-02 07:32:00
谢谢楼主!我一直在找这个东西,已经收藏。
再请教一下,这个东西性能怎么样,和2楼什么关系?
4 楼
liupeisong [专家分:2340] 发布于 2009-09-02 11:20:00
[quote]谢谢楼主!我一直在找这个东西,已经收藏。
再请教一下,这个东西性能怎么样,和2楼什么关系?
[/quote]
WMI是WINDOWS自带的功能(但是98好象要装一个补丁包),功能非常强大,调用方式是先建立一个对象,然后执行一个查询(查询中可以指明所需要的功能),得到的结果是记录集合,再进一步处理就能得到硬盘ID等东西。
性能:因为需要建立对象,所以估计比直接访问硬件要低一些,但是实际上不会感觉到慢的(把顶楼的代码保存为一个PRG运行试试就知道了)。
和2楼的关系:2楼是WMI的一些介绍和另一些使用例子。如果只取硬盘ID则不用管2楼的内容,只需要自行修改一下顶楼的代码,保留所需要部分即查
5 楼
AtwillCm [专家分:450] 发布于 2009-09-02 12:16:00
好贴,瞎摸了一下,补充一个取IP地址的
****取ip地址
FOR EACH object1 IN oHARDWARE
LcMAC1=object1.Properties_('IPAddress').VALUE
EXIT
ENDFOR
?LcMAC1
6 楼
liupeisong [专家分:2340] 发布于 2009-09-13 20:35:00
**VFP硬盘型号
LOCAL oWMI AS OBJECT,oLocal AS OBJECT,oHARDWARE AS OBJECT,object1 AS OBJECT,lcHDINFO
oWMI=CREATEOBJECT("WbemScripting.SWbemLocator")
oLocal=oWMI.ConnectServer(".", "root\cimv2")
oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_DiskDrive")
FOR EACH object1 IN oHARDWARE
lcHDINFO=object1.Properties_('Model').VALUE
EXIT
ENDFOR
?'硬盘型号:',lcHDINFO
7 楼
liupeisong [专家分:2340] 发布于 2009-09-13 20:40:00
重磅炸弹来了,那就是微软官方工具:WMI Code Creator v1.0
这个好东西真正解决了大家使用WMI时瞎摸的困境,强烈推荐!
下载地址
http://www.microsoft.com/downloads/details.aspx?familyid=2CC30A64-EA15-4661-8DA4-55BBC145C30E&displaylang=en
8 楼
bobwu [专家分:20] 发布于 2009-11-10 07:29:00
你娃这个东西好是好,在WINDOWS7下面取到的硬盘序列号和XP下面用DLL取的不一样,如何转换呢?
9 楼
pl893 [专家分:0] 发布于 2009-11-13 10:59:00
不错,谢了!
10 楼
fox2012 [专家分:0] 发布于 2012-06-16 20:46:00
把代码贴上:
*!* 十余行代码读出你的硬盘、CPU及网卡序列号
*!* 如果是WIN98系统,将需要从 MSDN 下载并安 WMI
LOCAL oWMI AS OBJECT,oLocal AS OBJECT,oHARDWARE AS OBJECT,object1 AS OBJECT,lcCPUID,LcMAC,lcHDID,lcSerial
oWMI=CREATEOBJECT("WbemScripting.SWbemLocator")
oLocal=oWMI.ConnectServer(".", "root\cimv2")
oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_Processor")
FOR EACH object1 IN oHARDWARE
lcCPUID=object1.Properties_('ProcessorId').VALUE
EXIT
ENDFOR
oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_PhysicalMedia")
FOR EACH object1 IN oHARDWARE
lcHDID=object1.Properties_('SerialNumber').VALUE
EXIT
ENDFOR
oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=1")
FOR EACH object1 IN oHARDWARE
LcMAC=object1.Properties_('MACAddress').VALUE
EXIT
ENDFOR
?'CPU序号: ',lcCPUID
?'硬盘序号: ',lcHDID
?'网卡MAC地址: ',LcMAC
**VFP硬盘型号
LOCAL oWMI AS OBJECT,oLocal AS OBJECT,oHARDWARE AS OBJECT,object1 AS OBJECT,lcHDINFO
oWMI=CREATEOBJECT("WbemScripting.SWbemLocator")
oLocal=oWMI.ConnectServer(".", "root\cimv2")
oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_DiskDrive")
FOR EACH object1 IN oHARDWARE
lcHDINFO=object1.Properties_('Model').VALUE
EXIT
ENDFOR
?'硬 盘型号: ',lcHDINFO
------------
硬盘序列号: .NULL.
其余正常,难道是假盘
我来回复