WSUS mit PowerShell verwalten: Computer, Updates, Genehmigungen
Das bevorzugte Management-Tool für die Windows Server Update Services (WSUS) ist die grafische Konsole. Seit Windows Server 2012 lassen sich die Update-Dienste aber auch weitgehend über PowerShell verwalten. Besonders flexibel ist diese bei der Filterung von Updates, um deren Status zu ändern.
Grundsätzlich lassen sich auch mit dem MMC-Tool differenzierte Abfragen auf die vorhandenen Updates erstellen, indem man dafür eigene Update-Ansichten erzeugt und zusätzliche Spalten einblendet, nach denen man die Daten sortiert.
Verfügbare Cmdlets und Methoden
PowerShell bietet jedoch zusätzliche Optionen und steht der GUI auch in puncto Reporting nicht wesentlich nach. Die Berichte, für die man in der WSUS-Konsole den Report Viewer nachinstallieren muss, bestehen überwiegend aus schmucklosen Tabellen, die man in PowerShell mit Out-GridView ebenfalls bekommen kann.
Um im ersten Schritt einen Überblick über die verfügbaren Cmdlets zu erhalten, gibt man folgenden Befehl ein:
Get-Command -Module UpdateServices
Egal, ob man damit die verfügbaren Updates, die zugeordneten Computer oder die Genehmigungen remote bearbeiten möchte, zuerst muss man immer eine Verbindung zu einem WSUS-Server aufbauen. Diesem Zweck dient das Cmdlet Get-WsusServer:
$WSUS = Get-WsusServer -Name ws2016-wsus -PortNumber 8530
In diesem Fall würde man eine Verbindung mit WS2016-WSUS herstellen, und zwar über Port 8530 (die Angabe des Ports ist erforderlich). Das zurückgegebene Objekt vom Typ UpdateServer wird in der Variable $WSUS gespeichert. Wie man mit
$WSUS | Get-Member -MemberType Method
leicht feststellen kann, bietet dieses noch eine Vielzahl weiterer Methoden, die noch über die Möglichkeiten der Cmdlets hinausgehen.
Informationen zu WSUS-Server ausgeben
Einige der Cmdlets und Methoden helfen dabei, die Konfiguration von WSUS zu untersuchen. Die allgemeine Konfiguration des WSUS-Severs zeigt
$WSUS.GetConfiguration()
Jene zur Datenbank mit bekommt man mittels
$WSUS.GetDatabaseConfiguration()
Interessiert man sich für den konfigurierten Synchronisierungszeitplan, dann erteilt
$WSUS.GetSubscription()
diese Auskunft. Weitere Methoden, die in diesem Zusammenhang interessant sein könnten, sind:
- GetDownstreamServers()
- GetContentDownloadProgress()
- GetStatus()
Reports für Computer
Das Cmdlet Get-WsusComputer gibt die einem WSUS-Server zugeordneten Computer aus. Dabei helfen Parameter wie NameIncludes, ComputerTargetGroups oder ToLastSyncTime, die Liste zu filtern.
Eine regelmäßige Aufgabe bei der WSUS-Administration besteht darin, inaktive Computer zu finden, die den WSUS-Server schon länger nicht mehr kontaktiert haben. Diese sind werden mit der Zeit zu Risikokandidaten, wenn sie wichtige Updates nicht erhalten.
Get-WsusComputer -UpdateServer $WSUS -ToLastSyncTime "12.03.2018"
Dieses Kommando würde alle Computer anzeigen, die ihre Updates seit dem 12. März 2018 nicht mehr mit dem WSUS-Server synchronisiert haben.
Will man einfach nur wissen, wie viele Computer seit einem bestimmten Datum inaktiv waren, dann erhält man diese Information so:
$WSUS.GetComputersNotContactedSinceCount("03.20.2018")
Über das Datum im Format mm.dd.yyyy bestimmt man den Zeitraum, seit dem sich Computer nicht mehr bei WSUS gemeldet haben.
Folgendes Beispiel gibt aus, wann die Computer der Gruppe "IT" das letzte Mal mit dem WSUS-Server synchronisiert wurden und welches Ergebnis die Operation hatte:
Get-WsusComputer -UpdateServer $WSUS |
? RequestedTargetGroupName -eq "IT" |
select FullDomainName, LastSyncResult, LastSyncTime
Gruppen anzeigen und Computer einsortieren
Will man die Liste aller vorhandenen Gruppen anzeigen, denen man die Computer zuordnen kann, dann kommt man so ans Ziel:
$WSUS.GetComputerTargetGroups() | select Name, Id
Möchte man dann alle Computer, deren Namen "Win10" enthält, in die Gruppe "Dev" verschieben, dann ließe sich das folgendermaßen erreichen:
Get-WsusComputer -UpdateServer $WSUS -NameIncludes "Win10" |
Add-WsusComputer -TargetGroupName "Dev"
Updates analysieren
Die häufigste Tätigkeit des WSUS-Admins besteht wohl darin, die verfügbaren Updates zu prüfen, sie freizugeben oder sie abzulehnen, um sie dann aus der Datenbank zu entfernen. Für die meisten Anforderungen dürfte das Cmdlet Get-WsusUpdate reichen.
Die Parameter UpdateId, RevisionNumber, Classification, Approval und Status erlauben eine Eingrenzung der zumeist zahlreichen Updates, wo die letzten drei am wichtigsten sind:
Get-WsusUpdate -UpdateServer $WSUS -Approval Unapproved -Status Needed -Classification Security
Dieser Befehl würde alle Updates anzeigen, die noch nicht genehmigt, aber von Computern angefordert wurden, und als Sicherheits-Updates klassifiziert sind. Eine weitere Eingrenzung ist nur möglich, wenn man bestimmte Attribute wie Products über ein Where-Object (Alias '?') filtert:
Get-WsusUpdate -UpdateServer $WSUS -Approval Unapproved -Status Needed |
? Products -like "Windows 10"
Über dieses Kommando würde man die nicht genehmigten, aber von Computern angeforderten Updates für Windows 10 bekommen.
Weitere Eigenschaften eines WsusUpdate-Objects, die man für Filter heranziehen kann, erhält man wieder über Get-Member:
Get-WsusUpdate -UpdateServer $WSUS -UpdateId <UpdateId> |
Get-Member -MemberType Property
Updates genehmigen oder ablehnen
Bei den Updates im letzten Beispiel handelt es sich um Kandidaten, für die eine Freigabe fällig ist. Dazu leitet man den Output des Befehls an Approve-WsusUpdate weiter:
Get-WsusUpdate -UpdateServer $WSUS -Approval Unapproved -Status Needed |
Approve-WsusUpdate
Umgekehrt könnte man auf analoge Weise auch Updates abweisen, wenn sie bestimmten Kriterien entsprechen:
Get-WsusUpdate -UpdateServer $WSUS -Approval AnyExceptDeclined `
-Status InstalledOrNotApplicable |
? UpdatesSupersedingThisUpdate -ne "Keine" |
Deny-WsusUpdate
Dieser Befehl würde alle Updates ablehnen, die noch nicht abgelehnt sind und den Status Installiert oder Nicht zutreffend haben. Als zusätzlicher Filter kommt hinzu, dass die Updates durch andere Updates ersetzt worden sein müssen (UpdatesSupersedingThisUpdate).
Mit der Methode GetUpdates() lässt sich das gleiche Anliegen kompakter formulieren:
$WSUS.GetUpdates() |
? {$_.State -eq "NotNeeded" -and $_.IsSuperseded -eq $true -and $_.IsDeclined -eq $false} |
% {$_.decline()}
Automatische Genehmigungen konfigurieren
Die Regeln für das automatische Genehmigen von Updates lassen sich über PowerShell erstellen, ändern und löschen. Möchte man zum Beispiel alle aktiven Regeln deaktivieren, dann ginge das so:
$r = $wsus.GetInstallApprovalRules() | ? Enabled -eq $true
$r.Enabled = $false
$r.Save()
Möchte man nicht aktivierte Regeln entfernen, dann ließe sich das mit Hilfe von DeleteInstallApprovalRule() erledigen. Für neue automatische Genehmigungen wäre CreateInstallApprovalRule() zuständig.
Letztere legt eine Regel nur an, die jeweiligen Eigenschaften müsste man dann explizit mit Methoden wie SetCategories(), SetComputerTargetGroups() oder SetUpdateClassifications() konfigurieren und dann wieder mittels save() speichern.
Täglich Know-how für IT-Pros mit unserem Newsletter
Ähnliche Beiträge
- Updates in WSUS importieren mit Internet Explorer oder PowerShell
- WSUS-Speicherplatz zurückgewinnen: Alte und ersetzte Updates löschen
- Windows-Updates mit PowerShell abfragen, herunterladen und installieren
- Dateien für Updates in WSUS auflisten mit PowerShell
- PowerShell-Modul für Exchange Online (EXO v2) unterstützt nun macOS und Linux
Keine Kommentare