WSUS

WSUS-Updates remote genehmigen

2. Februar 2021 · Anwendungen · andreas · Kein Kommentar

Soll das Skript, welches die WSUS-Updates genehmigt (oder ablehnt) nicht auf dem WSUS-Server selbst sondern auf einem anderen Server ausgeführt werden, scheitert dies zunächst mit der Fehlermeldung

Der Typ [Microsoft.UpdateServices.Administration.AdminProxy] wurde nicht gefunden.

Grund ist das Fehlen der benötigten Powershell-Cmdlets, welche zur Ausführung installiert werden müssen. Eine Suche im Internet führt meist in die falsche Richtung, nämlich zu Installationsanleitungen für die WSUS 3.0 SP2 Administration Console, welche aber für den unter Server 2019 verwendeten WSUS schon ein paar Tage zu alt ist.

Die benötigten Module lassen sich über den “Assistent zum Hinzufügen von Rollen und Features” installieren, hier ist unter “Features” der Punkt “Remoteserver-Verwaltungstools” / “Rollenverwaltungstools” / “Windows Server Upgrade Service-Tools” / “API- und PowerShell-Cmdlets” zu wählen.

Als letztes muß in dem Skript nur noch eine Zeile zum Zugriff auf den Remote-Server angepasst werden:

$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer($serverName, $useSecureConnection, $portNumber)

Der Aufruf der Funktion “getUpdateServer” wird um die drei selbsterklärenden Parameter “$serverName”, “$useSecureConnection” sowie “$portNumber” erweitert.


Vorschau-Updates auf dem WSUS automatisch ablehnen

5. September 2017 · Anwendungen · andreas · 1 Kommentar

Leider hat Microsoft in der GUI des WSUS keine Möglichkeit vorgesehen, die monatlichen Vorschau-Updates beim Einsatz automatischer Genehmigungen über einen Filter ausschließen zu können.

Gelöst werden kann diese Problem mittels der Powershell bzw. eines Powershell-Skripts, das auch als Powershell-Laie mit einem guten Tutorial sowie Google in endlicher Zeit zusammengesucht- und kopiert werden kann.

Als erstes müssen die für WSUS notwendigen Assemblies geladen werden

[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | Out-Null

Dann wird die Verbindung zum WSUS-Server hergestellt

$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer()

Sofern die Freigabe der Updates nicht für alle Computer, sondern nur für bestimmte Gruppen vorgenommen werden soll, kann die entsprechende Gruppe zur späteren Verwendung festgelegt und zur Kontrolle ausgegeben werden

$group = $wsus.GetComputerTargetGroups() | where {$_.Name -eq 'Update mit WSUS'}
Write-Host ($group | Format-Table | Out-String)

Für die Freigabe bzw. das Ablehnen interessieren nur solche Updates, die zum einen noch nicht genehmigt (oder abgelehnt) wurden und auch erforderlich sind:

$updateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
$updateScope.ApprovedStates = [Microsoft.UpdateServices.Administration.ApprovedStates]::NotApproved
$updateScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::NotInstalled

Zu Informationszwecken kann die Menge an zu bearbeitenden Updates ausgegeben werden

$totalUpdateCount = $wsus.GetUpdateCount($updateScope)
Write-Host "Updates to process:", $totalUpdateCount

Dann werden die Updates in einer Schleife abgearbeitet

$wsus.GetUpdates($updateScope) | ForEach {

  Write-Host $_.Title, "- " -NoNewline

Sofern im Titel kein “Preview of” vorkommt, soll das Update genehmigt werden. Die Titel werden in englischer Sprache verarbeitet, so daß nach “2017-05 Preview of Monthly Quality Rollup for Windows 7 for x86-based Systems (KB4019265)” statt “2017-05 Vorschau des monatlichen Qualitätsrollups für Windows 7 für x86-basierte Systeme” gesucht werden muss:

  if (-not ($_.Title -like "*Preview of*")) {

Falls zur Installation eine Lizenzvereinbarung angenommen werden muss, kann dies ebenfalls über das Powershell-Skript erfolgen

    if ($_.RequiresLicenseAgreementAcceptance) {
      $_.AcceptLicenseAgreement()
    }

Anschließend wird das Update zur Installation in der oben festgelegten Gruppe genehmigt:

    $_.Approve("Install", $group)
    Write-Host "approved" -ForegroundColor green
  }

Sofern es sich um ein Vorschau-Update handelt, wird das Update stattdessen abgelehnt

  else {
    $_.Decline()
    Write-Host "declined" -ForegroundColor red
  }
}

Am Ende des Skripts erfogt dann noch die Ausgabe, daß das Skript tatsächlich am Ende angekommen ist

Write-Host "done."