.

Запуская сценарий, администратор должен ввести следующие данные.

  1. Журнал событий для анализа (Application или System)
  2. Идентификационный номер события.
  3. Календарный интервал.

Затем сценарий проверяет каждый компьютер сети с использованием указанных критериев. По завершении процесса выдается отчет в формате Microsoft Excel, содержащий приведенные ниже данные о каждом сетевом компьютере:

  • дата анализа;
  • тип журнала (Application или System);
  • идентификационный номер события;
  • имя компьютера;
  • календарный интервал проверки;
  • количество повторений указанного события на этом компьютере в заданном календарном интервале;
  • время, когда данное событие в последний раз произошло на этом компьютере в заданном календарном интервале;
  • последний пользователь (имя пользователя, который последним зарегистрировался на компьютере).

Код EventLogScanner.vbs представлен в листинге. Перед анализом журнала событий в своей среде необходимо выполнить следующие действия.

1. Если такой файл еще не существует, создайте текстовый файл со списком всех имен компьютеров XP в сети. Каждое имя должно размещаться на отдельной строке в файле.

2. Найдите строку

Const PATH = "\\PATH\"

и замените \\PATH\ на каталог, в который нужно сохранить результаты.

3. Найдите строку

Const PCLIST = "\\PATH\HOSTNAMES.TXT"

и замените \\PATH\HOSTNAMES.TXT на путь к файлу, содержащему список компьютеров.

С помощью EventLogScanner.vbs можно быстро обнаруживать ошибки во всей сети и определять, является ли конкретная ошибка случайной или свидетельствует о более крупной неполадке, влияющей на несколько компьютеров.

Сценарий в данном виде работает на компьютерах XP, но его можно приспособить и для запуска с другими версиями Windows.

Брэндон Джоунс (Brandon.Jones@nau.edu) — системный администратор в колледже The W. A. Franke College of Business Университета Северной Аризоны. Имеет сертификаты MCSE, MCSD и MCDBA, специализируется на групповой политике, VBScript и CIS

Листинг. Сценарий EventLogScanner.vbs
‘========================================================
'
'AUTHOR: Brandon Jones
'
'COMMENT: This script counts the number of times a specified event
'         has ocurred on a group of machines during a specified time period.
'         For each machine scanned, it reports the number of times the
'         event occurred as well as the date of the most recent occurrence.
'
'========================================================
Const PATH = "\\PATH\" 'Replace this with the location of the directory
     where you want the results to be logged
Const PCLIST = "\\PATH\HOSTNAMES.TXT" 'Replace this with the path
     and name of the file containing your list of hosts
Const FORAPPENDING = 8  'for log file
Const FORREADING = 1  'for ping function
Const OPENASASCII = 0  'for ping function
Const FAILIFNOTEXIST = 0  'for ping function
Const CONVERT_TO_LOCAL_TIME = True
MessageAsk()
           
intLogType = inputbox("Enter the number for the type of Event Log you
      wish to scan:" & vbNewLine & vbNewLine & _
            "1 - Application Log" & vbNewLine & _
            "2 - System Log","Enter Number")
Select Case intLogType
    Case "1"
        strLog = "'Application'"
    Case "2»
        strLog = "'System'"
End Select         
intEvent = inputbox("Enter the Event ID number you want to search
     for","Enter Number")
dtmDate1 = inputbox("Enter start date (mm/dd/yy)","Enter Date")
dtmDate2 = inputbox("Enter end date (mm/dd/yy)","Enter Date")
StartDate = CDate(dtmDate1)
EndDate = CDate(dtmDate2)
sTitle= "Please Wait..." 'Display IE message while script is processing
 nScrW= createobject("htmlfile").parentWindow.screen.availWidth
 nScrHt= createobject("htmlfile").parentWindow.screen.availHeight
 showBar oIe, sTitle 'Function to define IE window
EventScan StartDate,EndDate,strLog,intEvent 'Sub to retrieve data
   from all hosts
oIe.quit 'Close IE message
Msgbox "The process has completed. Click OK to open the report.",
   vbInformation,"Complete"
OpenTheFile()
wscript.quit(1) 'End script
'SUBS AND FUNTCIONS
Sub MessageAsk()
   MyVar = MsgBox("This script counts the number of specified events
     that have happened on each machine over " & _
     "a specified time period. The process can take up to several minutes
     to complete." & vbNewLine & vbNewLine & _
     "Do you want to proceed?",vbYesNo + vbQuestion,"Continue?")
   If Myvar = vbNO Then
      wscript.quit(1)
   End If
End Sub
Sub EventScan(StartDate,EndDate,strLog,intEvent)
    Set dtmStartDate = CreateObject("WbemScripting.SWbemDateTime")
    Set dtmEndDate = CreateObject("WbemScripting.SWbemDateTime")
    dtmStartDate.SetVarDate StartDate, CONVERT_TO_LOCAL_TIME
    dtmEndDate.SetVarDate EndDate + 1, CONVERT_TO_LOCAL_TIME
 Set objShell = Wscript.CreateObject("Wscript.Shell")
 Set objFSO = CreateObject("Scripting.FileSystemObject")
 Set objFile = objFSO.OpenTextFile(PClist, ForReading,
  FailIfNotExist, OpenAsASCII)
    Do Until objFile.AtEndOfStream
  strComputer = Trim(objFile.ReadLine)
 
  If IsConnectible(strComputer, 1, 350) Then
   'Machine is reachable
       On Error Resume Next
       Set objWMIService = GetObject("winmgmts:" _
                    & "{impersonationLevel=impersonate}!\\" & strComputer &
                    "\root\cimv2")
                Set colLoggedEvents = objWMIService.ExecQuery _
                    ("Select * from Win32_NTLogEvent Where Logfile = " &
                        strLog & " and " _
                    & "EventCode = " & intEvent & " and TimeWritten >= '" &
                        dtmStartDate & "' and " _
                    & "TimeWritten < '" & dtmEndDate & "'")
                Count = 0
                For each objItem in ColLoggedEvents
                    Count = Count + 1
                 strLastUser = objItem.User
                 dtmTimeStamp = objItem.TimeWritten
                 If objItem.TimeWritten > dtmTimeStamp Then
                     dtmTimeStamp = objItem.TimeWritten
                 End If
             Next
             If Count = 0 Then
                 dtmMostRecent = "n/a"
                 strLastUser = "n/a"
             Else
                 dtmMostRecent = Mid(dtmTimeStamp,5,2) & "/" &
                  Mid(dtmTimeStamp,7,2) & "/" & Mid(dtmTimeStamp,1,4)
             End If
             UpdateLog strComputer,StartDate,EndDate,strLog,intEvent,
               Count,dtmMostRecent,strLastUser
        Else
            'Machine is offline
            strDown1 = "HOST"
            strDown2 = "OFF"
            strDown3 = "LINE"
            UpdateLog strComputer,StartDate,EndDate,strLog,intEvent,
                strDown1,strDown2,strDown3
  End If
 Loop
 objFile.Close
End Sub
Sub UpdateLog(strComputer,StartDate,EndDate,strLog,intEvent,Count,
   dtmMostRecent,strLastUser)
   Set WshNetwork = WScript.CreateObject("WScript.Network")
   Set fsoOut = CreateObject("scripting.filesystemobject")
   Set outFile = fsoOut.OpenTextFile(PATH & "Event-Log.csv",
      ForAppending, True)
   outFile.writeline (Now & "," & strLog & "," & intEvent & "," &
      strComputer & "," & StartDate & "," & _
        EndDate & "," & Count & "," & dtmMostRecent & "," & strLastUser)
   outFile.close
End Sub
Sub OpenTheFile()
  dim XL, XLBook
  Set XL = CreateObject("Excel.application")
  Set XLBook = XL.Workbooks.Open(PATH & "Event-Log.csv")
      Set objrange=XL.Range("A:I")
      Set objrange2=XL.Range("A1")
      Set objrange3=XL.Range("D1")
      XLBook.Worksheets(1).Columns("A:I").Autofit
      objrange.Sort objRange2,2,objRange3,,2,,,2
      XLBook.Worksheets(1).Range("A1:I1").Font.Bold=True
      XL.Visible = True
End Sub
'FUNCTION TO PING TARGET MACHINE
Function IsConnectible(sHost, iPings, iTO)
   dim oFSO  'File object for ping function
   dim sTempFile  'File object for ping function
   dim fFile  'File object for ping function
   Set obShell = CreateObject("WScript.Shell")
   Set oFSO = CreateObject("Scripting.FileSystemObject")
   sTempFile = oFSO.GetSpecialFolder(2).ShortPath & "\" & oFSO.GetTempName
   obShell.Run "cmd.exe /c ping.exe -n " & iPings & " -w " & iTO _
      & " " & sHost & ">" & sTempFile, 0 , TRUE
   Set fFile = oFSO.OpenTextFile(sTempFile, ForReading, FailIfNotExist,
   OpenAsASCII)
   sResults = fFile.ReadAll
   fFile.Close
   oFSO.DeleteFile(sTempFile)
   IsConnectible = CBool(InStr(sResults, "TTL="))
End Function
'FUNCTION FOR IE MESSAGE
Function showBar (roIe, usTitle)
set roIe= createobject("internetExplorer.application")
   roIe.navigate("about:blank")
with roIe
  .fullScreen= false
  .toolbar = false
  .statusBar = false
  .addressBar = false
  .width= 450
  .height= 40
  .left= (nScrW -420) \2
  .top= (nScrHt -240) \2
  with .document
   .writeLn ("")
   .writeLn ("")
   .writeLn ("")
   .writeLn ("" & usTitle & "")
   .writeLn ("")
   .writeLn ("")
   .writeLn ("")
   .writeLn ("")
   .writeLn ("")
   .writeLn ("")
   .writeLn ("")
   .writeLn ("
")    .writeLn ("Retrieving Event Log data from hosts...")    .writeLn ("
")    .writeLn ("")    .writeLn ("")   End with   .visible= true End with End Function