Jump to content

Script zur Abfrage des Windows Update Status auf Servern


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo Board,

 

ich stand vor dem Problem, mir eine Übersicht zu verschaffen, welcher Server gerade welchen Updatestatus hat.

Es ist so, dass nach dem Freigeben der Updates man in einer großen Farm und mit mehreren Admins die Übersicht verliert, auf welchem Server noch Interaktionen zu tätigen sind (Updates installieren, Neustarten, Nacharbeiten, oder eben nix).

 

Es ist bei uns so, dass Updates mit einem Monat Verzögerung ausgerollt werden und auf den Servern manuell installiert werden müssen. Daher kann mir die WSUS Konsole keine genauen Daten liefern.

 

Ich habe mir also ein Script geschrieben, welches die \windowsupdate.log auf den Servern parst und mir dann alles detailliert ausgibt oder eine eMail versendet.

 

Zudem wurden den Computerobjekten noch Besitzer (die jeweiligen Admins) zugewiesen, damit jeder über seine Server informiert ist. Es geht aber auch ohne!

 

Benötigt werden die ActiveRoles von Quest (PowerShell Commands (CMDLETs) for Active Directory by Quest Software)

 

Die Ausgabe sieht wie folgt aus:

Folgende Server sind noch nicht geupdated bzw neugestartet:

Admin A
 ServerA01 11 neue(s) Update(s) anstehend
 ServerA02 10 neue(s) Update(s) anstehend
 ServerA03 13 neue(s) Update(s) anstehend
 ServerA04 muss neugestartet werden
Admin B
 ServerB01 11 neue(s) Update(s) anstehend
 ServerB02 10 neue(s) Update(s) anstehend
 ServerB03 13 neue(s) Update(s) anstehend
 ServerB04 muss neugestartet werden

 

Wir haben es noch mit einem geplanten Task verknüpft und bekommen so eine aktuelle Übersicht des Updatestatus per eMail.

 

Vielleicht kann es ja jemand gebrauchen. Gegen ein bisschen Feedback hätte ich nix einzuwenden ;)

Link zu diesem Kommentar

Das Script:

# Region Description
#
# Name:		checkServerUpdateState
# Author:	Markus Frank
# Version:	0.2 { $_ -Like '*Reboot Pending*' -or $_ -Like '*RebootRequired=1*' } hinzugefügt, um DC´s abzufragen
#		0.1 initiale Version
# Description:	prüft auf allen Servern den Stand der Windows Updates
# 
# EndRegion

Add-PSSnapin *Quest*

Clear

$sendmail 	= $true
$BodyHeader = "Folgende Server sind noch nicht geupdated bzw neugestartet:`r`r"
$Body 		= ""
$allServer 	= 0

# definieren der Server
$Server = Get-QADComputer -SearchRoot 'OU=Domain Controllers,DC=domain,DC=local' -Name "DE-DC*"
$Server = $Server + (Get-QADComputer -SearchRoot 'OU=DE,OU=Luetze Group,DC=domain,DC=local' -OSName "*Windows Server*")

# start der Abfrage
$Server | Sort-Object Name | Group-Object managedby | ForEach-Object {
if ($_.Name) {
	$Name  = (Get-QADObject $_.Name).displayname
	$email = (Get-QADObject $_.Name).email
} else {
	$Name = "ohne Zuordnung"
}
$BodyOwner = "$Name`r"
$ServerCount = 0
$_.Group | ForEach-Object {
	#prüfen ob Host erreichbar ist
	if (Test-Connection -ComputerName $_.Name -Quiet -Count 1) {
		# Anzahl Updates ermitteln
		$strcomputer = $_.Name
		$WSUSLog_Reboot_Time = ""
		$WSUSLog_Reboot_Time = ""

		# letzte Zeile Pending Reboot auslesen				
		$path1 = "\\$strComputer\c$\windows\windowsupdate.log"
		$WSUSLog_Reboot = Get-Content $Path1 -Encoding UTF8 | Where-Object { $_ -Like '*Reboot Pending*' -or $_ -Like '*RebootRequired=1*' } | Select -Last 1
		$WSUSLog_Reboot = $WSUSLog_Reboot.Split("`t")
		$WSUSLog_Reboot_Time = $WSUSLog_Reboot[0]+" "+$WSUSLog_Reboot[1].Substring(0,8)
		$WSUSLog_Reboot_Time = Get-Date $WSUSLog_Reboot_Time

		# letzte Zeile Updates detected auslesen
		$WSUSLog_Updates = Get-Content $Path1 -Encoding UTF8 | Where-Object { $_ -Like '*updates detected*' } | Select -Last 1
		$WSUSLog_Updates = $WSUSLog_Updates.Split("`t")
		$WSUSLog_Updates_Time = $WSUSLog_Updates[0]+" "+$WSUSLog_Updates[1].Substring(0,8)
		$WSUSLog_Updates_Time = Get-Date $WSUSLog_Updates_Time

		# Datum vergleichen
		if ($WSUSLog_Reboot_Time -ge $WSUSLog_Updates_Time) {
			$BodyOwner = $BodyOwner + " " + $_.Name + "`t" + $_.description + " | muss neugestartet werden`r"
			$ServerCount++
			$allServer++
		} else {
			$WSUSLog_Updates = $WSUSLog_Updates[5].Split(" ")
			# wenn mehr als 0 Updates anstehen, ausgeben
			if ($WSUSLog_Updates[3] -gt 0) {
				$BodyOwner = $BodyOwner + " " + $_.Name + "`t" + $_.description + " | " + $WSUSLog_Updates[3] + " neue(s) Update(s) anstehend`r"
				$ServerCount++
				$allServer++
			}
		}
	}
}
# Zusammenfassung senden, für einzelne User
if (($sendmail) -and ($ServerCount -gt 0)) {
	Send-MailMessage 	-From "WSUS Computer Status<wsusstatus@domain.local>" -To "email@domain.local" `
						-Subject "aktueller Stand Windows Updates Server $Name" `
						-Body "$BodyHeader$BodyOwner" -SmtpServer "smtp.domain.local"
}						
if ($ServerCount -gt 0) {
	$Body = $Body + $BodyOwner + "`r"
}
}
# Zusammenfassung senden für alle User und Server
if (($sendmail) -and ($allServer -gt 0)) {
Send-MailMessage 	-From "WSUS Computer Status<wsusstatus@domain.local>" -To "email@domain.local" `
					-Subject "aktueller ServerStatus Windows Updates" `
					-Body "$BodyHeader$Body" -SmtpServer "smtp.domain.local"
} else {
Write-Host $BodyHeader$Body
}


Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...