
Ich versuche, den gesamten Update-Prozess in der Bibliothek, in der ich arbeite, zu automatisieren. Ich habe ein einfaches Skript geschrieben, mit dem ich sowohl alle unsere Softwarepakete mit Chocolatey aktualisieren als auch Windows-Updates mit dem Modul PSWindowsUpdate durchführen kann. Ich habe jedoch einige Schwierigkeiten, wenn es darum geht, Windows-Updates mit PSWindowsUpdate zu verbergen. Laut den verschiedenen Online-Artikeln/Dokumentationen, die ich gelesen habe, scheint es recht einfach zu sein, aber aus irgendeinem Grund funktioniert es bei mir nicht. Ich habe ausdrücklich verwiesen aufdiese Stackoverflow-Frageund habe versucht, die akzeptierte Antwort als meine Lösung anzuwenden, aber ohne Erfolg. Die Antwort hier kommt auch nicht ganz auf das zu sprechen, was ich erreichen möchte. Lassen Sie mich zunächst einige Hintergrundinformationen geben:
HINTERGRUND
Ich habe 5 Windows 10 Pro-Systeme und 11 Windows 7 Pro-Systeme. Alle sind 64-Bit. Die Windows 7-Systeme wurden alle zuvor auf WMF 5.1 aktualisiert. Ich verwende Remote Desktop Enterprise Edition, um Skripte auf mehreren Computern gleichzeitig auszuführen und so den Aktualisierungsprozess zu optimieren.
WAS ICH VERSUCHT HABE
Ich habe ziemlich viel Zeit damit verbracht, mein eigenes Problem durch verschiedene Google-Suchen und Ausprobieren mit meinem PS-Skript zu lösen. Wenn ich das Skript auf meinen Remote-Rechnern ausführe, läuft alles einwandfrei und wird aktualisiert. Das Problem besteht, wie ich bereits erwähnt habe, darin, dass die von mir angegebenen Windows-Updates nicht immer ausgeblendet werden (da ich wahrscheinlich irgendwo einen Fehler mache, haha). Hier ist mein Skript:
#This script will update all chocolatey packages and will also download install any new Windows Updates
#Begin ExecutionPolicy Set
Echo "Setting Execution Policy Settings"
Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy RemoteSigned -Force -Confirm:$false
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force -Confirm:$false
Echo "Initializing Unattended Update Automation Powershell Script"
#Begin Chocolatey Update
Echo "Updating Chocolatey Packages"
#Remove Java and reinstall 64-bit only
cuninst jre8 -y
cinst jre8 -PackageParameters "/exclude:32" -y
#Queries Chocolatey.org database for updates to locally installed packages and updates them if necessary
cup all -y --ignore-checksums
#Begin Windows Update
Echo "Enabling Windows Update Services"
Get-Service bits, wuauserv | Set-Service -StartupType manual
Echo "Copying Module PSWindowsUpdate to PowerShell Modules Folder"
#Grabs copy of PSWindowsUpdate Module and copies it to remote machine
Copy-Item -Path \\DIROFFICE\WindowsUpdate\PSWindowsUpdate -Destination C:\Windows\System32\WindowsPowerShell\v1.0\Modules -recurse -force
Echo "Importing Powershell Module PSWindowsUpdate"
Import-Module -Name PSWindowsUpdate -force
refreshenv
Echo "Enabling updates for additional Microsoft components and software"
Add-WUServiceManager -ServiceID 7971f918-a847-4430-9279-4a52d1efe18d -Confirm:$false
Echo "Querying Microsoft Update Server for Windows Updates"
Get-WUList -MicrosoftUpdate
Echo "Hiding Unnecessary Updates"
Hide-WUUpdate -Title "Update for Microsoft OneDrive" -HideStatus:$true -Confirm:$false
Echo "Downloading and Installing Windows Updates"
Get-WUInstall -MicrosoftUpdate -acceptall
Echo "Stopping Windows Update Services"
Get-Service bits,wuauserv | Stop-Service
Echo "Setting CurrentUser Execution Policy Back to RemoteSigned"
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force -Confirm:$false
DAS PROBLEM/DIE FRAGE
Was ich letztendlich erreichen möchte, ist, bestimmte Updates basierend auf bestimmten Schlüsselwörtern auszublenden, die im Titel des Updates vorkommen. Beispielsweise haben wir Microsoft 2016 auf allen unseren Computern installiert, aber ich möchte alle Outlook-, OneDrive-, Visio- und Skype-Updates sowohl auf W10- als auch auf W7-Rechnern sowie Microsoft Security Essentials auf W7-Rechnern ausblenden können. Gibt es eine effektive Möglichkeit, das PSWindowsUpdate-Modul zu verwenden, um Updates auszublenden, die bestimmte Wörter enthalten?
ZUSÄTZLICHE BEMERKUNGEN
Die kleine Codezeile, die in meinem Skript unter dem Abschnitt „Updates verbergen“ aufgeführt ist, dient lediglich Testzwecken. Ich habe zunächst versucht, Updates zu verbergen, indem ich den vollständigen Titel des jeweiligen Updates verwendet habe. Beispielsweise gab es zahlreiche Updates für Outlook 2016, deren Titel entweder „Sicherheitsupdate für Microsoft Outlook 2016“ oder einfach nur „Update für Microsoft Outlook 2016“ lautete. Ich habe versucht, Hide-WUUpdate -Title "Update for Microsoft Outlook" -HideStatus:$true -Confirm:$false
sowohl als auch zu verwenden Hide-WUUpdate -Title "Security update for Microsoft Outlook" -HideStatus:$true -Confirm:$false
. Dies scheint nicht zu funktionieren, da beim Anzeigen meiner installierten Updates angezeigt wurde, dass 4 oder 5 Updates für Microsoft Outlook installiert waren.
Ich habe auch versucht, das Platzhalterzeichen (*) zu verwenden, aber ich glaube nicht, dass ich ganz verstehe, wie es funktioniert. Ich habe ein paar Dinge wie Hide-WUUpdate -Title "Update for Microsoft Outlook*" -HideStatus:$true -Confirm:$false
und ausprobiert Hide-WUUpdate -Title "Outlook*" -HideStatus:$true -Confirm:$false
. Ich habe sogar ein doppeltes Platzhalterzeichen mit etwas wie ausprobiert Hide-WUUpdate -Title "*Microsoft Oulook*" -HideStatus:$true -Confirm:$false
.
Soweit ich es auf TechNet und MSDN gelesen habe, stimmt das Platzhalterzeichen (*) mit Zeichen überein, die an der angegebenen Position beginnen. Funktioniert das nicht, wenn Leerzeichen enthalten sind?
Die Verwendung der KB-Artikel-ID ist nicht meine bevorzugte Methode, da ich mein Skript jedes Mal mit den neuen KB-IDs aktualisieren müsste, die ich verbergen muss. Wenn möglich, würde ich den Schlüsselwortansatz viel lieber verwenden. Ich habe versucht, die in der obigen Stackoverflow-Referenz aufgeführte Methode nur zum Spaß zu verwenden, aber es ist nicht die Lösung, nach der ich im Moment suche.
Antwort1
Hide-WUUpdate
unterstützt möglicherweise nicht die gleichzeitige Aktualisierung mehrerer Datensätze.
Ein gängiger Ansatz hierfür in Powershell besteht darin, Ihre Objekte am Anfang der Pipeline einzugrenzen und sie dann am Ende der Pipeline an Ihre Aktion zu senden (z. B. Get-Process notepad | Stop-Process
). Dies gilt nur für dieses Szenario, wenn Hide-WUUpdate
Objekte als Eingabe akzeptiert werden. Möglicherweise ist dies nicht der Fall, sondern es ist nur die Verwendung mit seinem -Title
Flag möglich, das möglicherweise keine Mehrfacheinträge unterstützt.