.
Запуская сценарий, администратор должен ввести следующие данные.
- Журнал событий для анализа (Application или System)
- Идентификационный номер события.
- Календарный интервал.
Затем сценарий проверяет каждый компьютер сети с использованием указанных критериев. По завершении процесса выдается отчет в формате 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
‘======================================================== ' '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 ("Retrieving Event Log data from hosts...") .writeLn (" | ") .writeLn ("