科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道快速获取客户机信息

快速获取客户机信息

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

通过Direct X9生成XML文件,利用客户端脚本通过XML DOM对XML文件进行操作,提交变量到远程服务器ASP脚本等解决办法来实现。以下为精彩介绍。

作者:董武 来源:网管员世界   2008年7月7日

关键字: 数据安全 数据保护

  • 评论
  • 分享微博
  • 分享邮件

  生成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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章