Druckerprobleme März 2021: PowerShell-Script zur Update-Bereinigung

Windows Update[English]Blog-Leser Andy hat ein PowerShell-Script geschrieben, um die problematischen Updates vom März 2021, die die hier im Blog berichteten Druckprobleme verursachen, in Windows 10 deinstallieren. Ich stelle das Script hier im Blog ein – vielleicht ist es für jemanden von Interesse.


Anzeige

Zum Hintergrund

Mit den Windows-Sicherheitsupdates vom 9. März 2021 wurden einerseits zahlreiche Schwachstellen im Betriebssystem geschlossen. Benutzer berichteten aber kurz nach Installation der Sicherheitsupdates von erheblichen Druckproblemen.

Was folgte, war eine Update-Orgie, die so manches verschlimmbesserte. Vor allem war die Installation der Korrekturupdates immer mit dem Risiko verbunden, dass irgend etwas schief lief. Als Reaktion auf meinen Blog-Beitrag Windows 7/8.1/Server: Korrektur-Updates für Druckprobleme (März 2021) hat Andy in diesem Kommentar angeboten, sein PowerShell-Script zur Bereinigung des Systems von den problematischen Updates allgemein bereitzustellen.

PowerShell-Script zur Update-Bereinigung

Ich stelle das komplette PowerShell-Script nachfolgend ein. Es hat das Ziel, alle problematischen Updates von einer Windows 10-Maschine zu entfernen. Beachtet aber, dass die Verwendung des Scripts auf eigene Gefahr erfolgt – ich kann auch keinen Support gewähren. Schaut euch das Script vor dem ersten Einsatz an und modifiziert es bei Bedarf.

;@echo off & setlocal & set localfname=%~f0
;Findstr -rbv ; %0 | powershell -c -
;goto:BatchExit

# entfernt die Windows Updates aus 03/2021 welche Druckerprobleme 
#   verursachen, Stand 23.03.2021 'gegen Mittag', siehe auch 
#   *ttps://www.borncity.com/blog/2021/03/22/windows-10-mrz-2021-update-erneut-freigegeben/

#
# dieses Batch + Powershell Skript entfernt diverse Updates anhand der 
#   Bezeichnung / KB Nummern und blendet diese dauerhaft aus, 
#   das Skript benoetigt lokale Administratorrechte, es fragt diese an
#
# wenn das Skript einmal durchgelaufen ist und dabei zu entfernende 
#   Updates gefunden wurden, dann unbedingt den Computer neu starten und 
#   direkt nach dem Neustart das Skript noch einmal laufen lassen, erst 
#   dabei werden tlw. die letzten auszublendenen Updates wirklich 
#   verschwinden
#
# wenn auch nach mehrmaligem Aufruf immer wieder (die gleichen) Updates 
#   deinstalliert werden dann manuell eingreifen, den Windows Update 
#   Cache lokal loeschen (Skript 02WindowsUpdatesLöschen.cmd), die 
#    Updates manuell deinstallieren und (wenn ueberhaupt moeglich) 
#    manuell ausblenden (mit wushowhide.diagcab)
#
# diverse Teile des Skriptes sind nur verschlimmbessert und wurden 
#   schamlos kopiert von:
#   *ttps://www.powershellmagazine.com/2014/03/19/how-to-view-and-restore-hidden-windows-updates-with-powershell/


# die problematischen Updates / KB Nummern (_ohne_ die Bezeichnung 'KB') die entfernt und ausgeblendet werden sollen
$HotFixesToRemove=@("5000802", "5000808", "5000822", "5000809", "5000812", "5000803", "5000807", "5001567", "5001566", "5001568", "5001565")

Function Main {
    [Cmdletbinding()]
    Param()
    Process {
        # teste ob das Skript als Administrator ausgefuehrt wurde, wenn nicht dann versuche Neustart mit erhoehten Rechten
        CheckAndRaiseElevation
        
        # entferne die problematischen Updates
        If( RemoveWrongHotfixes ) {
            Write-Host "Es wurde mind. ein Windows Update gefunden welches deinstalliert wurde."
            Write-Host "Bitte warten, sammle Informationen ueber noch ausstehende Updates ..."
            Get-WindowsUpdate | Where { $_.Title -match $HotFixesToRemove} | Set-WindowsHiddenUpdate -Hide $True -Verbose
            Write-Host "Die zuvor deinstallierten Windows Updates wurden soweit möglich ausgeblendet."
            Write-Host "Bitte umgehend den Computer neu starten und direkt nach dem Start das Programm"
            Write-Host "erneut ausfuehren."
            Write-Host "Im Fall einer Endlosschleife (falls dies schon mehrfach gemacht wurde und diese"
            Write-Host "Meldung immer wieder erscheint dann die Deinstallation und das Ausblenden"
            Write-Host "manuell durchfuehren."
            waitkey "Weiter mit beliebiger Taste, danach manuell neu starten [x]" | Out-Null
        } Else {
            # es konnte keines der problmatisches Updates mehr deinstalliert werden, versuche die zu finden 
            # mit der try-and-error-methode dauerhaft auszublenden
            Write-Host "Bitte warten, sammle Informationen ueber noch ausstehende Updates ..."
            Get-WindowsUpdate | Where { $_.Title -match $HotFixesToRemove} | Set-WindowsHiddenUpdate -Hide $True -Verbose
            Write-Host "Die zuvor deinstallierten Windows Updates wurden soweit möglich ausgeblendet."
            WaitKey "Das Programm kann beendet werden, weiter mit beliebiger Taste [x]" | Out-Null
        }
    }
}

Function WaitKey($___text){
    Write-Host $___text
    $___x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | Out-Null
    Return $___x
}

Function CheckAndRaiseElevation {
    [Cmdletbinding()]
    Param()
    Process {
        # Test ob mit genug Rechten gestartet
        $IsElevated=([System.Security.Principal.WindowsPrincipal][System.Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)

        If( -not $IsElevated ) {
            Write-Host "Das Programm hat zu wenig Rechte: erhoehe Rechte."
            Try {
                # versuche das Batch Skript erneut mit lokalen Administratorrechten zu starten
                Start-Process -FilePath $env:localfname -Verb RunAs -ErrorAction SilentlyContinue
            }
            Catch {
                Write-Host "Der Benutzer hat die Erhoehung der Rechte verweigert - Abbruch!"
                WaitKey "Ende mit beliebiger Taste [x]" | Out-Null
            }
            Exit
        }
        # Write-Host "Programm laeuft aktuell mit Administrator Rechten."
        # wechsle in den urspr. Programmpfad wenn geht, auch UNC und gemappte Netzlaufwerke moeglich
        Set-Location $(Split-Path -Parent $env:localfname)
    }
}

# entfernt wenn möglich alle als Parameter angegebenen problematischen Hotfixes 
Function RemoveWrongHotfixes {
    [Cmdletbinding()]
    Param()
    Process {
        $ReturnVal=$False
        $InstalledHotFixes=$(Get-WmiObject -Class win32_quickfixengineering).HotFixID

        Foreach( $InstalledHotFix in $InstalledHotFixes ) {
            Foreach($HotFixToRemove in $HotFixesToRemove) {
                If( $InstalledHotFix -match "$HotFixToRemove") {
                    Write-Host "Das Update $InstalledHotFix wird entfernt"            
                    Start-Process -FilePath "wusa.exe" -Argumentlist "/Uninstall /KB:$HotFixToRemove /quiet /norestart" 
                    Write-Host "Das Update $InstalledHotFix wird dauerhaft ausgeblendet"   
                    Get-WindowsUpdate | Where { $_.Title -match "$HotFixToRemove"} | Set-WindowsHiddenUpdate -Hide $true -Verbose
                    $ReturnVal=$true
                }
            }    
        }
        Return $ReturnVal
    }
}

Function Get-WindowsUpdate {
    [Cmdletbinding()]
    Param()
    Process {
        Try {
            Write-Verbose "Abfrage aller Windows Updates"
            $Session = New-Object -ComObject Microsoft.Update.Session
            $Searcher = $Session.CreateUpdateSearcher()
            $Criteria = "IsInstalled=0 and DeploymentAction='Installation' or IsPresent=1 and DeploymentAction='Uninstallation' or IsInstalled=1 and DeploymentAction='Installation' and RebootRequired=1 or IsInstalled=0 and DeploymentAction='Uninstallation' and RebootRequired=1"
            $SearchResult = $Searcher.Search($Criteria)
            $SearchResult.Updates
        } Catch {
            Write-Warning -Message "Abfrage der Windows Updates fehlgeschlagen, Fehler $($_.Exception.Message)"
        }
    }
}

# Bonus
Function Show-WindowsUpdate {
    Get-WindowsUpdate |
    Select Title,isHidden,
        @{l='Size (MB)';e={'{0:N2}' -f ($_.MaxDownloadSize/1MB)}},
        @{l='Published';e={$_.LastDeploymentChangeTime}} |
    Sort -Property Published
}

# 
# Show-WindowsUpdate 
# Show-WindowsUpdate | Where { $_.isHidden }| Out-GridView

Function Set-WindowsHiddenUpdate {
    [Cmdletbinding()]
    Param(
        [Parameter(ValueFromPipeline=$true,Mandatory=$true)]
        [System.__ComObject[]]$Update,
        [Parameter(Mandatory=$true)]
        [boolean]$Hide
    )
    Process {
        $Update | ForEach-Object -Process {
            if ((($_.pstypenames)[0] -eq 'System.__ComObject#{c1c2f21a-d2f4-4902-b5c6-8a081c19a890}') -or 
                (($_.pstypenames)[0] -eq 'System.__ComObject#{70cf5c82-8642-42bb-9dbc-0cfd263c6c4f}') -or 
                (($_.pstypenames)[0] -eq 'System.__ComObject#{918efd1e-b5d8-4c90-8540-aeb9bdc56f9d}')) {
                try {
                    $_.isHidden = $Hide
                    Write-Verbose -Message "Blende Update $($_.Title) aus"
                } catch {
                    Write-Warning -Message "Ausblenden des Windows Update fehlgeschlagen, Fehler $($_.Exception.Message)"
                }
            } else {
                Write-Warning -Message "Ignoriere uebergebenes Objekt"
            }
        }
    }
}

# Beispiel: verstecke alle noch offenene Updates
#   Get-WindowsUpdate | Set-WindowsHiddenUpdate -Hide:$true -Verbose
# Beispiel: verstecke alle noch offenene Definitionsupdates
#   Get-WindowsUpdate | Where { $_.Title -match 'Definitionsupdate' } | Set-WindowsHiddenUpdate -Hide:$false
# Beispiel: verstecke alle noch offenene sicherheitsupdates
#   Get-WindowsUpdate | Where { $_.Title -match 'Sicherheitsupdate' } | Set-WindowsHiddenUpdate -Hide:$false
# Beispiel: verstecke Browser Choice Updates
#   Get-WindowsUpdate | Where { $_.Title -match 'Microsoft Browser Choice Screen Update'} | Set-WindowsHiddenUpdate -Hide $true -Verbose


main


;:BatchExit
;REM Hinweis: dieses Ende des Batch Skriptes wird sofort ausgefuehrt, es wird nicht auf das Ende der Powershell gewartet!
;goto :eof

# Stand 22.03.2021
#
# Die Fehler sind / wurden wohl endgueltig mit folgendens Updates am 18.03 bzw. 22.03.2021 behoben
# KB5001642 für Windows Server 2008 SP2 x64 (ESU)
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows6.0-kb5001642-x64_4ae1b3c5cebedcd27fe50add6a34e70a00d19b76.msu
# KB5001639 für Windows 7 SP1 x86  (ESU)
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows6.1-kb5001639-x86_f7571200399e9c1099c37cc78c5b0a5481259989.msu
# KB5001639 für Windows 7 SP1 x64  (ESU)
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows6.1-kb5001639-x64_de64f5cb314e3eac59bb3c4371c9ba802adf0f22.msu
# KB5001639 für Windows Server 2008 R2 (ESU)
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows6.1-kb5001639-x64_de64f5cb314e3eac59bb3c4371c9ba802adf0f22.msu
# KB5001641 für Windows Server 2012 x64
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows8-rt-kb5001641-x64_ec0dc33ff8d0d0381eb3fe9595c8a96ccebf9e61.msu
# KB5001640 für Windows 8.1 x86
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows8.1-kb5001640-x86_149741dd2206faf42303dd7a6800567b681367be.msu
# KB5001640 für Windows 8.1 x64
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows8.1-kb5001640-x64_7aa82103f5e37a9d3c2ce2b608c903ed0855ac3b.msu
# KB5001640 für Windows Server 2012 R2
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows8.1-kb5001640-x64_7aa82103f5e37a9d3c2ce2b608c903ed0855ac3b.msu
# KB5001631 für Windows 10 1507 und Server 2016
# KB5001634 für Windows 10 1803 
# KB5001638 für Windows 10 1809 und Server 2019
# KB5001648 für Windows 10 1909
# KB5001649 für Windows 10 2004 und 20H2
# 
# fehlerhaft waren bisher die Updates KB5000802, KB5000808, KB5000822, KB5000809, KB5000812, KB5000803, KB5000807, KB5001567, KB5001566, KB5001568, KB5001565

Das Script ist ausgiebige kommentiert und kann hier als Textdatei heruntergeladen werden (Link anklicken und im angezeigten Code per Rechtsklick das Kontextmenü öffnen und Speichern unter wählen und das Ganze mit der Erweiterung .ps1 speichern). An dieser Stelle mein Dank an Andy, und euch viel Erfolg bei der Update-Bereinigung.

Ähnliche Artikel:
Patchday: Windows 10-Updates (9. März 2021)
Patchday: Updates für Windows 7/Server 2008 R2 (9. März 2021)
Patchday: Windows 8.1/Server 2012-Updates (9. März 20
Windows 10 1809/1909/2004/20H2: Update KB5000802/KB5000808 verursachen BSOD beim Drucken in win32kfull.sys – zurückgezogen?
Neues zum Druckerproblem (BSOD) nach März 2021-Update
Microsoft liefert Workaround für Windows 10 Patchday-Druckerproblem (BSOD)
Windows 10: Außerplanmäßiges Update für Drucken BlueScreen-Bug
Windows 10: Weiterhin Probleme mit der Druckausgabe (März 2021)
Windows 10: Microsoft bestätigt Grafik-Druckfehler nach März 2021-Updates
Windows 10: Außerplanmäßiges Update für Grafik-Bug beim Drucken
Windows 10: Installationsfehler 0x80070541 bei Update KB5001649 (18.3.2021)
Windows 10: Außerplanmäßiges Update für Grafik-Bug beim Drucken
Windows 10: März 2021-Update-Chaos, Rollout erneut wegen Problemen gestoppt?
Windows 10: März 2021-Update erneut freigegeben?
Windows 7/8.1/Server: Korrektur-Updates für Druckprobleme (März 2021)


Cookies blockieren entzieht uns die Finanzierung: Cookie-Einstellungen

Dieser Beitrag wurde unter Windows 10 abgelegt und mit , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

6 Antworten zu Druckerprobleme März 2021: PowerShell-Script zur Update-Bereinigung

  1. Useron sagt:

    Danke für das Teilen von Infos und Hilfsansätzen ohne Polemik.

  2. bon-go sagt:

    Das ist eine Windows Batch Datei (zumindest Zeile 1-3 und 212-214) . Speichern als xyz.CMD und ausführen geht auch so. Die Batch Datei startet aus sich selbst heraus den Powershell Skript Code. Dieser fragt die bestehenden Rechte ab. Wenn diese nicht ausreichen werden lokale Administratorrechte angefragt und das Skript startet sich damit selbst noch einmal.

  3. Mathias Meinke sagt:

    Hallo,
    danke für die super Beiträge :). Ich komme bei dem Druckerproblem nicht mehr mit. Auch ich habe UTAX (Kyocera) Drucker im Einsatz und bin somit von diesem super Update betroffen. Zur Zeit habe ich noch die alternativ Treiber von UTAX mit W2012R2 und W2019 im Einsatz.

    Ist das Problem jetzt durch ein Update von MS behoben?

    Gruß
    Mathias

  4. Tim sagt:

    Bei mir hat das mit wusa in Zusammenhang mit dem quiet Parameter mit Windows 10 nicht funktioniert. Error 87 kam immer im Log.. Mussten dann über dism gehen. Scheint wohl ein bekanntes Problem zu sein. Deshalb wundert es mich dass es hier mit wusa durchgeführt wird?!

  5. bon-go sagt:

    Es gibt ein Skript Update. Nun nicht mehr komplett silent aber lt. meines Wissens nun überall funktionierend.

Schreibe einen Kommentar zu Tim Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Hinweis: Bitte beachtet die Regeln zum Kommentieren im Blog (Erstkommentare und Verlinktes landet in der Moderation, gebe ich alle paar Stunden frei, SEO-Posts/SPAM lösche ich rigoros). Kommentare abseits des Themas bitte unter Diskussion.