.
Запуская сценарий, администратор должен ввести следующие данные.
- Журнал событий для анализа (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 ("