Mit folgendem PowerShell-Skript lassen sich einige Statistiken von einem WSUS-Server (Version 3) abrufen.
Damit das Skript funktioniert, muss man es mit der Dateiendung
.ps1 speichern, z.B. als
wsus.ps1. Ausserdem muss das Ausführen von Skripts erst erlaubt werden, siehe dazu folgenden Artikel:
(Du musst Dich Einloggen oder Registrieren um Multimediadateien oder Links zu sehen).Oder auch:
(Du musst Dich Einloggen oder Registrieren um Multimediadateien oder Links zu sehen).Ist das Skript also erlaubt und als wsus.ps1 gespeichert, ruft man es folgendermassen auf:
(Natürlich muss man dafür die PowerShell installieren... das versteht sich wohl von selbst
)
C:\batch\wsus>powershell .\wsus.ps1
Hier der Inhalt des Skripts: (es hängt ausserdem 3 Postings weiter unten als Anhang dran)
# Variables - set these to fit your needs
###############################################################################
# The server name of your WSUS server
$serverName = 'localhost'
# use SSL connection?
$useSecureConnection = $False
# the port number of your WSUS IIS website
$portNumber = 80
# warn if a computer has not contacted the server for ... days
$daysBeforeWarn = 14
# Script - don't change anything below this line!
###############################################################################
# load WSUS framework
[void][reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
# connect to specified WSUS server
# see here for information of the IUpdateServer class
# -> http://msdn.microsoft.com/en-us/library/microsoft.updateservices.administration.iupdateserver(VS.85).aspx
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer($serverName, $useSecureConnection, $portNumber)
# get general status information
# see here for more infos about the properties of GetStatus()
# -> http://msdn.microsoft.com/en-us/library/microsoft.updateservices.administration.updateserverstatus_properties(VS.85).aspx
$status = $wsus.GetStatus()
$totalComputers = $status.ComputerTargetCount
$computersUpToDate = $status.ComputersUpToDateCount
$computersNeedingUpdates = $status.ComputerTargetsNeedingUpdatesCount
$computersWithErrors = $status.ComputerTargetsWithUpdateErrorsCount
$totalUpdates = $status.UpdateCount
$updatesUpToDate = $status.UpdatesUpToDateCount
$updatesNeeded = $status.UpdatesNeededByComputersCount
$updatesWithErrors = $status.UpdatesWithClientErrorsCount
# needed, but not approved updates
$updateScope = new-object Microsoft.UpdateServices.Administration.UpdateScope
$updateScope.ApprovedStates = [Microsoft.UpdateServices.Administration.ApprovedStates]::NotApproved
$updateServerStatus = $wsus.GetUpdateStatus($updateScope, $False)
$updatesNeededByComputersNotApproved = $updateServerStatus.UpdatesNeededByComputersCount
# computers that did not contact the server in $daysBeforeWarn days
$timeSpan = new-object TimeSpan($daysBeforeWarn, 0, 0, 0)
$computersNotContacted = $wsus.GetComputersNotContactedSinceCount([DateTime]::UtcNow.Subtract($timeSpan))
# computers in the "not assigned" group
$computerTargetScope = new-object Microsoft.UpdateServices.Administration.ComputerTargetScope
$computersNotAssigned = $wsus.GetComputerTargetGroup([Microsoft.UpdateServices.Administration.ComputerTargetGroupId]::UnassignedComputers).GetComputerTargets().Count
# output
"WSUS statistics"
"--------------------------------------------------"
"Total Computers: $totalComputers"
"Computers up to date: $computersUpToDate"
"Computers needing updates: $computersNeedingUpdates"
"Computers with errors: $computersWithErrors"
"--------------------------------------------------"
"Total Updates: $totalUpdates"
"Updates up to date: $updatesUpToDate"
"Updates needed by computers: $updatesNeeded"
"Updates with errors: $updatesWithErrors"
"--------------------------------------------------"
"Updates that need to be approved: $updatesNeededByComputersNotApproved"
"Computers not contacted in $daysBeforeWarn days: $computersNotContacted"
"Unassigned computers: $computersNotAssigned"
Es ruft nun einige allgemeine Statistiken des WSUS-Servers ab und zeigt sie an, z.B. die Anzahl der Computer, Updates, usw.
Interessant sind hierbei hauptsächlich die Anzahl der Computer, die noch Updates benötigen, bzw. die Anzahl der Updates, die von Computern noch benötigt werden.
Zuletzt zeigt das Skript noch einige Dinge an, die ich interessant und wichtig fand (weil man hier direkt eingreifen sollte):
- Anzahl der Updates, die von mindestens einem Computer benötigt werden, aber die nicht genehmigt sind
- Anzahl der Computer, die den WSUS-Server innerhalb eines bestimmbaren Zeitraums nicht kontaktiert haben
- Anzahl der Computer, die keiner Gruppe zugewiesen sind
Die Ausgabe des Skripts:
C:\batch\wsus>powershell .\wsus.ps1
WSUS statistics
--------------------------------------------------
Total Computers: 47
Computers up to date: 36
Computers needing updates: 5
Computers with errors: 0
--------------------------------------------------
Total Updates: 2258
Updates up to date: 1244
Updates needed by computers: 9
Updates with errors: 0
--------------------------------------------------
Updates that need to be approved: 0
Computers not contacted in 14 days: 1
Unassigned computers: 0
Das Skript lässt sich noch um einiges erweitern, um Anregungen und Tipps wird gebeten.
Ihr findet Links zu der ausführlichen Dokumentation der WSUS-Klassen und API im Skript.
Was kann man nun damit anstellen? Ich habe das Skript in unsere Überwachung eingebunden, wozu wir Nagios nutzen:
(Du musst Dich Einloggen oder Registrieren um Multimediadateien oder Links zu sehen).Nagios warnt mich nun (z.B. per Mail), wenn noch Updates freigegeben werden müssen oder Fehler in einem Update auftreten.
Über die Nagios-Erweiterung PNP4Nagios, welche den Verlauf der Nagios-Prüfungen auswertet und grafisch darstellt, bekomme ich ausserdem ein Diagramm, das die Anzahl der nicht aktuellen Computer darstellt (s. Anhang).
Sicher sind noch andere Verwendungen denkbar, z.B. ein täglicher Report per Mail, oder Ähnliches. Würde mich freuen, falls jemand etwas hiermit anfangen kann, dass er sich dann kurz hier verewigt.