Aktionen

Zabbix:Template Windows Updates

Aus znilwiki

Changelog:

  • 20.03.2014: Neue Version! Den Fehler mit "ZBX_NOTSUPPORTED" gibt es nicht mehr! Zudem wird die Abfrage nun mit niedriger Pozessorpriorität gestartetue
  • 11.08.2014: Fehlerbehebung: Auf 32 Bit Windows XP und Windows 2003 Systeme wurde ein fehlerhafter Eintrag in die geplanten Task vorgenommen. Dadurch wurde die Aufgabe nie ausgeführt.
  • 23.04.2015: Version 2 - Auf Systemen mit Windows XP oder Server 2003 gab es immer wieder Probleme mit der Prozessorlast. Der Check wird deshalb nicht mehr produktiv eingesetzt. Damit dies beim zuweisen von Templates nicht gesondert beachtet werden muss wird auf solchen Systemen die "ZBX_NOTSUPPORTED"-Meldung zurück gegeben.


Download: Zabbix-Windowsupdates.zip Version 1.0.0.35 noch mit Windows XP / Windows Server 2003 Unterstützung
Download: Zabbix-Windowsupdates-V2.zip Version 2.0.0.1 gibt auf Windows XP / 2003 immer ZBX_NOTSUPPORTED zurück


Im Zabbix-Wiki gibt es einen älteren Tipp wie man per VB-Script die Anzahl der verfügbaren Windows-Updates eines Host prüft.
Leider - oder wie immer - funktioniert das nicht so wie gewünscht bzw. lief bei mir gar nicht.
Also habe ich die Idee aufgegriffen und neu umgesetzt.

Important.png
Hinweis: Unter Windows Server 2003 kann die Abfrage dazu führen das der Prozess 'svchost.exe' eine hohe CPU-Last erzeugt - dauerhaft. Es liegt dann am Dienst für die automatischen Updates. Eigentlich sollte das Problem mit einem Patch von Microsoft behoben sein - klappt aber wohl nicht. Nutzt dieses Template also für Windows Server 2003 auf eigene Gefahr (Version 1.x.x.x).

Wie funktioniert es?
Die windowsupdate.exe wird vom Zabbix Agenten auf dem jeweiligen Server aufgerufen.
Die .exe fragt dann über die Betriebsystemfunktionen nach den Updates
Berücktsichtigt werden Updates die

  • noch nicht installiert sind
  • die nicht ausgeblendet wurden


Da diese Prüfung zumindest in meiner Umgebung zu lange dauert (kommt über das 30 Sekunden-Limit von Zabbix) schummelt das Programm:

  • Beim ersten Aufruf meldet es pauschal eine '0' zurück
    • Erzeugt einen geplanten Task/Aufgabenplanung in es sich selbst ca. 5 Minten später mit dem Parameter 'CHEAT' aufruft
    • und beendet sich gleich wieder
  • Die 'CHEAT' Version wird ca. 5 Minuten später gestartet und wartet auf das Ergebnis der Update-Prüfung und schreibt diese im gleichen Pfad in die zabbix-windowsupdates.txt
  • Danach wird der geplante Task wieder aus der Aufgabenplanung gelöscht
  • Beim nächsten Aufruf durch Zabbix findet das Programm die Textdatei,
    • gibt den Wert aus der Datei zurück
    • und plant wieder einen Task mit sich selbst und dem Parameter 'CHEAT'
  • so geht es bis in alle Zeit :-)


Das mit der Aufgabenplanung musste ich leider so machen - Ich habe es mit Unterprozessen etc. versucht - aber der Zabbix-Agent lässt sich davon nicht beirren und wartet bis alle diese beendet sind - und bricht diese ggf. nach 30 Sekunden auch ab.

Im Zip-Archiv findet Ihr neben der windowsupdate.exe das Template in Deutsch.
Die deutschen Versionen findet Ihr nach dem Import in der Hostgruppe 'Templates znil.net' mit den Namen

znil Template Windows Updates
znil Template Windows Updates ACTIVE AGENT

Also eine passive und eine Active Agent Version.


Download: Zabbix-Windowsupdates.zip



Zur Installation müsst Ihr folgendes tun:

  • Kopiert die windowsupdates.exe in das Verzeichnis in dem auch schon der Zabbix-Agent ist, z.B.
C:\Program Files\Zabbix
  • Tragt in die Agenten-Konfigurationsdatei, in der Regel ist das die zabbix_agentd.win.conf die Zeile
UserParameter=znil.windowsupdates,"C:Program Files\Zabbix\windowsupdates.exe"

ein - Pfad natürlich ggf. anpassen

  • Startet des Zabbix Agenten Dienst neu
net stop "zabbix agent"
net start "zabbix agent"
  • Import eine der .XML Dateien in Zabbix und verknüpft diese mit dem Host.
  • Warten! Alle 21.600 Sekunden = 6 Stunden wird die Abfrage gestartet. Die erste wird immer 0 bringen, danach kommt die korrekte Anzahl
  • Zum Testen könnt Ihr den Wert natürlich auch runterschrauben



Hier noch für Interessierte der Quellcode der windowsupdates.exe:

#NoTrayIcon
#Region    ;************ Includes ************
#Include <Constants.au3>
#EndRegion ;************ Includes ************
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Icon256-32.ico
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_Description=Zabbix Available Windows Updates
#AutoIt3Wrapper_Res_Fileversion=1.0.0.36
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_LegalCopyright=2013 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_Windows_Updates
#AutoIt3Wrapper_Res_Field=See You|znil.net
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
Opt('MustDeclareVars', 1)
; ##########################################################################################################################
; ##########################################################################################################################
; # windowsupdates.exe --> Tool for Check Count of Windowsupdates Zabbix                                                   #
; # 2013 Bernhard Linz    /    Bernhard@znil.de    /    http://znil.net                                                    #
; # Idea and Original at Zabbix Wiki                                                                                       #
; #                                                                                                                        #
; # Latest Version of this Program and Template in German:                                                                 #
; # http://znil.net/index.php?title=Zabbix:Template_Windows_Updates                                                        #
; #                                                                                                                        #
; #	         ________  .__   __.  __   __        .__   __.  _______ .___________.                                          #
; #	        |       /  |  \ |  | |  | |  |       |  \ |  | |   ____||           |                                          #
; #	        `---/  /   |   \|  | |  | |  |       |   \|  | |  |__   `---|  |----`                                          #
; #	           /  /    |  . `  | |  | |  |       |  . `  | |   __|      |  |                                               #
; #	          /  /----.|  |\   | |  | |  `----.__|  |\   | |  |____     |  |                                               #
; #	         /________||__| \__| |__| |_______(__)__| \__| |_______|    |__|                                               #
; #                                                                                                                        #
; ##########################################################################################################################
; ##########################################################################################################################

; Catch all Error while using the WMI-Interface with own Error-Function
Global $oMyError = ObjEvent("AutoIt.Error","MyErrFunc"), $f_COMError = False
; And the Error-Function itself
Func MyErrFunc()
    Local $HexNumber=hex($oMyError.number,8)
    ConsoleWriteError("We intercepted a COM Error !" & @CRLF & _
                "Number is: " & $HexNumber & @CRLF & _
                "WinDescription is: " & $oMyError.windescription & @CRLF & _
                "Source is: " & $oMyError.source & @CRLF & _
                "ScriptLine is: " & $oMyError.scriptline & @CRLF)
	Exit 1
Endfunc

; ##########################################################################################################################
; ##########################################################################################################################
; Other needed Variables
Dim $o_WMI
Dim $updatesearcher
Dim $Result
Dim $searchResult
Dim $sStartTime

; The Check for Windows Updates normaly takes too long (more than 30 Seconds), so we cheat:
; We use a memory file in TEMP folder with the result of last run
; If the file not exit (first run or after reboot) we send back 0 (zero) Updates
; and we start this .exe again with the parameter CHEAT - then it will run in background and write the result in memory-file

;Dim $zabbixmemoryfile = @TempDir & "\zabbix-windowsupdates.txt"
Dim $zabbixmemoryfile
Dim $zabbixfilehandle

If @UserName <> "SYSTEM" Then
	$zabbixmemoryfile = @ScriptDir & "\windowsupdates-helper.txt"
;~ 	FileWriteLine($zabbixmemoryfile, "Kein SySTEM" & @ScriptFullPath)
Else
	$zabbixmemoryfile = @ScriptDir & "\windowsupdates-helper.txt"
;~ 	FileWriteLine($zabbixmemoryfile, "SYSTEM! " & @ScriptFullPath)
EndIf


If StringInStr($CmdLineRaw, "CHEAT") = 0 Then
	If FileExists($zabbixmemoryfile) = 1 Then
		$Result = FileReadLine($zabbixmemoryfile)
		;Run(@ComSpec & ' /c start "Zabbix" /MIN /LOW ' & '"' & @ScriptFullPath & '" CHEAT', "", @SW_HIDE)
		;MsgBox(0,"",@ComSpec & ' /c start "Zabbix" /MIN /LOW ' & "%WINDIR%\system32\schtasks.exe /create /SC MINUTE /F /MO 5 /TN ZabbixWindowsUpdateCheck /TR " & '"' & "'" & @ScriptFullPath & "' CHEAT" & '"' & " /ST 00:00 /RU SYSTEM")
		Run(@ComSpec & ' /c start "Zabbix" /MIN /LOW ' & "%WINDIR%\system32\schtasks.exe /create /SC MINUTE /MO 15 /F /TN ZabbixWindowsUpdateCheck /TR " & '"\"' & @ScriptFullPath & '\" CHEAT"' & " /ST 00:00 /RU SYSTEM", "", @SW_HIDE)

		;ShellExecute('"' & @ScriptFullPath & '"', "CHEAT")
		Sleep(2000)
		ConsoleWrite($Result & @CRLF)
		Exit 0
	Else
		;Run(@ComSpec & ' /c start "Zabbix" /MIN /LOW ' & '"' & @ScriptFullPath & '" CHEAT', "", @SW_HIDE)
		Run(@ComSpec & ' /c start "Zabbix" /MIN /LOW ' & "%WINDIR%\system32\schtasks.exe /create /SC MINUTE /MO 15 /F /TN ZabbixWindowsUpdateCheck /TR " & '"\"' & @ScriptFullPath & '\" CHEAT"' & " /ST 00:00 /RU SYSTEM", "", @SW_HIDE)
		;ShellExecute('"' & @ScriptFullPath & '"', "CHEAT")
		Sleep(2000)
		ConsoleWrite("0" & @CRLF)
		Exit 0
	EndIf
EndIf

; ##########################################################################################################################
; ##########################################################################################################################
; ok, CHEAT mode!

; Get the WMI-Interface at local Computer (= .)
;FileWriteLine(@ScriptDir & "\windowsupdate.log", "Befinde mich im Cheat modus")
$o_WMI = ObjCreate("Microsoft.Update.Session", @ComputerName)

; Test whether it worked and go on
If IsObj($o_WMI) Then
	$updatesearcher = $o_WMI.CreateupdateSearcher
	$searchResult = $updateSearcher.Search("IsInstalled=0 and IsHidden=0 and Type='Software'")
	$Result = $searchResult.Updates.Count
	$zabbixfilehandle = FileOpen($zabbixmemoryfile, 2)
	FileWriteLine($zabbixfilehandle, $Result)
	FileClose($zabbixmemoryfile)
	Run(@ComSpec & ' /c start "Zabbix" /MIN /LOW ' & "%WINDIR%\system32\schtasks.exe /delete /F /TN ZabbixWindowsUpdateCheck", "", @SW_HIDE)
	;ConsoleWrite($searchResult.Updates.Count & @CRLF)
	;MsgBox(0,"","->" & $searchResult.Updates.Count & "<-")
	;Sleep (30000)
	Exit 0
EndIf
Exit 0



--Bernhard Linz 14:57, 22. Mär. 2014 (CET)


Loading comments...