
私は勤務先の図書館でアップデートプロセス全体を自動化しようとしています。Chocolateyを使用してすべてのソフトウェアパッケージを更新し、PSWindowsUpdateモジュールを使用してWindowsアップデートを実行できる簡単なスクリプトを作成しました。しかし、PSWindowsUpdateを使用してWindowsアップデートを非表示にする際に問題に遭遇しています。私が読んださまざまなオンライン記事/ドキュメントによると、それは十分に簡単なようですが、何らかの理由でうまくいきません。私は特に以下を参照しました。このStackoverflowの質問そして、受け入れられた答えを自分の解決策として適用しようとしましたが、不満はありませんでした。ここでの答えも、私が達成しようとしていることを十分には理解していません。まず背景を説明しましょう。
背景
私は Windows 10 Pro システムを 5 台、Windows 7 Pro システムを 11 台所有しています。すべて 64 ビットです。Windows 7 システムはすべて、以前に WMF 5.1 に更新されています。更新プロセスを効率化するために、Remote Desktop Enterprise Edition を使用して複数のコンピューターで同時にスクリプトを実行しています。
私が試みたこと
私は、さまざまな Google 検索や PS スクリプトの試行錯誤を通じて、自分の問題を解決しようとかなりの時間を費やしてきました。リモート マシンでスクリプトを実行すると、すべてが正常に実行され、更新されます。問題は、すでに述べたように、指定した Windows Update が常に非表示になるわけではないことです (おそらくどこかでミスをしているのでしょう)。これが私のスクリプトです。
#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
問題/質問
私が最終的に実現したいのは、更新プログラムのタイトルに表示される特定のキーワードに基づいて、特定の更新プログラムを非表示にすることです。たとえば、すべてのコンピューターに Microsoft 2016 がインストールされていますが、W10 と W7 の両方のマシンで Outlook、OneDrive、Visio、Skype のすべての更新プログラムを非表示にし、W7 マシンでは Microsoft Security Essentials も非表示にしたいと考えています。PSWindowsUpdate モジュールを使用して、特定の単語を含む更新プログラムを非表示にする効果的な方法はありますか?
その他の注意事項
スクリプトの更新プログラムの非表示セクションにリストされている短いコード行は、テスト目的のためだけに存在します。最初は、更新プログラムの完全なタイトルを使用して更新プログラムを非表示にしようとしました。たとえば、Outlook 2016 の更新プログラムには、タイトルが「Microsoft Outlook 2016 のセキュリティ更新プログラム」または単に「Microsoft Outlook 2016 の更新プログラム」のいずれかであるものが多数ありました。私は と を使用しようとしましたHide-WUUpdate -Title "Update for Microsoft Outlook" -HideStatus:$true -Confirm:$false
。Hide-WUUpdate -Title "Security update for Microsoft Outlook" -HideStatus:$true -Confirm:$false
インストールされた更新プログラムを表示すると、Microsoft Outlook の更新プログラムが 4 つまたは 5 つインストールされていることが示されたため、これは機能していないようです。
ワイルドカード (*) も使用してみましたが、その仕組みを完全に理解しているわけではありません。 や など、いくつかのことを試しましたHide-WUUpdate -Title "Update for Microsoft Outlook*" -HideStatus:$true -Confirm:$false
。Hide-WUUpdate -Title "Outlook*" -HideStatus:$true -Confirm:$false
のような二重ワイルドカードも試しましたHide-WUUpdate -Title "*Microsoft Oulook*" -HideStatus:$true -Confirm:$false
。
TechNet と MSDN で読んだところによると、(*) ワイルドカードは指定された位置から始まる文字と一致します。スペースが含まれていると、これは機能しなくなりますか?
KB 記事 ID を使用する方法は、非表示にする必要のある新しい KB ID でスクリプトを毎回更新する必要があるため、あまりお勧めできません。可能であれば、キーワード アプローチの方がはるかに望ましいです。面白半分に上記の Stackoverflow リファレンスに記載されている方法を試してみましたが、それは最終的に私が現在求めている解決策ではありません。
答え1
Hide-WUUpdate
一度に複数のレコードを更新することはサポートされない可能性があります。
Powershell でこの問題に対処する一般的な方法は、パイプラインの先頭でオブジェクトを絞り込み、パイプラインの末尾でアクションに送信することです (例Get-Process notepad | Stop-Process
)。 がオブジェクトを入力として受け入れる場合、このシナリオにのみ適用されますHide-WUUpdate
。 が受け入れない場合、フラグでの使用のみが許可され-Title
、複数のエントリがサポートされない可能性があります。