Aktionen

Zabbix:Template Windows Eventlog mit Filter

Aus znilwiki

Warning.png
Warnung: ACHTUNG! An sich funktioniert die Überwachung und das Filtern mit dieser UserParameter-Erweiterung sehr gut. ABER ... seit euch bewußt das Ihr damit ggf. die Büchse der Pandora öffnet ... Bei einem Kunden auf 10 von 300 Servern aktiviert ... und es kommen in einer Tour Meldungen. Da sind gezielte Suchen mit dem in Zabbix eingebauten Funktionen manchmal hilfreicher. Allerdings gibt es bei diversen Anwendungen das Problem das man ggf. noch gar nicht weis wonach man suchen soll.


Changelog:

  • 15.03.2015 erste öffentliche Version, Version der Zabbix_Eventlog.exe ist 1.0.0.74
  • 26.03.2015 In den Texten von Insertion und Message werden nun alle " durch ' ersetzt. Insertion wurde auf die ersten 128 Zeichen begrenzt




Vorwort

Ich habe ja bereits eine Anleitung für das Monitoring von Eventlogs veröffentlicht: Zabbix:Template Windows Eventlog
Das funktioniert auch wirklich ganz wunderbar ... allerdings mit dem Problem das man auch wirklich jede Warnung und jeden Fehler gemeldet bekommt.

Jetzt habe ich bei einem Kunden z.B. auf einem Server eine Software für die Telefonanlage die alle 3 Minuten über eine fehlende Lizenz meckert ... und somit auch alle 3 Minuten eine Meldung erezugt.
Der Fehler ist bekannt und könnte ignoriert werden ... aber leider kennt Zabbix keine Filter hierfür.
Als Lösung gäbe es (mit Bordmitteln) zwei Möglichkeiten:

  • Statt allgemein alle Warnungen und Fehler abzufragen überwachen wir gezielt bestimmte Events. Dann würden wir aber auch neue und bisher unbekannte Meldungen nicht bekommen
  • In dem Triggern könnte man die zusätzliche Prüfung durchaus einbauen ... aber dann muss man jedesmal den Filter anpassen ... und wenn wir bei der 10 Bedingung sind die ausgefiltert werden soll haben wir ein schönes und unübersichtlichen Zeilenmonster


Ich habe mich deshalb dafür entschieden das Eventlog-System von Zabbix NICHT zu verwenden und statt dessen ein eigenes System als Erweiterung für den Zabbix-Agenten geschrieben (per UserParameter)



Features

Meine Zabbix_Eventlog.exe in Zusammenarbeit mit dem Template kann folgendes:

  • Autodiscover (LLD) aller vorhandenen Eventlogs! Gefunden werden alle Haupt-Eventlogs wie System, Anwendung und Sicherheit, aber auch Hardware-Ereignisse, DNS-Server, Verzeichnisdienst und so weiter. Also alle Eventlogs unterhalb von "Windows-Protokolle" und "Anwendungs- und Dienstprotokolle"
  • Pro Eventlog werden die folgenden Daten erfasst
    • Aktuelle Größe in Bytes
    • Maximale erlaubte Größe in Bytes
    • Anzahl Einträge
    • Status (OK oder FAILED)
    • Anzahl der Einträge insgesamt
    • Anzahl neuer Einträge in den letzten xxx Sekunden (konfigurierbar per Makro, Standard sind 600 Sekunden / 10 Minuten)
    • Anzahl ausgefilterter Einträge in den letzten xxx Sekunden
    • Anzahl von Warnungen (WARNING) in den letzten xxx Sekunden
    • Anzahl von Fehlern (ERROR) in den letzten xxx Sekunden
    • Alle NICHT(!) ausgefilterten Eventlogeinträge mit Text, getrennt nach Warnung und Fehlern
ZabbixEventlog-with-Filter-003.png
  • Filterung von Eventlog-Einträgen über lokale Textdatei Zabbix_Eventlog-Filter.txt die im gleichen Ordner wie die Zabbix_Eventlog.exe liegen muss(!)
  • Filterung von Eventlog-Einträgen über zentrale Textdatei im Netzwerk. Die Datei muss auf einer Windows-Freigabe liegen auf die anonym zugegriffen werden kann (Zabbix Agent läuft als Benutzer SYSTEM)
  • Frei wählbare Zeitdauer zwischen den Abfragen (Mindestens 60 Sekunden, Maximal keine Begrenzung)
  • Nur ein Item ist vom Typ "Agent (active)", alle anderen sind vom Typ "Zabbix Trapper". Dieses Item dient dazu die Abfrage zu starten
  • Alle anderem Item werden per Zabbix-Sender befüllt
  • Pfad zu zabbix_sender.exe sowie zur Konfigurationsdatei des Agenten werden aus der Registry ermittelt (Dienst mit zabbix_agentd.exe wird gesucht und die dort angegebene Konfigurationsdatei genommen




Download

Aktuelle Version der Zabbix_Eventlog.exe' ist 1.0.0.79
Download-Link: Zabbix-Eventlog.zip

Das Archiv enthält folgende Dateien:

  • Anleitung.txt = Kurzanleitung
  • UserParameter.txt = Beispieleintrag für UserParameter in zabbix_agentd.win.conf
  • Zabbix_Eventlog.au3 = Quellcode der .exe im AutoIt Format
  • Zabbix_Eventlog.exe = Das eigentliche Programm
  • Zabbix_Eventlog-Filter.txt = Beispiel-Filterdatei
  • znil Template Windows Eventlog with Filter V2015-03-06.xml = Das Template zum Importieren, erscheint in der Gruppe Templates DATAGROUP




Installation

  • Kopiert die Zabbix_Eventlog.exe und die Zabbix_Eventlog-Filter.txt in das Verzeichnis mit eurem Zabbix-Agenten
  • Bearbeitet die zabbix_agentd.win.conf und ergänzt folgende Zeilen
UserParameter=znil.ZabbixEventlog[*],"C:\Program Files\Zabbix\UserParameter\Zabbix_Eventlog.exe" "$1" "$2" "$3" "$4"
  • Startet den Dienst des Zabbix-Agenten einmal neu!
Den Pfad müsst Ihr natürlich anpassen
  • Importiert in Zabbix das Template znil Template Windows Eventlog with Filter V2015-03-06.xml
  • Passt im Template die beiden Makros an:
{$EVENTLOG_FILTERFILE} = Pfad zu einer zusätzlichen Filterdatei im Netzwerk, z.B. \\192.168.42.15\EventlogFilter\Zabbix_Eventlog-Filter.txt
{$EVENTLOG_PERIOD} = Abfrageintervall in Sekunden, Vorgabe ist alle 10 Minuten
ZabbixEventlog-with-Filter-001.png
  • Wenn Ihr den Abfrageintervall ändert müsst Ihr auch unbedingt den Item prototype mit dem Namen Eventlog {#EVENTLOGNAME}: Helper Query Events anpassen - Makros sind bei den Abfragezeiten leider nicht erlaubt!
  • Verknüpft das Template mit eurem Host




Wie die Abfrage erfolgt / manuelle Abfragen

Alle 3.600 Sekunden = einmal die Stunde werden über den Discovery-Teil des Templates alle vorhandenen Eventlogs erkannt und die Items und Trigger dazu gebaut. Dabei werden nur Eventlogs berücksichtigt die über mindestens einen Eintrag verfügen. Leere Eventlogs wie z.B. "Internet Explorer" werden ignoriert.
Dies geschieht über den folgenden Aufruf der Zabbix_Eventlog.exe:

Zabbix_Eventlog.exe discovereventlogs

welcher auch manuell ausgeführt werden kann (aber erst das Template dem Host zuweisen). Die Daten werden per zabbix_sender.exe zum Server gesendet, bei Erfolg gibt es als Rückgabe nur eine 0
Im gleichen Verzeichnis gibt es nun eine Zabbix_Eventlog-LLD-Eventlogs.txt mit dem JSON-Text der LLD-Erkennung:

- znil.ZabbixEventlog[discovereventlogs] {"data":[{"{#EVENTLOGNAME}":"Active Directory Web Services","{#EVENTLOGDUMMY}":"---"},{"{#EVENTLOGNAME}":"Application","{#EVENTLOGDUMMY}":"---"},{"{#EVENTLOGNAME}":"DFS Replication","{#EVENTLOGDUMMY}":"---"},{"{#EVENTLOGNAME}":"Directory Service","{#EVENTLOGDUMMY}":"---"},{"{#EVENTLOGNAME}":"DNS Server","{#EVENTLOGDUMMY}":"---"},{"{#EVENTLOGNAME}":"MSExchange Management","{#EVENTLOGDUMMY}":"---"},{"{#EVENTLOGNAME}":"Security","{#EVENTLOGDUMMY}":"---"},{"{#EVENTLOGNAME}":"System","{#EVENTLOGDUMMY}":"---"},{"{#EVENTLOGNAME}":"Windows PowerShell","{#EVENTLOGDUMMY}":"---"}]}

Das ganze muss in einer Zeile sein sonst kann die zabbix_sender.exe ex nicht senden

Für jedes Eventlog wird nun unter anderem ein Item gebaut welches als im gewählten Zeitraum die Abfrage anstartet:
ZabbixEventlog-with-Filter-002.png
Die Zabbix_Eventlog.exe wird dabei mit folgenden Parametern gestartet:

Zabbix_Eventlog.exe Name_des_Eventlogs Abfragezeitraum Pfad_zur_Filterdatei

Die weiteren Paramter sind dabei optional. Man kann das also auch per Hand machen:
Die letzten 10 Minuten vom Eventlog System abfragen:

Zabbix_Eventlog.exe SYSTEM

Die letzte Stunde vom Eventlog System abfragen

Zabbix_Eventlog.exe SYSTEM 3600

Die letzten 10 Minuten vom Eventlog System abfragen und die Ergebnisse mit zusätzlicher Filter-Datei filtern:

Zabbix_Eventlog.exe SYSTEM 600 "\\192.168.42.15\EventlogFilter\Zabbix_Eventlog-Filter.txt"

Als Ergebnis kommt die Anzahl der gefundenen Warnung und Fehler zurück die an den Zabbix-Server gesendet wurden (per zabbix_sender.exe)

Zum Testen könnt Ihr z.B. mit

eventcreate /L SYSTEM /T ERROR /SO ZabbixTest /ID 999 /D "Testnachricht!"

in einer DOS-Box einen Testfehler erstellen.
Direkt danach ein

Zabbix_Eventlog.exe SYSTEM

und in Zabbix müsste es eine Meldung geben.
Wenn Ihr

Zabbix_Eventlog.exe

ohne Parameter eingebt wird eine Hilfe ausgegeben!

Wird in dem Zeitraum kein Fehler oder Warnung gefunden, so wird die Zeichenfolge

-=ZABBIX-EVENTLOG=- No Events for 600 Seconds

an den Server gesendet. Die Trigger im Template prüfen auf die Zeichenfolge "-=ZABBIX-EVENTLOG=-" und lösen Alarm aus wenn diese nicht enthalten ist.



Aufbau der Filterdatei

Die Filterdatei sollte wie folgt aussehen:

01: Create one Line for every Eventlog-Entry to filter.
02: Examples:
03: ---------
04: Filter all Eventlog-Entries with the EventID 999 (Excat match!)
05: EventID:999
06: Filter all Eventlog-Entries with the Text "TESTAPP" at SOURCE (String in String Compare, case insensitive!)
07: Source:TESTAPP
08: Filter all Eventlog-Entries with the Text "Channel restart failed" at Message (String in String Compare, case insensitive!)
09: Message:Channel restart failed
10: Filter all Eventlog-Entries with the Text "{0006F03A-0000-0000-C000-000000000046}" at Insertion (String in String Compare, case insensitive!)
11: Insertion:{0006F03A-0000-0000-C000-000000000046}
12: DO NOT REMOVE THE FIRST 13 LINES! - The first 13 Lines will be ignored by Zabbix_Eventlog.exe (Hardcoded!) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
13: ################################################################################################################################################
# Fehlermeldung vom Exchange für Mobilgeräte wegen Timeout
Message:Der Durchschnitt der aktuellen Taktintervalle

Wie es dort steht: die ersten 13 Zeilen werden ignoriert!!!!!!!!
Danach sind auch Kommentare erlaubt, beim Einlesen der Datei wird am Zeilenanfang nach dem Schlüsselwörtern

EventID:
Source:
Message:
Insertion:

gesucht! Wenn dies nicht am Anfang einer Zeile steht so wird diese ignoriert!
Bei EventID: wird nach genauer Übereinstimmung der Nummer gesucht.
Alle anderen Tests sind "Zeichenfolge in Zeichenfolge" Überprüfungen. Würde man also

Message:a

setzen (nur der Buchstabe a) würden alle Meldungen die ein a im Text enthalten ignoriert werden. Nehmt also eindeutige Textpassagen!!!


Aussehen der Text-Meldungen

Important.png
Hinweis: Wenn Ihr euch von Zabbix bei der Auslösung von Triggern eine Email senden lasst so sorgt dafür das "{ITEM.VALUE1}" in der "Default message" steht - dann steht der gesamte Text auch in der Email!


Da ich das Eventlog-Format von Zabbix nicht nutzen konnte (Key "Eventlog" ist bei LLD-Items nicht erlaubt) kommt der gesamte Inhalt einer Meldung in einem Text-Stück.
Am Ende jeder Nachricht kommt immer die Gesamtzahl von Nachrichten im Zeitraum der Abfrage. Wenn da was von "No. 1 of 22" steht gibt es also ggf. 21 weitere Einträge über die Ihr keine Email bekommt.
Diese sind jedoch alle in der History des Items zu sehen.

Beispiel 1

EventType : ERROR
EventID   : 999 
Source    : ZabbixTest 
UTC Time  : 15.03.2015 20:48:25 
Insertion : Testnachricht! 
Message   : 
-----------
Testnachricht! 
 

---------------------------------------------------------------------------------------------------
This is Entry No. 1 of 1 Total Entries in the last 900 Seconds Check the Logs for additional Entries!!!!



Beispiel 2

EventType : ERROR
EventID   : 4005 
Source    : Microsoft-Windows-Winlogon 
UTC Time  : 15.03.2015 18:15:03 
Insertion : 
Message   : 
----------- 
Der Windows-Anmeldeprozess wurde unerwartet beendet.
 

---------------------------------------------------------------------------------------------------
This is Entry No. 1 of 2 Total Entries in the last 900 Seconds Check the Logs for additional Entries!!!!



Beispiel 3

EventType : WARNING
EventID   : 1035
Source    : MSExchangeTransport
UTC Time  : 15.03.2015 20:16:27
Insertion : LogonDenied, Default EXCHANGE, Ntlm
Message   : 
-----------
Fehler LogonDenied bei der eingehenden Authentifizierung f?r den Empfangsconnector Default EXCHANGE.
Der Authentifizierungsmechanismus ist Ntlm.
Die Quell-IP-Adresse des Clients, der die Authentifizierung bei Microsoft Exchange versucht hat, ist [83.111.106.13].
 

---------------------------------------------------------------------------------------------------
This is Entry No. 1 of 1 Total Entries in the last 900 Seconds Check the Logs for additional Entries!!!!




Bekannte "Fehler" und Beschränkungen

  • Wenn es innerhalb von 10 Minuten zum Beispiel 3 Fehler und 4 Warnungen gibt, wird ggf. nur jeweils 1 Trigger ausgelöst. Mann muss also prüfen ob es ggf. noch mehr Einträge gibt
  • Die Eventlog-Einträge kommen nicht im Eventlog-Format bei Zabbix an sondern im Text-Format. Der Text enthält die gesamten Informationen des Eventlog-Eintrages. Das Eventlog-Format von zabbix konnte nicht genommen werden da per LLD keine Items mit dem Typ "Eventlog[]" erstellt werden dürfen.
  • Da nur Eventlogs mit mindestens einem Eintrag erkannt werden kann es sein das ein Eventlog nach dem vollständigen Löschen aller Einträge zunächst wieder deaktiviert und nach 30 Tagen wieder gelöscht wird aus Zabbix
  • Wenn mehrere Zabbix-Agenten-Dienste parallel installiert sind, funktioniert dieses Template nur mit dem ersten Dienst (alphabetische Reihenfolge)
  • Umlaute werden durch Sonderzeichen ersetzt ... einfachen Umwandeln half bisher nicht ...




Quellcode

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Icon256-32.ico
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_Description=Zabbix Eventlog Monitor with Filter http://znil.net
#AutoIt3Wrapper_Res_Fileversion=1.0.0.80
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_LegalCopyright=2015 Bernhard Linz
#AutoIt3Wrapper_Res_SaveSource=y
#AutoIt3Wrapper_Res_Language=1031
#AutoIt3Wrapper_Res_Field=Website|http://znil.net
#AutoIt3Wrapper_Res_Field=Manual|http://znil.net/index.php?title=Zabbix:Template_Zabbix_Eventlog
#AutoIt3Wrapper_Res_Field=See You|znil.net
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
Opt('MustDeclareVars', 1)
#Region    ;************ Includes ************
#Include <Array.au3>
#include <Constants.au3>
#include <Date.au3>
#include <EventLog.au3>
#Include <WinAPIEx.au3>
#EndRegion ;************ Includes ************

; #########################################################################################
;     ##     ##    ###    ########  ####    ###    ########  ##       ########  ######
;     ##     ##   ## ##   ##     ##  ##    ## ##   ##     ## ##       ##       ##    ##
;     ##     ##  ##   ##  ##     ##  ##   ##   ##  ##     ## ##       ##       ##
;     ##     ## ##     ## ########   ##  ##     ## ########  ##       ######    ######
;      ##   ##  ######### ##   ##    ##  ######### ##     ## ##       ##             ##
;       ## ##   ##     ## ##    ##   ##  ##     ## ##     ## ##       ##       ##    ##
;        ###    ##     ## ##     ## #### ##     ## ########  ######## ########  ######
; #########################################################################################

Global $oMyError
Global $objWMIService

$oMyError = ObjEvent("AutoIt.Error", "oMyError") ; Install a custom error handler
$objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\localhost\root\cimv2")

Global $sHELP = "Zabbix_Eventlog.exe [OPTION] [Period] [Blacklist-File]" & @CRLF & _
				@CRLF & _
				"Possible Values for OPTIONS:" & @CRLF & _
				"----------------------------" & @CRLF & _
				"discovereventlogs  : Create JSON String for detected Eventlogs" & @CRLF & _
				"                     Output Text to Console and send JSON direct to" & @CRLF & _
				"                     Zabbix Server (using Configuration of Zabbix Service" & @CRLF & _
				"                     ZBX_NOTSUPPORTED if there any errors" & @CRLF & _
				'[Name of Eventlog] : For Example "Application" or "System"' & @CRLF & _
				@CRLF & _
				"Other optional Parameters:" & @CRLF & _
				"--------------------------" & @CRLF & _
				"Period             : How many Seconds go back in Eventlog from now." & @CRLF & _
				"                     Default: 600 Seconds, min. Value 60 Seconds" & @CRLF & _
				@CRLF & _
				"Blacklist-File     : Additional Textfile with Blacklistet Eventlog Entries" & @CRLF & _
				"					  The first 13 Lines of File will be ignored!" & @CRLF & _
				'                     Take a look at Example File "Zabbix_Eventlog-Filter.txt"' & @CRLF & _
				"                     This File will used in addition to the local" & @CRLF & _
				'                     "Zabbix_Eventlog-Filter.txt" File in the same Directory as the' & @CRLF & _
				'                     "Zabbix_Eventlog.exe"' & _
				@CRLF & _
				'First 13 Lines of a "Zabbix_Eventlog-Filter.txt":' & @CRLF & _
				"-------------------------------------------------" & @CRLF & _
				'01: Create one Line for every Eventlog-Entry to filter.' & @CRLF & _
				'02: Examples:' & @CRLF & _
				'03: ---------' & @CRLF & _
				'04: Filter all Eventlog-Entries with the EventID 999 (Excat match!)' & @CRLF & _
				'05: EventID:999' & @CRLF & _
				'06: Filter all Eventlog-Entries with the Text "TESTAPP" at SOURCE (String in String Compare, case insensitive!)' & @CRLF & _
				'07: Source:TESTAPP' & @CRLF & _
				'08: Filter all Eventlog-Entries with the Text "Channel restart failed" at Message (String in String Compare, case insensitive!)' & @CRLF & _
				'09: Message:Channel restart failed' & @CRLF & _
				'10: Filter all Eventlog-Entries with the Text "{0006F03A-0000-0000-C000-000000000046}" at Insertion (String in String Compare, case insensitive!)' & @CRLF & _
				'11: Insertion:{0006F03A-0000-0000-C000-000000000046}' & @CRLF & _
				'12: DO NOT REMOVE THE FIRST 13 LINES! - The first 13 Lines will be ignored by Zabbix_Eventlog.exe (Hardcoded!) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' & @CRLF & _
				'13: ################################################################################################################################################' & @CRLF & _
				@CRLF





;ConsoleWrite(_GetEventsWMI($CmdLine[1]))

Global $sZabbix_agentd_exe
Global $sZabbix_agentd_conf
Global $sZabbix_sender_exe
Global $sZabbix_Hostname
Global $sZabbix_Server
Global $iZabbix_Server_Port

Global $aEventlogs[1][9]	; [0][0] = Anzahl
							; [x][1] = Name des Eventlogs (LogfileName)
							; [x][2] = Maximale Größe (MaxFileSize)
							; [x][3] = Aktuelle Größe (FileSize)
							; [x][4] = Anzahl der Einträge (NumberOfRecords)
							; [x][5] = Status (Status)
							; [x][6] = Pfad zum DisplayNameFile
							; [x][7] = DisplayNameID
							; [x][8] = DisplayName
$aEventlogs[0][1] = "LogfileName"
$aEventlogs[0][2] = "MaxFileSize"
$aEventlogs[0][3] = "FileSize"
$aEventlogs[0][4] = "NumberOfRecords"
$aEventlogs[0][5] = "Status"
$aEventlogs[0][6] = "DisplayNameFile"
$aEventlogs[0][7] = "DisplayNameID"
$aEventlogs[0][8] = "DisplayName"

; Für unbekannte Eventlogs. Name steht dafür in verschiedenen DLL-Dateien, hat sich als zu umständlich erwiesen diesen daraus aus zu lesen
Global $aDisplayNamesOfEventlogs[3][2]	; [0][x] = LogFileName
										; [1][x] = DisplayName
$aDisplayNamesOfEventlogs[0][0] = "HardwareEvents"
$aDisplayNamesOfEventlogs[0][1]	= "Hardware Events"
$aDisplayNamesOfEventlogs[1][0] = "ODiag"
$aDisplayNamesOfEventlogs[1][1] = "Microsoft Office Diagnostics"
$aDisplayNamesOfEventlogs[2][0] = "OSession"
$aDisplayNamesOfEventlogs[2][1] = "Microsoft Office Sessions"

Global $aMessage[1][8]	; [0][0] = Anzahl
						; [x][1] = EventID
						; [x][2] = Time-String
						; [x][3] = Source
						; [x][4] = Insertion
						; [x][5] = Message
						; [x][6] = EventType (1 = Error, 2 = Warning, 3 = Information, 4 = Security Audit Success, 5 = Security Audit Failure)$aMessage[0][0] = 0
$aMessage[0][1] = "EventID"
$aMessage[0][2] = "Time"
$aMessage[0][3] = "Source"
$aMessage[0][4] = "Insertion"
$aMessage[0][5] = "Message"
$aMessage[0][6] = "EventType"

Global $iStartTime
Global $iRunTime

Global $b_QueryEventlog
Global $i_Period = 600

Global $s_JSONOutput
Global $colItems = ""

Global $aFilterList_EventID[1]
Global $aFilterList_Source[1]
Global $aFilterList_Message[1]
Global $aFilterList_Insertion[1]
$aFilterList_EventID[0] = 0
$aFilterList_Source[0] = 0
$aFilterList_Message[0] = 0
$aFilterList_Insertion[0] = 0
Global $bFilterEntry

Global $sLokalFilterFile = @ScriptDir & "\Zabbix_Eventlog-Filter.txt"
Global $sRemoteFilterFile

Global $iEventCounter = 0
Global $iERROR_Counter = 0
Global $iWARNING_Counter = 0
Global $iFiltered_Counter = 0

Global $bError_was_send = False
Global $bWarning_was_send = False


Dim $stemp
; ##################################################################################################################################################################################################################################################
; ##################################################################################################################################################################################################################################################
;                                                                                   ################################################################################################################################################################
; ######## ##     ## ##    ##  ######  ######## ####  #######  ##    ##  ######     ################################################################################################################################################################
; ##       ##     ## ###   ## ##    ##    ##     ##  ##     ## ###   ## ##    ##    ################################################################################################################################################################
; ##       ##     ## ####  ## ##          ##     ##  ##     ## ####  ## ##          ################################################################################################################################################################
; ######   ##     ## ## ## ## ##          ##     ##  ##     ## ## ## ##  ######     ################################################################################################################################################################
; ##       ##     ## ##  #### ##          ##     ##  ##     ## ##  ####       ##    ################################################################################################################################################################
; ##       ##     ## ##   ### ##    ##    ##     ##  ##     ## ##   ### ##    ##    ################################################################################################################################################################
; ##        #######  ##    ##  ######     ##    ####  #######  ##    ##  ######     ################################################################################################################################################################
;                                                                                   ################################################################################################################################################################
; ##################################################################################################################################################################################################################################################
; ##################################################################################################################################################################################################################################################

; ###################################################################################
; _ANSI2OEM löst das Problem mit dem Umlauten und anderen Sonderzeichen. Es wandelt Text so um das er korrekt in der DOS-Box dargestellt wird
; So können hier im Quellcode auch Umlaute verwendet werden (in den Textausgaben) und diese werden dann korrekt dargestellt
; Wir zudem für die Prüfung der Gruppenzugehörigkeit benötigt für Gruppen mit Umlauten, z.B. Domänen-Admins
; Dank an Xenobiologist von AutoIt.de für diese Lösung: http://www.autoit.de/index.php?page=Thread&threadID=9461&highlight=ANSI2OEM
Func _ANSI2OEM($text)
	$text = DllCall('user32.dll', 'Int', 'CharToOem', 'str', $text, 'str', '')
	Return $text[2]
EndFunc   ;==>_ANSI2OEM
; #######################################################################################################################################################
;             ########  ########    ###    ########  #### ##    ## ######## #### ##       ######## ######## ########  ######## #### ##       ########
;             ##     ## ##         ## ##   ##     ##  ##  ###   ## ##        ##  ##          ##    ##       ##     ## ##        ##  ##       ##
;             ##     ## ##        ##   ##  ##     ##  ##  ####  ## ##        ##  ##          ##    ##       ##     ## ##        ##  ##       ##
;             ########  ######   ##     ## ##     ##  ##  ## ## ## ######    ##  ##          ##    ######   ########  ######    ##  ##       ######
;             ##   ##   ##       ######### ##     ##  ##  ##  #### ##        ##  ##          ##    ##       ##   ##   ##        ##  ##       ##
;             ##    ##  ##       ##     ## ##     ##  ##  ##   ### ##        ##  ##          ##    ##       ##    ##  ##        ##  ##       ##
;     ####### ##     ## ######## ##     ## ########  #### ##    ## ##       #### ########    ##    ######## ##     ## ##       #### ######## ########
; #######################################################################################################################################################
Func _ReadInFilterFile($s_FilterFile)
	Local $atemp
	Local $sValue
	; Check if File exist
	If FileExists($s_FilterFile) = 0 Then
		Return
	EndIf
	$atemp = FileReadToArray($s_FilterFile)
	; Check Reading File
	If IsArray($atemp) = 0 Then
		Return
	EndIf
	; We Skip the first 13 Lines so the array must be greater than 13
	If UBound($atemp) < 14 Then
		Return
	EndIf
	; All Checks finished, Process the Filters
	;_ArrayDisplay($atemp)
	; $aFilterList_EventID[0] = 0
	; $aFilterList_Source[0] = 0
	; $aFilterList_Message[0] = 0
	; $aFilterList_Insertion[0] = 0
;~ 	ConsoleWrite("Ubound($atemp): " & UBound($atemp) & @CRLF)
	For $j = 13 To (UBound($atemp) - 1)
;~ 		ConsoleWrite("$j: " & $j & @CRLF)
		; EventID
		If StringLeft($atemp[$j], StringLen("EventID:")) = "EventID:" Then
;~ 			ConsoleWrite("EventID!" & @CRLF)
			$sValue = Int(StringTrimLeft($atemp[$j], StringLen("EventID:")))
			If IsNumber($sValue) = 1 Then
				$aFilterList_EventID[0] = $aFilterList_EventID[0] + 1
				ReDim $aFilterList_EventID[ $aFilterList_EventID[0] + 1 ]
				$aFilterList_EventID[ $aFilterList_EventID[0] ] = $sValue
			EndIf
		EndIf
		If StringLeft($atemp[$j], StringLen("Source:")) = "Source:" Then
;~ 			ConsoleWrite("Source!" & @CRLF)
			$sValue = StringTrimLeft($atemp[$j], StringLen("Source:"))
			If StringLen($sValue) > 0 Then
				$aFilterList_Source[0] = $aFilterList_Source[0] + 1
				ReDim $aFilterList_Source[ $aFilterList_Source[0] + 1 ]
				$aFilterList_Source[ $aFilterList_Source[0] ] = $sValue
			EndIf
		EndIf
		If StringLeft($atemp[$j], StringLen("Message:")) = "Message:" Then
;~ 			ConsoleWrite("Message!" & @CRLF)
			$sValue = StringTrimLeft($atemp[$j], StringLen("Message:"))
			If StringLen($sValue) > 0 Then
				$aFilterList_Message[0] = $aFilterList_Message[0] + 1
				ReDim $aFilterList_Message[ $aFilterList_Message[0] + 1 ]
				$aFilterList_Message[ $aFilterList_Message[0] ] = $sValue
			EndIf
		EndIf
		If StringLeft($atemp[$j], StringLen("Insertion:")) = "Insertion:" Then
;~ 			ConsoleWrite("Insertion!" & @CRLF)
			$sValue = StringTrimLeft($atemp[$j], StringLen("Insertion:"))
			If StringLen($sValue) > 0 Then
				$aFilterList_Insertion[0] = $aFilterList_Insertion[0] + 1
				ReDim $aFilterList_Insertion[ $aFilterList_Insertion[0] + 1 ]
				$aFilterList_Insertion[ $aFilterList_Insertion[0] ] = $sValue
			EndIf
		EndIf
	Next
;~ 	_ArrayDisplay($aFilterList_EventID)
;~ 	_ArrayDisplay($aFilterList_Source)
;~ 	_ArrayDisplay($aFilterList_Message)
;~ 	_ArrayDisplay($aFilterList_Insertion)
EndFunc
; ###########################################################################################################################################################
;              ######   ######## ########    ###    ##       ##       ######## ##     ## ######## ##    ## ######## ##        #######   ######    ######
;             ##    ##  ##          ##      ## ##   ##       ##       ##       ##     ## ##       ###   ##    ##    ##       ##     ## ##    ##  ##    ##
;             ##        ##          ##     ##   ##  ##       ##       ##       ##     ## ##       ####  ##    ##    ##       ##     ## ##        ##
;             ##   #### ######      ##    ##     ## ##       ##       ######   ##     ## ######   ## ## ##    ##    ##       ##     ## ##   ####  ######
;             ##    ##  ##          ##    ######### ##       ##       ##        ##   ##  ##       ##  ####    ##    ##       ##     ## ##    ##        ##
;             ##    ##  ##          ##    ##     ## ##       ##       ##         ## ##   ##       ##   ###    ##    ##       ##     ## ##    ##  ##    ##
;     #######  ######   ########    ##    ##     ## ######## ######## ########    ###    ######## ##    ##    ##    ########  #######   ######    ######
; ###########################################################################################################################################################
Func _GetAllEventlogs()
	$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NTEventlogFile", "WQL", 0x10 + 0x20)
	If IsObj($colItems) then
		For $objItem In $colItems
			If $objItem.NumberOfRecords > 0 Then
				$aEventlogs[0][0] = $aEventlogs[0][0] + 1
				ReDim $aEventlogs[ $aEventlogs[0][0] + 1 ][9]
				$aEventlogs[ $aEventlogs[0][0] ][1] = $objItem.LogfileName
				$aEventlogs[ $aEventlogs[0][0] ][2] = $objItem.MaxFileSize
				$aEventlogs[ $aEventlogs[0][0] ][3] = $objItem.FileSize
				$aEventlogs[ $aEventlogs[0][0] ][4] = $objItem.NumberOfRecords
				$aEventlogs[ $aEventlogs[0][0] ][5] = $objItem.Status
				$aEventlogs[ $aEventlogs[0][0] ][6] = RegRead("HKLM\SYSTEM\CurrentControlSet\services\eventlog\" & $objItem.LogfileName, "DisplayNameFile")
				$aEventlogs[ $aEventlogs[0][0] ][7] = RegRead("HKLM\SYSTEM\CurrentControlSet\services\eventlog\" & $objItem.LogfileName, "DisplayNameID")
			EndIf
		Next
	EndIf
EndFunc

; ##################################################################################################################
;             ########    ###    ########  ########  #### ##     ##          ######   #######  ##    ## ########
;                  ##    ## ##   ##     ## ##     ##  ##   ##   ##          ##    ## ##     ## ###   ## ##
;                 ##    ##   ##  ##     ## ##     ##  ##    ## ##           ##       ##     ## ####  ## ##
;                ##    ##     ## ########  ########   ##     ###            ##       ##     ## ## ## ## ######
;               ##     ######### ##     ## ##     ##  ##    ## ##           ##       ##     ## ##  #### ##
;              ##      ##     ## ##     ## ##     ##  ##   ##   ##          ##    ## ##     ## ##   ### ##
;     ####### ######## ##     ## ########  ########  #### ##     ## #######  ######   #######  ##    ## ##
; ##################################################################################################################
Func _Zabbix_conf()
	Local $sRegTMP
	Local $iRegTMP = 0
	Local $iLoop
	Local $aRegTMP
	Local $aZabbix_config
	Local $sZabbix_config_file
	Local $a2temp
	While 1
		$iRegTMP = $iRegTMP + 1
		$sRegTMP = RegEnumKey("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services", $iRegTMP)
		If @error Then
			ExitLoop
		EndIf
		$sRegTMP = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\" & $sRegTMP, "ImagePath")
		If @error = 0 Then
			If StringInStr($sRegTMP, "zabbix_agentd.exe") > 0 Then
				;ConsoleWrite("Gefunden: " & $sRegTMP & @CRLF)
				$aRegTMP = StringSplit($sRegTMP, '"')
				;_ArrayDisplay($aRegTMP)
				$sZabbix_agentd_exe = $aRegTMP[2]
				$sZabbix_sender_exe = StringReplace($sZabbix_agentd_exe, "zabbix_agentd.exe", "zabbix_sender.exe")
				$sZabbix_config_file = $aRegTMP[4]
				$sZabbix_agentd_conf = $sZabbix_config_file
				$aZabbix_config = FileReadToArray($sZabbix_config_file)
				If @error = 0 Then
					For $iLoop = 0 To (UBound($aZabbix_config) -1)
						If StringLeft($aZabbix_config[$iLoop], StringLen("ServerActive=")) = "ServerActive=" Then
							$sZabbix_Server = StringReplace($aZabbix_config[$iLoop], "ServerActive=", "")
							$sZabbix_Server = StringReplace($sZabbix_Server, " ", "")
							$a2temp = StringSplit($sZabbix_Server, ":")
							If $a2temp[0] = 1 Then
								$iZabbix_Server_Port = 10051
							Else
								$sZabbix_Server = $a2temp[1]
								$iZabbix_Server_Port = $a2temp[2]
							EndIf
						EndIf
						If StringLeft($aZabbix_config[$iLoop], StringLen("Hostname=")) = "Hostname=" Then
							$sZabbix_Hostname = StringReplace($aZabbix_config[$iLoop], "Hostname=", "")
							$sZabbix_Hostname = StringReplace($sZabbix_Hostname, " ", "")
						EndIf
					Next
				Else
					ConsoleWrite("File not found: " & $sZabbix_config_file & @CRLF)
					Exit 1
				EndIf
				If FileExists($sZabbix_sender_exe) = 0 Then
					ConsoleWrite("zabbix_sender.exe not found at: " & $sZabbix_sender_exe & @CRLF)
					Exit 1
				EndIf
			EndIf
		EndIf
	WEnd
;~ 	ConsoleWrite("zabbix_agentd.exe:       " & '"' & $sZabbix_agentd_exe & '"' & @CRLF)
;~ 	ConsoleWrite("zabbix_sender.exe:       " & '"' & $sZabbix_sender_exe & '"' & @CRLF)
;~ 	ConsoleWrite("Hostname used in Zabbix: " & '"' & $sZabbix_Hostname & '"' &  @CRLF)
;~ 	ConsoleWrite("IP(:Port) Zabbix Server: " & '"' & $sZabbix_Server & '"' & @CRLF)
EndFunc

; #############################################################################################################################################################################################################################################################
;              ######  ######## ##    ## ########  ######## #### ##       ########         ##      ## #### ######## ##     ##         ########    ###    ########  ########  #### ##     ##          ######  ######## ##    ## ########  ######## ########
;             ##    ## ##       ###   ## ##     ## ##        ##  ##       ##               ##  ##  ##  ##     ##    ##     ##              ##    ## ##   ##     ## ##     ##  ##   ##   ##          ##    ## ##       ###   ## ##     ## ##       ##     ##
;             ##       ##       ####  ## ##     ## ##        ##  ##       ##               ##  ##  ##  ##     ##    ##     ##             ##    ##   ##  ##     ## ##     ##  ##    ## ##           ##       ##       ####  ## ##     ## ##       ##     ##
;              ######  ######   ## ## ## ##     ## ######    ##  ##       ######           ##  ##  ##  ##     ##    #########            ##    ##     ## ########  ########   ##     ###             ######  ######   ## ## ## ##     ## ######   ########
;                   ## ##       ##  #### ##     ## ##        ##  ##       ##               ##  ##  ##  ##     ##    ##     ##           ##     ######### ##     ## ##     ##  ##    ## ##                 ## ##       ##  #### ##     ## ##       ##   ##
;             ##    ## ##       ##   ### ##     ## ##        ##  ##       ##               ##  ##  ##  ##     ##    ##     ##          ##      ##     ## ##     ## ##     ##  ##   ##   ##          ##    ## ##       ##   ### ##     ## ##       ##    ##
;     #######  ######  ######## ##    ## ########  ##       #### ######## ######## #######  ###  ###  ####    ##    ##     ## ####### ######## ##     ## ########  ########  #### ##     ## #######  ######  ######## ##    ## ########  ######## ##     ##
; #############################################################################################################################################################################################################################################################
Func _SendFile_with_Zabbix_Sender($sFileForZabbixSender)
	FileDelete($sFileForZabbixSender)
	FileWriteLine($sFileForZabbixSender, $s_JSONOutput)
;~ 	ConsoleWrite(@CRLF)
;~ 	ConsoleWrite("Complete JSON-String for sending:" & "---------------------------------" & @CRLF)
;~ 	ConsoleWrite($s_JSONOutput & @CRLF & @CRLF)
;~ 	ConsoleWrite("Using Zabbix_Sender.exe       : " & $sZabbix_sender_exe & @CRLF)
;~ 	ConsoleWrite("Using Zabbix_Agentd.conf File : " & $sZabbix_agentd_conf & @CRLF)
;~ 	ConsoleWrite("Using Temp-Directory          : " & @TempDir & @CRLF)
;~ 	ConsoleWrite("File to Send :                : " & $sFileForZabbixSender & @CRLF)
;~ 	ConsoleWrite("Hostname in Zabbix            : " & $sZabbix_Hostname & @CRLF)
;~ 	ConsoleWrite("Zabbix Server                 : " & $sZabbix_Server & @CRLF)
;~ 	ConsoleWrite("Zabbix Server Port            : " & $iZabbix_Server_Port & @CRLF)
;~ 	ConsoleWrite("Complete Run-Command          : " & '"' & $sZabbix_sender_exe & '"' & " -c " & '"' & $sZabbix_agentd_conf & '"' & " -i " & '"' & $sFileForZabbixSender & '"' & @CRLF)
;~ 	ConsoleWrite("Output from Zabbix_Sender.exe : " & @CRLF)
;~ 	ConsoleWrite("-------------------------------" & @CRLF)
;~ 	RunWait('"' & $sZabbix_sender_exe & '"' & " -c " & '"' & $sZabbix_agentd_conf & '"' & " -i " & '"' & $sFileForZabbixSender & '"', "", @SW_HIDE)
	RunWait('"' & $sZabbix_sender_exe & '"' & " -c " & '"' & $sZabbix_agentd_conf & '"' & " -i " & '"' & $sFileForZabbixSender & '"', "", @SW_HIDE, $RUN_CREATE_NEW_CONSOLE)
	;Sleep(1000)
;~ 	ConsoleWrite(@CRLF)
EndFunc

; #############################################################################################################################################################################################################################################################################
;              ######  ######## ##    ## ########  ##     ##    ###    ##       ##     ## ########         ##      ## #### ######## ##     ##         ########    ###    ########  ########  #### ##     ##          ######  ######## ##    ## ########  ######## ########
;             ##    ## ##       ###   ## ##     ## ##     ##   ## ##   ##       ##     ## ##               ##  ##  ##  ##     ##    ##     ##              ##    ## ##   ##     ## ##     ##  ##   ##   ##          ##    ## ##       ###   ## ##     ## ##       ##     ##
;             ##       ##       ####  ## ##     ## ##     ##  ##   ##  ##       ##     ## ##               ##  ##  ##  ##     ##    ##     ##             ##    ##   ##  ##     ## ##     ##  ##    ## ##           ##       ##       ####  ## ##     ## ##       ##     ##
;              ######  ######   ## ## ## ##     ## ##     ## ##     ## ##       ##     ## ######           ##  ##  ##  ##     ##    #########            ##    ##     ## ########  ########   ##     ###             ######  ######   ## ## ## ##     ## ######   ########
;                   ## ##       ##  #### ##     ##  ##   ##  ######### ##       ##     ## ##               ##  ##  ##  ##     ##    ##     ##           ##     ######### ##     ## ##     ##  ##    ## ##                 ## ##       ##  #### ##     ## ##       ##   ##
;             ##    ## ##       ##   ### ##     ##   ## ##   ##     ## ##       ##     ## ##               ##  ##  ##  ##     ##    ##     ##          ##      ##     ## ##     ## ##     ##  ##   ##   ##          ##    ## ##       ##   ### ##     ## ##       ##    ##
;     #######  ######  ######## ##    ## ########     ###    ##     ## ########  #######  ######## #######  ###  ###  ####    ##    ##     ## ####### ######## ##     ## ########  ########  #### ##     ## #######  ######  ######## ##    ## ########  ######## ##     ##
; #############################################################################################################################################################################################################################################################################

Func _SendValue_with_Zabbix_Sender($sItemName, $sItemValue)
		;ConsoleWrite('"' & $sZabbix_sender_exe & '"' & " -c " & '"' & $sZabbix_agentd_conf & '"' & " -k " & '"' & $sItemName & '" -o "' & $sItemValue & '"' & @CRLF)
		;RunWait('"' & $sZabbix_sender_exe & '"' & " -c " & '"' & $sZabbix_agentd_conf & '"' & " -k " & '"' & $sItemName & '" -o "' & $sItemValue & '"', "", @SW_HIDE)
		RunWait('"' & $sZabbix_sender_exe & '"' & " -c " & '"' & $sZabbix_agentd_conf & '"' & " -k " & '"' & $sItemName & '" -o "' & $sItemValue & '"', "", @SW_HIDE, $RUN_CREATE_NEW_CONSOLE)
EndFunc

; ##################################################################################################################
;             ######  ######## ##    ## ########  ########  ##     ## ##    ## ######## #### ##     ## ########
;             ##    ## ##       ###   ## ##     ## ##     ## ##     ## ###   ##    ##     ##  ###   ### ##
;             ##       ##       ####  ## ##     ## ##     ## ##     ## ####  ##    ##     ##  #### #### ##
;              ######  ######   ## ## ## ##     ## ########  ##     ## ## ## ##    ##     ##  ## ### ## ######
;                   ## ##       ##  #### ##     ## ##   ##   ##     ## ##  ####    ##     ##  ##     ## ##
;             ##    ## ##       ##   ### ##     ## ##    ##  ##     ## ##   ###    ##     ##  ##     ## ##
;     #######  ######  ######## ##    ## ########  ##     ##  #######  ##    ##    ##    #### ##     ## ########
; ##################################################################################################################
Func _SendRuntime()
   $iRunTime = _DateDiff("s", "1970/01/01 00:00:00", _NowCalc()) - $iStartTime
   _SendValue_with_Zabbix_Sender("znil.ZabbixEventlog.Runtime", $iRunTime)
EndFunc

; ############################################################################################################################
;              ######   ######## ######## ######## ##     ## ######## ##    ## ########  ######  ##      ## ##     ## ####
;             ##    ##  ##          ##    ##       ##     ## ##       ###   ##    ##    ##    ## ##  ##  ## ###   ###  ##
;             ##        ##          ##    ##       ##     ## ##       ####  ##    ##    ##       ##  ##  ## #### ####  ##
;             ##   #### ######      ##    ######   ##     ## ######   ## ## ##    ##     ######  ##  ##  ## ## ### ##  ##
;             ##    ##  ##          ##    ##        ##   ##  ##       ##  ####    ##          ## ##  ##  ## ##     ##  ##
;             ##    ##  ##          ##    ##         ## ##   ##       ##   ###    ##    ##    ## ##  ##  ## ##     ##  ##
;     #######  ######   ########    ##    ########    ###    ######## ##    ##    ##     ######   ###  ###  ##     ## ####
; ############################################################################################################################
Func _GetEventsWMI($i_SecondsBack = 600, $s_onlyEventID = "", $s_Categorie = "Application")
	Local $Eventlog_Err, $Eventlog_Err_Logfile, $Eventlog_Err_EventType, $Eventlog_Err_EventID, $Eventlog_Err_TimeGenerated, $Eventlog_Err_SourceName, $Eventlog_Err_InsertionStrings, $Eventlog_Err_Message
	Local $date_threshold, $days_threshold, $date_threshold_WQL, $now, $x;, $tmp
	Local $colItems
	Local $atemp
	Local $UTCTime = _Date_Time_GetSystemTime()
	$now = _Date_Time_SystemTimeToDateTimeStr($UTCTime, 1)
;~ 	ConsoleWrite("Zeit Unterschied = " & _DateDiff("s", _NowCalc, $now) & @CRLF)
;~ 	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $now = ' & $now & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
	$date_threshold = _DateAdd('s', ($i_SecondsBack * (-1)), $now) ;get the date / time value fom past
;~ 	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $date_threshold = ' & $date_threshold & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
;~ 	ConsoleWrite("_Date_Time_GetSystemTime : " & _Date_Time_SystemTimeToDateTimeStr($UTCTime, 1) & @CRLF)
	;$date_threshold_WQL = StringLeft(StringReplace(StringReplace(StringReplace(_DateAdd('s', ($i_SecondsBack * (-1)), $now), ":", ""), "/", ""), " ", ""), 8) ;convert to WQL-Supported Date Formats
	$date_threshold_WQL = StringReplace(StringReplace(StringReplace(_DateAdd('s', ($i_SecondsBack * (-1)), $now), ":", ""), "/", ""), " ", "") & ".000000+000"
;~ 	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $i_SecondsBack = ' & $i_SecondsBack & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
;~ 	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $date_threshold_WQL = ' & $date_threshold_WQL & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
;~ 	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $s_Categorie = ' & $s_Categorie & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
;~ 	ConsoleWrite("$date_threshold_WQL : " & $date_threshold_WQL & @CRLF)
;~ 	$date_threshold_WQL = "20150304100000.000000+000"
;~ 	ConsoleWrite("$date_threshold_WQL : " & $date_threshold_WQL & @CRLF)
	If $s_onlyEventID = "" Then
		$colItems = $objWMIService.ExecQuery("SELECT Logfile, EventType, EventCode, TimeGenerated, SourceName, InsertionStrings, Message FROM Win32_NTLogEvent WHERE LogFile='" & $s_Categorie & "' AND TimeGenerated >= '" & $date_threshold_WQL & "' AND ( EventType=1 OR EventType=2 )", "WQL", 0x30)
		; $colItems = $objWMIService.ExecQuery("SELECT Logfile, EventType, EventCode, TimeGenerated, SourceName, InsertionStrings, Message FROM Win32_NTLogEvent WHERE LogFile='" & $s_Categorie & "' AND TimeGenerated >= '" & $date_threshold_WQL & "' AND EventType=1", "WQL", 0x30)
	Else
		$colItems = $objWMIService.ExecQuery("SELECT Logfile, EventType, EventCode, TimeGenerated, SourceName, InsertionStrings, Message FROM Win32_NTLogEvent WHERE EventCode = '" & $s_onlyEventID & "' And LogFile='" & $s_Categorie & "' AND TimeGenerated >= '" & $date_threshold_WQL & "' AND EventType=1", "WQL", 0x30)
	EndIf
	If IsObj($colItems) Then
		For $objItem In $colItems
			$Eventlog_Err_Logfile = $objItem.Logfile
			$Eventlog_Err_EventType = $objItem.EventType
			$Eventlog_Err_EventID = $objItem.EventCode ;$objItem.EventIdentifier
			$Eventlog_Err_TimeGenerated = WMIDateStringToDate2($objItem.TimeGenerated)
			$Eventlog_Err_SourceName = $objItem.SourceName
			$Eventlog_Err_InsertionStrings = ""
			For $x = 0 To UBound($objItem.InsertionStrings) - 1
				If Number($objItem.InsertionStrings($x)) = 0 And StringLeft($objItem.InsertionStrings($x), 2) <> "%%" And $objItem.InsertionStrings($x) <> "" And StringLen($objItem.InsertionStrings($x)) > 1 Then ;skip unneeded strings
					$Eventlog_Err_InsertionStrings &= StringStripWS(StringReplace(StringReplace($objItem.InsertionStrings($x), Chr(10), ""), Chr(13), ""), 7) & ", "
				EndIf
			Next
			$Eventlog_Err_InsertionStrings = StringTrimRight($Eventlog_Err_InsertionStrings, 2)
			$Eventlog_Err_Message = StringStripWS(StringReplace(StringReplace($objItem.Message, Chr(10), ""), Chr(13), ""), 7)
			$Eventlog_Err &= "Localhost" & ": " & $Eventlog_Err_Logfile & @CRLF & _
							"Type : " & $Eventlog_Err_EventType & @CRLF & _
							"EventID : " & $Eventlog_Err_EventID & @CRLF & _
							"Time : " & $Eventlog_Err_TimeGenerated & @CRLF & _
							"Source : " & $Eventlog_Err_SourceName & @CRLF & _
							"Insertion : " & $Eventlog_Err_InsertionStrings & @CRLF & _
							"Message : " & $Eventlog_Err_Message & @CRLF & _
							"--------------------------------------------------" & @CRLF
			; $aMessage[1][7]	; [0][0] = Anzahl
								; [x][1] = EventID
								; [x][2] = Time-String
								; [x][3] = Source
								; [x][4] = Insertion
								; [x][5] = Message
								; [x][6] = EventType (1 = Error, 2 = Warning, 3 = Information, 4 = Security Audit Success, 5 = Security Audit Failure)

			$aMessage[0][0] = $aMessage[0][0] + 1
			ReDim $aMessage[ $aMessage[0][0] + 1 ][8]
			$aMessage[ $aMessage[0][0] ][1] = Int($Eventlog_Err_EventID)
			$aMessage[ $aMessage[0][0] ][2] = $Eventlog_Err_TimeGenerated
			$aMessage[ $aMessage[0][0] ][3] = $Eventlog_Err_SourceName
			$aMessage[ $aMessage[0][0] ][4] = $Eventlog_Err_InsertionStrings
			$aMessage[ $aMessage[0][0] ][5] = $Eventlog_Err_Message
			$aMessage[ $aMessage[0][0] ][6] = $Eventlog_Err_EventType
		Next
		;Return $Eventlog_Err
	Else
		;Return SetError(2, 0, "Error!")
	EndIf
EndFunc

; ##############################################################################################################################################################################################
;     ##      ## ##     ## #### ########     ###    ######## ########  ######  ######## ########  #### ##    ##  ######   ########  #######  ########     ###    ######## ########  #######
;     ##  ##  ## ###   ###  ##  ##     ##   ## ##      ##    ##       ##    ##    ##    ##     ##  ##  ###   ## ##    ##     ##    ##     ## ##     ##   ## ##      ##    ##       ##     ##
;     ##  ##  ## #### ####  ##  ##     ##  ##   ##     ##    ##       ##          ##    ##     ##  ##  ####  ## ##           ##    ##     ## ##     ##  ##   ##     ##    ##              ##
;     ##  ##  ## ## ### ##  ##  ##     ## ##     ##    ##    ######    ######     ##    ########   ##  ## ## ## ##   ####    ##    ##     ## ##     ## ##     ##    ##    ######    #######
;     ##  ##  ## ##     ##  ##  ##     ## #########    ##    ##             ##    ##    ##   ##    ##  ##  #### ##    ##     ##    ##     ## ##     ## #########    ##    ##       ##
;     ##  ##  ## ##     ##  ##  ##     ## ##     ##    ##    ##       ##    ##    ##    ##    ##   ##  ##   ### ##    ##     ##    ##     ## ##     ## ##     ##    ##    ##       ##
;      ###  ###  ##     ## #### ########  ##     ##    ##    ########  ######     ##    ##     ## #### ##    ##  ######      ##     #######  ########  ##     ##    ##    ######## #########
; ##############################################################################################################################################################################################
Func WMIDateStringToDate2($dtmDate)
    Return (StringMid($dtmDate, 7, 2) & "." & StringMid($dtmDate, 5, 2) & "." & StringLeft($dtmDate, 4) & " " & _
            StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate, 13, 2))
EndFunc   ;==>WMIDateStringToDate2

; #####################################################################################
;      #######  ##     ## ##    ## ######## ########  ########   #######  ########
;     ##     ## ###   ###  ##  ##  ##       ##     ## ##     ## ##     ## ##     ##
;     ##     ## #### ####   ####   ##       ##     ## ##     ## ##     ## ##     ##
;     ##     ## ## ### ##    ##    ######   ########  ########  ##     ## ########
;     ##     ## ##     ##    ##    ##       ##   ##   ##   ##   ##     ## ##   ##
;     ##     ## ##     ##    ##    ##       ##    ##  ##    ##  ##     ## ##    ##
;      #######  ##     ##    ##    ######## ##     ## ##     ##  #######  ##     ##
; #####################################################################################
Func oMyError()
;~   Msgbox(0,"AutoItCOM Test","We intercepted a COM Error !"      & @CRLF  & @CRLF & _
;~              "err.description is: "    & @TAB & $oMyError.Description    & @CRLF & _
;~              "err.windescription:"     & @TAB & $oMyError.WinDescription & @CRLF & _
;~              "err.number is: "         & @TAB & Hex($oMyError.Number, 8) & @CRLF & _
;~              "err.lastdllerror is: "   & @TAB & $oMyError.LastDllError   & @CRLF & _
;~              "err.scriptline is: "     & @TAB & $oMyError.Scriptline     & @CRLF & _
;~              "err.source is: "         & @TAB & $oMyError.Source         & @CRLF & _
;~              "err.helpfile is: "       & @TAB & $oMyError.Helpfile       & @CRLF & _
;~              "err.helpcontext is: "    & @TAB & $oMyError.HelpContext _
;~             , 20)
	ConsoleWrite("ZBX_NOTSUPPORTED" & @CRLF)
EndFunc

; ##################################################################################################################################################################################################################################################
; ##################################################################################################################################################################################################################################################
;                                       ############################################################################################################################################################################################################
; ##     ##    ###    #### ##    ##     ############################################################################################################################################################################################################
; ###   ###   ## ##    ##  ###   ##     ############################################################################################################################################################################################################
; #### ####  ##   ##   ##  ####  ##     ############################################################################################################################################################################################################
; ## ### ## ##     ##  ##  ## ## ##     ############################################################################################################################################################################################################
; ##     ## #########  ##  ##  ####     ############################################################################################################################################################################################################
; ##     ## ##     ##  ##  ##   ###     ############################################################################################################################################################################################################
; ##     ## ##     ## #### ##    ##     ############################################################################################################################################################################################################
;                                       ############################################################################################################################################################################################################
; ##################################################################################################################################################################################################################################################
; ##################################################################################################################################################################################################################################################
$iStartTime = _DateDiff("s", "1970/01/01 00:00:00", _NowCalc())


If $CmdLine[0] = 0 Then
	ConsoleWrite($sHELP & @CRLF)
	Exit 0
EndIf

_Zabbix_conf()
_GetAllEventlogs()

If $CmdLine[1] = "discovereventlogs" Then
	$s_JSONOutput = '- znil.ZabbixEventlog[discovereventlogs] {"data":['
	For $i = 1 To $aEventlogs[0][0]
		$s_JSONOutput = $s_JSONOutput & '{'
		$s_JSONOutput = $s_JSONOutput & '"{#EVENTLOGNAME}":"' & $aEventlogs[$i][1] & '",'
		$s_JSONOutput = $s_JSONOutput & '"{#EVENTLOGDUMMY}":"' & "---" & '"'
		$s_JSONOutput = $s_JSONOutput & '},'
	Next
	$s_JSONOutput = StringTrimRight($s_JSONOutput, 1) & ']}'
	_SendFile_with_Zabbix_Sender(@ScriptDir & "\Zabbix_Eventlog-LLD-Eventlogs.txt")
	ConsoleWrite("0" & @CRLF)
	Exit 0
EndIf

If $CmdLine[1] = "statisticseventlogs" Then
	For $i = 1 To $aEventlogs[0][0]
		; $aEventlogs
		; [0][0] = Anzahl
		; [x][1] = Name des Eventlogs (LogfileName)
		; [x][2] = Maximale Größe (MaxFileSize)
		; [x][3] = Aktuelle Größe (FileSize)
		; [x][4] = Anzahl der Einträge (NumberOfRecords)
		; [x][5] = Status (Status)
		; [x][6] = Pfad zum DisplayNameFile
		; [x][7] = DisplayNameID
		; [x][8] = DisplayName
		_SendValue_with_Zabbix_Sender("znil.ZabbixEventlog.MaxFileSize[" 		& $aEventlogs[$i][1] & "]", $aEventlogs[$i][2])
		_SendValue_with_Zabbix_Sender("znil.ZabbixEventlog.FileSize[" 			& $aEventlogs[$i][1] & "]", $aEventlogs[$i][3])
		_SendValue_with_Zabbix_Sender("znil.ZabbixEventlog.NumberOfRecords[" 	& $aEventlogs[$i][1] & "]", $aEventlogs[$i][4])
		_SendValue_with_Zabbix_Sender("znil.ZabbixEventlog.Status[" 			& $aEventlogs[$i][1] & "]", $aEventlogs[$i][5])
	Next
	_SendRuntime()
	ConsoleWrite("0" & @CRLF)
	Exit 0
EndIf

$b_QueryEventlog = False

For $i = 1 To $aEventlogs[0][0]
	If $CmdLine[1] = $aEventlogs[$i][1] Then
		$b_QueryEventlog = True
	EndIf
Next

If $b_QueryEventlog = False Then
	ConsoleWrite("ZBX_NOTSUPPORTED" & @CRLF)
	Exit 0
EndIf

; Check if we have a period as 2. Parameter
If $CmdLine[0] > 1 Then
	$i_Period = Int($CmdLine[2])
	If $i_Period < 60 Then
		$i_Period = 60
	EndIf
EndIf

_ReadInFilterFile($sLokalFilterFile)
; Check if we have an additional Filter File as 3. Parameter
If $CmdLine[0] > 2 Then
	$sRemoteFilterFile = $CmdLine[3]
	_ReadInFilterFile($sRemoteFilterFile)
EndIf

; $aMessage[1][8]	; [0][0] = Anzahl
					; [x][1] = EventID
					; [x][2] = Time-String
					; [x][3] = Source
					; [x][4] = Insertion
					; [x][5] = Message
					; [x][6] = EventType (1 = Error, 2 = Warning, 3 = Information, 4 = Security Audit Success, 5 = Security Audit Failure)$aMessage[0][0] = 0

_GetEventsWMI($i_Period, "", $CmdLine[1])

;~ If $aMessage[0][0] > 0 Then
;~ 	For $i = 1 To $aMessage[0][0]
;~ 		If (Int($aMessage[$i][6]) = 1) Or (Int($aMessage[$i][6]) = 2) Then
;~ 			If Int($aMessage[$i][6]) = 1 Then
;~ 				$stemp      = "EventType : ERROR" & @CRLF
;~ 			Else
;~ 				$stemp      = "EventType : WARNING" & @CRLF
;~ 			EndIf
;~ 			$stemp = $stemp & "EventID   : " & $aMessage[$i][1] & @CRLF
;~ 			$stemp = $stemp & "Source    : " & $aMessage[$i][3] & @CRLF
;~ 			$stemp = $stemp & "UTC Time  : " & $aMessage[$i][2] & @CRLF
;~ 			$stemp = $stemp & "Insertion : " & $aMessage[$i][4] & @CRLF
;~ 			$stemp = $stemp & "Message   : " & $aMessage[$i][5] & @CRLF & @CRLF
;~ 			ConsoleWrite($stemp)
;~ 		EndIf
;~ 		;$stemp = StringReplace($stemp, @CRLF, "\n")
;~ 		_SendValue_with_Zabbix_Sender("znil.ZabbixEventlog.Message[" & $CmdLine[1] & "," & Int($aMessage[$i][6]) & "]", $stemp)
;~ 	Next
;~ EndIf

;~ ConsoleWrite("##############################################################################################################################################" & @CRLF)

If $aMessage[0][0] > 0 Then
	For $i = 1 To $aMessage[0][0]
		If (Int($aMessage[$i][6]) = 1) Or (Int($aMessage[$i][6]) = 2) Then
			$bFilterEntry = False
			; $aFilterList_EventID[0]
			For $j = 1 To $aFilterList_EventID[0]
				If $aMessage[$i][1] = $aFilterList_EventID[$j] Then
					$bFilterEntry = True
;~ 					ConsoleWrite("EventID: " & $aMessage[$i][1] & " = " & $aFilterList_EventID[$j] & @CRLF)
				EndIf
			Next
			; $aFilterList_Source[0] = 0
			For $j = 1 To $aFilterList_Source[0]
				If StringInStr($aMessage[$i][3], $aFilterList_Source[$j]) > 0 Then
					$bFilterEntry = True
;~ 					ConsoleWrite("Source: '" & $aFilterList_Source[$j] & "' is in '" & $aMessage[$i][3] & "'" & @CRLF)
				EndIf
			Next
			; $aFilterList_Message[0] = 0
			For $j = 1 To $aFilterList_Message[0]
				If StringInStr($aMessage[$i][5], $aFilterList_Message[$j]) > 0 Then
					$bFilterEntry = True
;~ 					ConsoleWrite("Message: '" & $aFilterList_Message[$j] & "' is in '" & $aMessage[$i][5] & "'" & @CRLF)
				EndIf
			Next
			; $aFilterList_Insertion[0] = 0
			For $j = 1 To $aFilterList_Insertion[0]
				If StringInStr($aMessage[$i][4], $aFilterList_Insertion[$j]) > 0 Then
					$bFilterEntry = True
;~ 					ConsoleWrite("Insertion: '" & $aFilterList_Insertion[$j] & "' is in '" & $aMessage[$i][4] & "'" & @CRLF)
				EndIf
			Next
			If $bFilterEntry = False Then
				$iEventCounter = $iEventCounter + 1
				If Int($aMessage[$i][6]) = 1 Then
					$stemp      = @CRLF & @CRLF & "EventType : ERROR" & @CRLF
					$iERROR_Counter = $iERROR_Counter + 1
					$bError_was_send = True
				Else
					$stemp      = @CRLF & @CRLF & "EventType : WARNING" & @CRLF
					$iWARNING_Counter = $iWARNING_Counter + 1
					$bWarning_was_send = True
				EndIf
				$stemp = $stemp & "EventID   : " & $aMessage[$i][1] & @CRLF
				$stemp = $stemp & "Source    : " & $aMessage[$i][3] & @CRLF
				$stemp = $stemp & "UTC Time  : " & $aMessage[$i][2] & @CRLF
				$stemp = $stemp & "Insertion : " & StringLeft(StringReplace($aMessage[$i][4], '"', "'"),128) & @CRLF
				$stemp = $stemp & "Message   : " & @CRLF
				$stemp = $stemp & "----------- " & @CRLF
				$stemp = $stemp & StringReplace(StringReplace(StringReplace($aMessage[$i][5], Chr(9), " "), ". ", "." & @CRLF), '"', "'") & @CRLF & @CRLF
				$stemp = $stemp & "---------------------------------------------------------------------------------------------------" & @CRLF
				$stemp = $stemp & "This is Entry No. " & $i & " of " & $aMessage[0][0] & " Total Entries in the last " & $i_Period & " Seconds" & @CRLF
				$stemp = $stemp & "Check the Logs for additional Entries!!!!" & @CRLF
				;ConsoleWrite($stemp)
				_SendValue_with_Zabbix_Sender("znil.ZabbixEventlog.Message[" & $CmdLine[1] & "," & Int($aMessage[$i][6]) & "]", $stemp)
			Else
				$iFiltered_Counter = $iFiltered_Counter + 1
			EndIf
		EndIf
	Next
EndIf
; print Value of Events witch where send
_SendValue_with_Zabbix_Sender("znil.ZabbixEventlog.WarningsLastPeriod[" & $CmdLine[1] & "]", $iWARNING_Counter)
_SendValue_with_Zabbix_Sender("znil.ZabbixEventlog.ErrorsLastPeriod[" & $CmdLine[1] & "]", $iERROR_Counter)
_SendValue_with_Zabbix_Sender("znil.ZabbixEventlog.FilteredLastPeriod[" & $CmdLine[1] & "]", $iFiltered_Counter)
If $bError_was_send = False Then
	_SendValue_with_Zabbix_Sender("znil.ZabbixEventlog.Message[" & $CmdLine[1] & ",1]", "-=ZABBIX-EVENTLOG=- No Events for " & $i_Period & " Seconds")
EndIf
If $bWarning_was_send = False Then
	_SendValue_with_Zabbix_Sender("znil.ZabbixEventlog.Message[" & $CmdLine[1] & ",2]", "-=ZABBIX-EVENTLOG=- No Events for " & $i_Period & " Seconds")
EndIf
_SendRuntime()
ConsoleWrite($iEventCounter & @CRLF)

; ##################################################################################################################################################################################################################################################
; ##################################################################################################################################################################################################################################################
;                                          #########################################################################################################################################################################################################
; ######## ##    ## ########  ########     #########################################################################################################################################################################################################
; ##       ###   ## ##     ## ##           #########################################################################################################################################################################################################
; ##       ####  ## ##     ## ##           #########################################################################################################################################################################################################
; ######   ## ## ## ##     ## ######       #########################################################################################################################################################################################################
; ##       ##  #### ##     ## ##           #########################################################################################################################################################################################################
; ##       ##   ### ##     ## ##           #########################################################################################################################################################################################################
; ######## ##    ## ########  ########     #########################################################################################################################################################################################################
;                                          #########################################################################################################################################################################################################
; ##################################################################################################################################################################################################################################################
; ##################################################################################################################################################################################################################################################

Exit 0




Kommentare

Loading comments...