I have written similar script to check for a single server but this time
it scans a list of server.
It still not integrated with nagios because of the time it takes to execute
such script.
It does requires 7z.exe and dumpel.exe
'Get Event Viewer Filering by: event,source,id,days,server USING: dumpel.exe
'Be able to get Multiple Evens from Multiple Servers(servers array ?) events in array (?)
'NOTES: dumpel.exe is much faster then WMI or LogParser API
'Author: Felipe Ferreira
'Date: 24/10/07
'Version: 4.0 - Get Servers From txt file
'ìRequires:
'dumpel.exe WResourceKit
'Create log folder
'Create ServerList.txt with one server per line
'TODO:
'OK - zip logs and attach
'OK - Get List of Servers
Option Explicit
'@@GLOBAL VARS
Dim t1 : t1 = Timer 'time the script
dim strScriptFile : strScriptFile = WScript.ScriptFullname
dim strScriptPath : strScriptPath = Left(strScriptFile, Len(strScriptFile) - Len(WScript.Scriptname))
Dim EventDumpPath : EventDumpPath = strScriptPath & "log"
Dim ofso : Set ofso = CreateObject("Scripting.FileSystemObject")
Dim blnErrorFound : blnErrorFound = false
Dim EventDumplog, strLine, strBody, Server
Dim dumpFileCnt
Dim verbose,outputfile
Dim EventDaysOld
Dim eType, eSource, eId, EventType, EventSource
Dim arrTxtFile,inputFile
' COUNTERS
Dim RunTime : Runtime = 0
Dim intNumberOfErrrors : intNumberOfErrrors = 0
Dim cntServers : cntServers = 0
Dim cntServersOK : cntServersOK = 0
Dim cntServersErr : cntServersErr = 0
'@@@@@@@@@@@@DEFINE, or get dynamic from TXT or Array
inputFile = strScriptPath & "ServersList.txt"
Dim strMailServer : strMailServer = "infomailgw"
verbose = 1 ' If True WIll Print out to Screen, otherwise FALSE = silent mode
EventDaysOld = 2
eType="Security"
eSource="Security"
eID="681"
'write into Body Email the Errors being searched and its comments
strbody = "Checking for Event ID : "& eID & " Source: " & eSource & " - Type: " & eType & vbCrlf
strbody = "Checking: " & Server & " Event Source: " & eSource & " Event ID: " & eID & " Source: " & eSource & " DaysOld = " & EventDaysOld & vbCrlf & vbCrlf
strbody = "SERVIDOR, NUMERO DE ERROS"
'--
Dim fso : Set fSo = CreateObject("Scripting.FileSystemObject")
Dim rdFile : Set rdFile = fSo.OpenTextFile(inputFile, 1)
call CleanUp( strScriptPath & "log")
Do while rdFile.AtEndofStream=false
Server = rdFile.readline()
'Loop thru each server in the input list
pt "Checking: " & Server & " Event Source: " & eSource & " Event ID: " & eID & " Source: " & eSource & " DaysOld = " & EventDaysOld & vbCrlf
Call Execute(eType,eSource,eID,Server,EventDaysOld)
'Check Error should check only the just created log file
Call CheckifError(EventDumplog)
cntServers = cntServers + 1
'If errors/events found output
if blnErrorFound = true then
'@@@@@@@@@@@@OUTPUT EMAIL
strBody = strBody & vbCrlf & Server & " , " & intNumberOfErrrors
cntServersErr = cntServersErr + 1
elseif blnErrorFound = False then
cntServersOK = cntServersOK + 1
end if
Loop
RunTime = Left(Timer - t1, 4)
strBody = strbody & vbCrlf & "----------------------------------------------------------"
strBody = strbody & vbCrlf & "Checked : " & cntServers & " servers. "
strBody = strbody & vbCrlf & "Servers with Errors : " & cntServersErr & " Servers OK: " & cntServersOK
strBody = strbody & vbCrlf & "Script Runtime: " & Runtime & " sec."
'ZIP the files
call fZip ("c:PROGRA~1NC_netscriptlog", "SecLogs.zip")
outputfile = strScriptPath & "SecLogs.zip"
pt "Attaching = " & outputfile
'(sFrom,sTo,sCC,sSub,sBody,sAttch)
sendmail "monitor@infoglobo.com.br", "felipe.ferreira@infoglobo.com.br","marcela.santos@infoglobo.com.br", "Event Viewer Monitor", strBody , outputfile
pt strBody
'call CleanUp( strScriptPath & "log")
wscript.quit
'@@@@@@@@@@@@@@@@@@@@@@@FUNCTIONS AND SUBS@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Function Execute(eType,eSource,eID,eServer,EventDaysOld)
on error resume next
blnErrorFound = False
EventDumplog = "log" & eServer & "_" & eID & ".txt"
dim strCmd,strCmdOut
dim objShell : Set objShell = WScript.CreateObject("WScript.Shell")
strCmd = strScriptPath & "dumpel.exe -f " & EventDumpLog & " -l " & eType & " -m " & eSource & " -e " & eID & " -s " & eServer & " -d " & EventDaysOld
'pt strCmd
Dim objExecObject : Set objExecObject = objShell.Exec(strCmd)
'MUST GET STDOUT, SOMETIMES APP DONT RUN!
if verbose = 1 then
Do While objExecObject.Status <> 1
wscript.sleep 10
Wscript.StdOut.Write(".")
Loop
if err.number = 0 and objExecObject.Status = 1 then
end if
end if
end function
sub CheckIfError(EventDumplog)
'Looks into Log folder if any .txt and not 0kb turn ErrorFound=true that will zip and send email
Dim fs,File,intSize
dumpFileCnt = 0
'pt("Checking if errors: " & EventDumplog)
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FileExists( EventDumplog ) Then
Set File = fs.GetFile(EventDumplog)
intSize = File.Size
pt "Tamanho do Arquivo: " & intSize
if intSize = 0 then
fs.DeleteFile(EventDumplog)
else
arrTxtFile = ReadTxtToArray(EventDumplog)
intNumberOfErrrors = Ubound(arrTxtFile)
pt intNumberOfErrrors & " erros found"
blnErrorFound = True
end if 'File Dump Size Check
end if
end sub
Sub SendMail(sFrom,sTo,sCC,sSub,sBody,sAttch)
err.clear
Dim objEmail
Set objEmail = CreateObject("CDO.Message")
objEmail.From = sFrom
objEmail.To = sTo
ObjEmail.CC = sCC
objEmail.Subject = sSub
objEmail.Textbody = sBody
objEmail.AddAttachment sAttch
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strMailServer
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update
objEmail.Send
if err.number <> 0 then
wscript.echo "Error sending email : " & err.descprition
wscript.quit
end if
end sub
Function ReadTxtToArray(strInputFilePath)
Const ForReading = 1
' create FSO
Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject")
' open text file for reading
Dim objFile : Set objFile = objFSO.OpenTextFile(strInputFilePath, ForReading)
' read the content of the file and split into an array using vbCrLf as the seperator
' and return the array
ReadTxtToArray = Split(objFile.ReadAll, VbCrLf)
' close the file
objFile.Close
End Function
function fzip(strPaths,strZipFileName)
on error resume next
dim strCmd
dim objShell : Set objShell = WScript.CreateObject("WScript.Shell")
strCmd = "7z.exe a -tzip " & strZipFileName & " " & strPaths
pt strCmd
Dim objExecObject : Set objExecObject = objShell.Exec(strCmd)
Do While objExecObject.Status <> 1
wscript.sleep 1000
Wscript.StdOut.Write(".")
Loop
end function
Sub CleanUp(strFolderPath)
Dim objFile
Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(strFolderPath) Then
dim objFolder : set objFolder = objFSO.GetFolder(strFolderPath)
For Each objFile In objFolder.Files
pt "Deleting file : " & objFile.name
objFile.Delete True
Next
End If
End Sub
Function pt(msgTxt)
if verbose = 1 then
wscript.echo msgtxt
end if
end function
