扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
生成XML文件
XML DOM是XML Document Object Model对象模型,是外部应用程序对XML文件进行操作的接口。只有首先建立DOM对象,才能够把XML文件视作树状结构的节点进行操作,这点和对数据库的操作非常类似。
在各客户计算机上一定要安装DX9,因为经过笔者测试,这的确是新功能,在以前的版本中没有,因此也不可能生成我们所需要的XML文件。IE最好是6.0版本。如果不符合,请注意升级。Windows 9x操作系统与Windows NT系列生成的XML有很大的不同,这对我们的操作会造成一定的困难。考虑到目前Windows NT操作系统占主流的情况,本文没有对Windows 9x进行讨论。读者可以根据自己的实际情况查看Windows 9x里得到的XML文件,在实际的客户端脚本程序中加一个判断并跳转即可。
在“运行”或“cmd窗口中”中键入“dxdiag /?”,出现图1所示界面。
图1 DirectX 诊断工具界面
从图中我们知道,键入“dxdiag /x output_file”,就可以得到XML文件。在实际应用中,笔者做了一个批处理程序,将此程序分发到客户端双击执行即可。代码如下:
@echo off
Dxdiag /x c:\dxdiag.xml
Exit
运行后,就可在客户机的C盘根目录下生成文件Dxdiag.xml供我们后续操作使用。
提示:在Windows 9x中,直接运行“dxdiag /x”是会报错的,笔者认为这是由于系统没有把Dxdiag.exe所在路径包括在环境变量%PATH%中造成的,最简单的办法就是我们自己加上Dxdiag.exe路径,键入“c:\windows\system\dxdiag.exe /x c:\dxdiag.xml”即可。
使用脚本文件进行操作
打开我们得到的XML文件,内容真是太丰富了。在Windows NT内核操作系统中,每一台计算机生成的XML文件中相对应的节点元素都是相同的,惟一不同的是我们在这里需要读取的数据。读者可以根据实际需要过滤出对自己有价值的数据,尽管内容很多,但仔细对比一下,一定会找出您需要的节点信息。笔者需要过滤出的信息有CPU、内存、显卡、操作系统、硬盘等配置信息。另外,在笔者的实践中,对计算机名、工作组名、IP、网卡地址的统计是通过服务端ASP脚本实现的,因此与本文的关系不大,将在ASP脚本代码中简单地注释说明。
图2 XML文件
图3 硬盘配置信息
图4 网卡/声卡/主板等配置信息
其实,客户计算机名也是可以通过XML文件中的<MachineName> …< /MachineName>(如图2)元素对获得的。笔者的客户端脚本是用VBScript写成的HTML文件,分发到客户机上双击运行即可。其间会有ActiveX控件危险操作提示信息,不用管它,点击“是”继续即可。代码如下。
<script language="vbscript">
dim fso,xmldomobject,objnode,os,processor, memory,videocard,other,objharddisks,objharddisk, objdevices,objdevice,disk,device
dim branchtotal(10),harddisk(4),branchtotaldev(20)
'检测XML文件是否存在
set fso=createobject("scripting.fileSystemObject")
if not fso.FileExists("c:\dxdiag.xml") then '根据实际需要修改,需和批处理程序生成的文件一致
msgbox “操作的文件不存在”
window.close()
end if
set fso=nothing
'创建DOM对象
set xmldomobject=createobject("Microsoft.XMLDOM")
xmldomobject.async="false"
xmldomobject.load("c:\dxdiag.xml")
os=xmldomobject.getElementsByTagName("OperatingSystem").item(0).text '如图2 获取操作系统信息
processor=xmldomobject.getElementsByTagName("Processor").item(0).text '如图2 获取CPU信息
memory=xmldomobject.getElementsByTagName("Memory").item(0).text '如图2 获取内存信息
videocard=xmldomobject.getElementsByTagName("CardName").item(0).text '如图2 获取显卡信息
'获取硬盘信息,如图3,对<LogicalDisks>..</LogicalDisks>元素操作,过滤我们需要的信息
set objnode=xmldomobject. documentelement.childnodes
set objharddisks=objnode.item(8).childnodes
for i=0 to objharddisks.length-1
set objharddisk=objharddisks.item(i).childnodes
for j=0 to 4
harddisk(j)=objharddisk.item(j).nodeName&":"&objharddisk.item(j).text&"|||" '使用|||对字符进行分割,便于以后操作
branchtotal(i)=cstr(branchtotal(i))&cstr(harddisk(j))
next
disk=cstr(disk)&cstr(branchtotal(i))&"***" '使用***对字符进行分割,便于以后操作
next
'其他硬件信息,如网卡、声卡、以及主板配置信息 如图4,对<SystemDevices>..</SystemDevices>操作
set objdevices=objnode.item(9).childnodes
for ii=0 to objdevices.length-1
set objdevice=objdevices.item(ii).childnodes
branchtotaldev(ii)="DeviceName"&ii&":"&objdevice.item(0).text
device=cstr(device)&cstr(branchtotaldev(ii))&"|||" '使用|||对字符进行分割,便于以后操作
next
'去除空格,合并字符串变量
os=replace(os," ","")
processor=replace(processor," ","")
videocard=replace(videocard," ","")
memory=replace(memory," ","")
disk=replace(disk," ","")
device=replace(device," ","")
'创建FORM,将提交变量
document.write "<form action=http://10.58.18.12/info.asp method=post>" '服务器地址
document.write "<input type=hidden name=processorform value="&processor&">"
document.write "<input type=hidden name=memoryform value="&memory&">"
document.write "<input type=hidden name=videocardform value="&videocard&">"
document.write "<input type=hidden name=osform value="&os&">"
document.write "<input type=hidden name=harddiskform value="&disk&">"
document.write "<input type=hidden name=otherform value="&device&">"
document.write "<input type=submit name=uploadform value=上传>"
document.write "</form>"
</script>
提交变量
简单起见,笔者采用Access数据库进行信息搜集。代码如下:
<%@ language="vbscript" %>
<%
if request.form("uploadform")< if request.form("uploadform")<>"上传" then
response.write "<script>alert('您没有提交任何数据,进程终止');window.close();</script>"
response.end
else
On error resume next
dim decla
decla="资料搜集中.."
response.write decla
'连接数据库,这里使用Access,数据库名为info.mdb
StrSQL="DBQ="+server.mappath("info.mdb")+";DRIVER={Microsoft Access Driver (*.mdb)};"
set conn=server.createobject("ADODB.CONNECTION")
conn.open StrSQL
Dim oScript
Dim oFileSys, oFile
Dim Allfile, szTempFile,ip,mac,group,maincycle,name,cycle
Dim TempPath
Dim os,processor,memory,videocard
ip = request.ServerVariables("REMOTE_ADDR")
set rs=Server.CreateObject("ADODB.RECORDSET")
rs.Open "Select * from info where ip='"&ip&"'",conn
if not rs.EOF then
response.write "<script>alert('您已经注册,无需重复');window.close();</script>"
response.end
end if
rs.close
set rs=nothing
Set oScript = Server.CreateObject("WSCRIPT.SHELL")
Set oFileSys = Server.CreateObject("Scripting.FileSystemObject")
TempPath="c:\temp\" '临时目录
szTempFile = TempPath &ip&".txt" ' 临时文件
Call oscript.Run ("cmd.exe /c nbtstat -an " &ip &">>" &szTempFile, 0, True) '用Nbtstat命令获取客户机信息,重定向至临时文件
Set oFile = oFileSys.OpenTextFile (szTempFile, 1, False, 0)
Allfile=oFile.ReadAll()
oFile.Close
arrinfo = Split(Allfile, vbCrLf)
mac="unknown"
name="unknown"
group="unknown"
for i = 0 to ubound(arrinfo)
maincycle=arrinfo(i)
if instr(1,maincycle,"Host not found")<>0 then
Call oFileSys.DeleteFile(szTempFile, True)
response.write "<script>alert('无法定位您的计算机,请打开139PORT,WINXP SP2的请关闭您的防火墙');window.close();</script>"
response.end
end if
'获取MAC
if instr(1,maincycle,"Address") <>0 then
cycle=instr(1,maincycle,"=")
mac=Ucase(Trim(CStr(Mid(maincycle,cycle+1))))
end if
'取得MAC
'获取机器名
if instr(1,maincycle, "<00>") <>0 and instr(1,maincycle, "UNIQUE") <>0 then
name=trim(CStr(mid(maincycle,1,(instr(1,maincycle, "<00>")-1))))
end if
'取得机器名
'获取工作组名
if instr(1,maincycle, "<00>") <>0 and instr(1,maincycle, "GROUP") <>0 then
group=trim(CStr(mid(maincycle,1,(instr(1,maincycle, "<00>")-1))))
end if
'取得工作组名
next
os=request.form("osform")
processor=request.form("processorform")
memory=request.form("memoryform")
videocard=request.form("videocardform")
total=request.form("harddiskform")
other=request.form("otherform")
if name<>"unknown" and group<>"unknown" and mac<>"unknown" then
'写数据到相应字段
set rs100=Server.CreateObject("ADODB.RECORDSET")
rs100.source="select * from info"
rs100.open rs100.source,conn,1,2
rs100.addnew
rs100("ip")=ip 'ip地址
rs100("computername")=name '计算机名
rs100("mac")=mac '网卡地址
rs100("group")=group '工作组
rs100("processor")=processor 'CPU
rs100("videocard")=videocard '显卡
rs100("memory")=memory '内存
rs100("os")=os '操作系统
rs100("harddisk")=total '硬盘
rs100("other")=other '网卡、声卡、主板等其他相关配置
rs100.update
rs100.close
set rs100=nothing
conn.close
set conn=nothing
else
Call oFileSys.DeleteFile(szTempFile, True)
response.write "<script>alert('资料导入失败,网卡地址,计算机名或工作组为空');window.close();</script>"
response.end
end if
oFileSys.close
decla="资料搜集完毕"
response.write decla
response.write "<script>alert('资料导入完毕');window.close();</script>"
end if
%>
小结
将批处理程序和客户端脚本分发到客户计算机,通过行政命令,使用户依次执行批处理和脚本。除了个别用户发生操作错误需专人协助操作外,其余的均顺利完成。谈笑间,几百台计算机的配置信息收入囊中。原本两到三天大工作量的辛劳,半天就轻松搞定了。剩下的工作,就是再编写一段脚本,把数据库中的数据按照更容易阅读的方式显示出来。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。