Windows Update で特定の更新プログラムがインストールされないようにする方法（Powershell）

2021年3月9日に配信されたWindowsの更新プログラムにより[プリンターを使用するとPCがクラッシュするバグ](https://gigazine.net/news/20210312-windows-update-cause-printer-crash/)が全世界的に発生している模様です。

https://gigazine.net/news/20210312-windows-update-cause-printer-crash/

既にインストールされてしまったPCでは、該当する更新プログラム（「KB5000802」・「KB50000808」・「KB50000822」）をアンインストールすることでバグを回避できますが、このままでは次回の更新プログラム確認時に再び同じ更新プログラムがインストールされてしまいます。

Windows 7までは、Windows UpdateのUIから更新プログラムを「非表示」にし、自動でインストールされないようにすることが可能でしたが、現行のWindows 10ではそのようなオプションは削除され、代わりに同等の機能を提供する[トラブルシューティング ツール（wushowhide.diagcab）](https://support.microsoft.com/ja-jp/topic/windows-%E6%9B%B4%E6%96%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%8C-windows-10-%E3%81%AB%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AB%E5%86%8D%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-33882ad6-8859-ae74-8c83-19219ef19cc1)が配布されていました。

https://support.microsoft.com/ja-jp/topic/windows-%E6%9B%B4%E6%96%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%8C-windows-10-%E3%81%AB%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AB%E5%86%8D%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-33882ad6-8859-ae74-8c83-19219ef19cc1

しかし、このツールのダウンロード先が先月ごろからリンク切れしているため、入手できない状況になっています。

<blockquote class="twitter-tweet" data-dnt="true"><p lang="en" dir="ltr"><a href="https://twitter.com/MicrosoftHelps?ref_src=twsrc%5Etfw">@MicrosoftHelps</a> <a href="https://twitter.com/WindowsUpdate?ref_src=twsrc%5Etfw">@WindowsUpdate</a> <br><br>Why has the download link for wushowhide.diagcab been broken for more than a month?<br><br>That troubleshooter is the recommended solution in at least half a dozen Microsoft Support articles:<a href="https://t.co/Mc8cVkg6Ok">https://t.co/Mc8cVkg6Ok</a></p>&mdash; Bruce Roberts (@BAR01474) <a href="https://twitter.com/BAR01474/status/1368285918147252224?ref_src=twsrc%5Etfw">March 6, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ダウンロード直リンクは[こちら](https://download.microsoft.com/download/f/2/2/f22d5fdb-59cd-4275-8c95-1be17bf70b21/wushowhide.diagcab)。アクセスすると現在404が返ってきます。

幸いなことに、私は1月ごろに入手済みでしたので、当該ツールで使われていたPowershellコードから得られた[^1]、特定の更新プログラムのインストールを防止するPowershellスクリプトを再構成して掲載します。

[^1]: トラブルシューティングツールを7-Zipなどで解凍すると、中に入っているPowershellコードを取り出すことができます。

## スクリプト

- なお、**実行には管理者権限が必要**です。
- 非表示対象としてKB5000802を指定しているので、KB50000808・KB50000822を対象にしたい場合は、 `$target =` の部分を該当する更新プログラムのフルネームに置き換えてください。

```powershell
#Requires -RunAsAdministrator
# Must run this as an administrator!
# Based on the official wushowhide.diagcab

$target = "2021-03 x64 ベース システム用 Windows 10 Version 20H2 の累積更新プログラム (KB5000802)"

$session = New-Object -ComObject Microsoft.Update.Session
$searcher = $session.CreateUpdateSearcher()
$updates = $searcher.Search("IsInstalled=0").Updates

foreach($update in $updates){
  if ($update.Title -eq $target){
    $update.IsHidden = $true
  }
}
```

更新プログラムの名前で検索しているので（`$target`）、代入式を書き換えれば他の更新プログラムにも適用できるほか、ユーザーに更新プログラム名を入力してもらうように改造することも可能でしょう。

REPLで実行する場合（Powershellを起動して手入力でコマンドを実行していく場合）は、`$target =`の行からコピペすれば実行できます。

スクリプトとして保存して実行する場合は、 `#Requires -RunAsAdministrator` を冒頭につけておくと、管理者権限がないときにあらかじめPowershell側でエラーを表示してくれます。[^2]

なお、Powershell スクリプトの実行には簡単な[事前準備](https://tsuredurediary.com/archives/windows-powershell-script-execution.html)が必要です。

https://tsuredurediary.com/archives/windows-powershell-script-execution.html

[^2]: https://serverfault.com/a/676573

## リファレンスなど

COM オブジェクトには全くの門外漢ですが、上記スクリプト中で使っていそうな interface などのリファレンスを掲載しておきます。

- [IUpdateSession interface (wuapi.h)](https://docs.microsoft.com/en-us/windows/win32/api/wuapi/nn-wuapi-iupdatesession) → `Microsoft.Update.Session`
- [IUpdateSession::CreateUpdateSearcher method (wuapi.h)](https://docs.microsoft.com/en-us/windows/win32/api/wuapi/nf-wuapi-iupdatesession-createupdatesearcher)
- [IUpdateSearcher::Search method (wuapi.h)](https://docs.microsoft.com/en-us/windows/win32/api/wuapi/nf-wuapi-iupdatesearcher-search)

## スクリプトファイル（.ps1）

gistに投稿しました（03/13 22:08 追記）

https://gist.github.com/MaySoMusician/23c6943a5393c87161a6fffa544dbf3e