Board logo

标题: [问题求助] [已解决]vbs怎样监控ping的返回信息,并做出判断 [打印本页]

作者: gmwd18    时间: 2012-6-8 16:53     标题: [已解决]vbs怎样监控ping的返回信息,并做出判断

本帖最后由 gmwd18 于 2012-6-15 11:44 编辑

本人经常要进行服务器远程维护,现想做个脚本,监控一下维护机到服务器的网络连通状况,具体功能如下:(希望大家给点思路)
1.脚本可以一直ping一个或多个ip地址,并监控ping的返回信息,如果发现有大于等于3个连续的丢包(即3个连续的request timeout)的情况时,记录一条日志到一个txt文件中,格式为“年月日 时间: 到某某Ip网络有丢包”
2.如果发现有超过10个连续的丢包,则发送一封电子邮件,到指定的邮箱,邮件内容为“网络丢包严重,请检查网络”
由于本人vbs接触不多,最近正在学习,对于这种监控代码没有什么头绪,所以想请各位高手指点一下,给点思路和一些代码示例参考一下,不胜感谢!

作者: powerbat    时间: 2012-6-10 22:05

  1. arrIP = Array("192.168.0.1", "www.baidu.com", "74.125.71.14")
  2. Dim arrCnt() : Redim arrCnt(UBound(arrIP))
  3. WQL = "Select * from Win32_PingStatus Where Address='" _
  4.     & Join(arrIP, "' OR Address='") & "'"
  5. Set fso = CreateObject("Scripting.FileSystemObject")
  6. Set ts = fso.OpenTextFile("netstat.log", 8, true)
  7. Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
  8. Do
  9.   i = 0
  10.   Set colItems = objWMIService.ExecQuery(WQL, , 48)
  11.   For Each objItem in colItems
  12.     If objItem.StatusCode = 11010 Then
  13.       arrCnt(i) = arrCnt(i) + 1
  14.       if arrCnt(i)=3 then ts.WriteLine Now() & "  " & objItem.Address & " 有丢包"
  15.       if arrCnt(i)=10 then
  16.         SendMail "MyAccount@163.com", "password", "SendTo@163.com", _
  17.             "网络丢包", objItem.Address & " 丢包严重,请检查网络"
  18.       end if
  19.     Else
  20.       arrCnt(i) = 0
  21.     End If
  22.     i = i + 1
  23.   Next
  24. Loop
  25. 'SendMail "MyAccount@163.com", "password", "SendTo@163.com", "邮件主题", "邮件内容"
  26. Sub SendMail(Account, Password, SendTo, Subject, Body)
  27.     'http://www.cnblogs.com/cxy521/archive/2008/01/22/1048802.html
  28.     On Error Resume Next
  29.     const MsSpace = "http://schemas.microsoft.com/cdo/configuration/"
  30.     dim CDO, Server
  31.     Set CDO = CreateObject("CDO.Message")
  32.     CDO.From = Account                                    '发送邮件的帐号
  33.     CDO.To = SendTo                                       '主送邮件地址
  34.     CDO.Subject = Subject                                 '邮件主题
  35.     CDO.Textbody = Body                                   '邮件内容
  36.     Server = Split(Account, "@", -1, vbTextCompare)
  37.     With CDO.Configuration.Fields
  38.         .Item(MsSpace&"sendusing") = 2                    '发信端口
  39.         .Item(MsSpace&"smtpserver") = "smtp." & Server(1) 'SMTP服务器地址
  40.         .Item(MsSpace&"smtpserverport") = 25              'SMTP服务器端口
  41.         .Item(MsSpace&"smtpauthenticate") = 1             'Basic验证方式
  42.         .Item(MsSpace&"sendusername") = Server(0)         '邮件帐号
  43.         .Item(MsSpace&"sendpassword") = Password          '邮件密码
  44.         .Update
  45.     End With
  46.     CDO.Send()
  47. End Sub
复制代码

作者: gmwd18    时间: 2012-6-11 18:17

回复 2# powerbat

感谢powerbat,代码有许多看不懂,我自己再琢磨一下~
    不过我怎么没看出那些是用来实时监控的语句呢,求解答~
作者: powerbat    时间: 2012-6-11 19:39

不是监控,而是用do循环不停地ping。
作者: gmwd18    时间: 2012-6-12 17:08

回复 4# powerbat


    谢谢powerbat,代码大部分搞懂了,又让我学习了不少,不过上述代码中的
  1. WQL = "Select * from Win32_PingStatus Where Address='" _    & Join(arrIP, "' OR Address='") & "'"
复制代码
这一句有报错,说什么不符合的字符,我把where 条件后面的改为address='单个ip'  就可以了,是不是上面这句有笔误,顺带求解一下上面这句SQL查询是什么意思,谢谢了哈!
作者: powerbat    时间: 2012-6-12 17:18

代码明显是两行(为了不使一行太长影响阅读和维护,因而用了续行符“_”分成了两行)。
要合成一行得把续行符“_”去掉。
作者: gmwd18    时间: 2012-6-15 11:43

回复 6# powerbat
谢谢了,脚本可以使用了,大家有兴趣的可以收藏一下,powerbat的代码拿来就能用,也可以根据自己的需要再修改一下,注:上面代码中的“_”符号是续行符,脚本里面要去掉哦~
作者: zhangop9    时间: 2012-8-2 21:21

回复 2# powerbat
老大能不能也给我写一个代码,问题在这个帖子上:
http://bbs.bathome.net/thread-18341-1-1.html




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2