In diesem Fall möchten wir eine Liste der Updates, die auf den einzelnen Computern verfügbar sind anzeigen, sowie welche Version derzeit auf den Systemen läuft um uns einen schnellen Überblick über die Updatelage zu verschaffen.
In diesem Skript gibt es noch die Besonderheit, dass ich gerne zu den leider wenig aussagekräftigen Rechnernamen die Benutzernamen anzeigen möchte.
Diese sind wiederum im AD bei den Computern im Feld Beschreibung hinterlegt.
Außerdem lassen wir uns anzeigen, wann die Rechner das letzte mal ihren Status übertragen haben und auf welchem Build und Revision sie derzeit laufen.
Code: Alles auswählen
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | Out-Null
$Global:WSUS = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer('WSUSServer',$false,'8530')
$WsusClients = $Members | %{$Global:Wsus.GetComputerTargets()}
#Updatescope definieren (Welche Updates geprüft werden sollen pro Client)
$UpdateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
#Nicht freigegebene sowie bereits installierte oder unbekannte Updates werden ausgenommen. - Somit werden die zu installierenden Updates erfasst.
$UpdateScope.ExcludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::Installed, [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::NotApplicable, [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::Unknown
$Global:WsusInformationArr = New-Object system.Collections.ArrayList
#Die Schleife prüft die verfügbaren Updates für jeden Client, diese werden Addiert und als Summe ausgegeben
Foreach ($WsusClient in $WsusClients) {
$WsusObj = New-Object PsObject
$WsusObj | Add-Member -MemberType NoteProperty "Computer" -Value $WsusClient.FullDomainName.Substring(0,$WsusClient.FullDomainName.IndexOf("."))
$WsusObj | Add-Member -MemberType NoteProperty "Beschreibung" -Value (Get-ADComputer $WsusClient.FullDomainName.Substring(0,$WsusClient.FullDomainName.IndexOf(".")) -Properties Description | select Description).Description
$WsusObj | Add-Member -MemberType NoteProperty "System" -Value $WsusClient.OSDescription
$WsusObj | Add-Member -MemberType NoteProperty "Build" -Value $WsusClient.ClientVersion.Build
$WsusObj | Add-Member -MemberType NoteProperty "Revision" -Value $WsusClient.ClientVersion.Revision
$WsusObj | Add-Member -MemberType NoteProperty "Status vom" -Value $WsusClient.LastReportedStatusTime
$WsusObj | Add-Member -MemberType NoteProperty "Updates" -Value ($WsusClient.GetUpdateInstallationInfoPerUpdate($UpdateScope) | ? {$_.UpdateApprovalAction -ne "NotApproved"}).count
If($WsusObj.Updates -eq $null){$WsusObj.Updates = "0"}
$Global:WsusInformationArr.add($WsusObj) | out-null
}
$Global:WsusInformationArr | ogv # <- Ausgabe im Grid
#$Global:WsusInformationArr | Format-Table | Out-Printer # <- Ausgabe auf Standarddrucker
#$Global:WsusInformationArr | Export-Csv WsusUpdateliste.csv # <- Ausgabe als CSV-Datei - Kann mit Excel geöffnet und bearbeitet werdenZunächst greifen wir auf unseren WSUSServer per Standardport 8530 zu (Name muss entsprechend an Eure Umgebung angepasst werden).
Dann erstellen wir uns eine Liste der Rechner die uns interessieren (im Beispiel alle Verfügbaren mit "GetComputerTargets()").
Nun erzeugen wir ein Scope mit allen für uns interessanten Updates (im Beispiel die noch nicht installierten aber schon freigegebenen Updates).
In der Schleife sammeln wir nun die Informationen, die wir anschließend aus dem Array in welches sie geschrieben werden, auswerten möchten.
Im Beispiel ist das der Computername, der Username (der wie oben erklärt in der Computerbeschreibung des AD zu finden ist), das System sowie die Build und Revisionsnummer (in eigenen Feldern, damit im Datagrid sortiert werden kann), der Zeit-Stempel des letzten Reports und die Anzahl der verfügbaren Updates.
Am Ende noch die Möglichkeit die Anzeige auf dem Monitor (im Zum Wörterbuch hinzufügen), auf dem Drucker oder als CSV-Datei zu realisieren. Einfach die nicht gewünschten Optionen aus-kommentieren.