treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

WSUSクリーンアップウイザードがw3wp.exeエラーで途中で停止する

前回「WSUSの接続エラーを解消するメンテナンス実施」で実施したテスト環境でのWSUSサーバメンテナンスが成功した手順で、いざ本番環境のWSUSにてメンテナンスを実行すると、エラー…。
エラーについて調べたことをご報告。

エラーの内容。

前回の記事でも記載した、

f:id:treedown:20200428164054p:plain
このエラー。
----------------------------------------------------------------------------------------------------------------------------
[Window Title]
Visual Studio Just-In-Time デバッガー

[Main Instruction]
w3wp.exe [6768] でハンドルされない Microsoft .NET Framework の例外が発生しました。

必要なセキュリティ アクセス許可がない状態で Just-In-Time デバッガーが起動されました。このプロセスをデバッグするには、管理者として Just-In-Time デバッガーを実行する必要があります。このプロセスをデバッグしますか?

[V] プロセスの詳細を表示
[はい、w3wp.exe をデバッグします]
[いいえ、デバッグを取り消します]

[Expanded Information]
プロセス名: w3wp.exe
ユーザー名: NETWORK SERVICE
----------------------------------------------------------------------------------------------------------------------------

調べて見ました。

調べたところ…発見した情報。

調べたところ、それっぽいMicrosoft Docsサイトのページを発見。既知の問題なの?

クリーンアップ ウィザードにより IIS のプロセスがクラッシュする | Microsoft Docs
 URL:<https://docs.microsoft.com/en-us/archive/blogs/jpwsus/iis>

記載されている情報によれば、「Windows Server 2012(R2含む)の不具合によってこのエラーが発生する、と確認されている」とのこと。なるほど、2016とか2019じゃ出ないってこと。
よりによって一番やりたいメンテナンス項目である[不要な更新プログラムと更新プログラムのリビジョン]のクリーンアップで発生するとの記述があります。

そして、

Windows Server 2012 R2 では、更新プログラム KB3000850 で本問題の修正が可能らしい。しかしWindows Server 2012において、更新プログラムはない。

今回は…

Windows Server 2012 (R2ではない)

終わった。

※ちなみにR2の場合、以下のKB情報が参考になるそうです。
WSUS database is not cleared correctly after you run Server Cleanup Wizard on a Windows Server 2012 R2-based WSUS server
https://support.microsoft.com/en-us/kb/3000481

Windows Server 2012 R2なら、更新プログラムの適用で不具合の解消ができるので、無印より手立てはある感じ。

どうするか

説明の箇所では、「分割して実行することで現象を回避できる場合があります。」と記載があります。ダメ元ですが、やってみることにします。

しかし、最初にやっていたPowerShellコマンドレットで分割実行する方法では上手くいっていませんでした。
クリーンアップ ウィザードから実行する「不要な更新プログラムと更新プログラムのリビジョン」という処理では、二つの処理を実行して更新プログラムのお掃除を行っています。
これをPowerShellコマンドレットで分割実行する方法があり、各々のコマンドレットを一つづつ実行することによってタイムアウトする現象を回避できる、こともあるという感じ。

その方法というのが、Windows Server 2012の場合(それ以降のバージョンでも有効)

一番最初に、

Invoke-WsusServerCleanup -CompressUpdates

と実行して、次に

Invoke-WsusServerCleanup -CleanupObsoleteUpdates

と実行します。

しかし、「Invoke-WsusServerCleanup -CompressUpdates」は正常終了するものの、「Invoke-WsusServerCleanup -CleanupObsoleteUpdates」の処理中に、冒頭のw3wp.exeでハンドルされない例外の発生エラーによって処理が中断してしまい、最後まで完了していませんでした。(症状が改善せず)

しかし、改めて発見した<https://docs.microsoft.com/en-us/archive/blogs/jpwsus/iis>の情報によれば、

■WSUS Cleanup
https://gallery.technet.microsoft.com/ScriptCenter/fd39c7d4-05bb-4c2d-8a99-f92ca8d08218

このスクリプトセンターのPowerShellスクリプトを実行する、という別の策があるらしい。手がない現状ではこれも試してみるのがよさそう、ということで、試してみることにしました。
しかし、解説には(以下抜粋)
---------------------------------------------------------------------------------------------
CompressUpdates が期限切れの [更新プログラムのリビジョン] を削除する処理、

CleanupObsoleteUpdates が期限切れの [更新プログラム] を削除する処理にあたります。
---------------------------------------------------------------------------------------------
と記載があり、なんだかPowerShellコマンドレットで実行しているのと同じような感じもしてきます。
ダメ元ではありますが、文中にある「CompressUpdates のみを実行する例」と「CleanupObsoleteUpdates のみを実行する例」の実行を、各々個別に実行してみることにしました。
※ちなみに、「参考情報」にある「Set-ExecutionPolicy RemoteSigned」は実行済みなのでPowerShellスクリプトの実行環境は既に準備完了してあります。

実行してみたら、

「CompressUpdates のみを実行する例」
にあったスクリプトの実行は、何のエラーもなく正常に終了したようでした。
※Invoke-WsusServerCleanup -CompressUpdatesと同じだろうから、当然と言えば当然なのですが。

次いで、「CleanupObsoleteUpdates のみを実行する例」の実行中にw3wp.exeでハンドルされない例外の発生エラーが発生しました。
正確には、発生していたのですが、ウインドウの後ろに隠れて表示されていることに気づかなかったので、かなり長い時間実行中と認識しておりそのまま待ち続けることになりました。

最終的には、実行完了(していたかどうかは不明なのですが)後にかなり長時間放置した状態で、再びあのハンドルされない例外エラー画面を発見してガッカリしていました。

でも、なんかプロセス自体は動作していたことを示唆していたのに加えてメモリ使用量も設定値最大まで使い切られていて重い処理はしていたように見受けられたので、もしかしたら、と思ってWSUSの管理コンソールを開いてみたら、

f:id:treedown:20200428164740p:plain
この状態でしばらく待ち(なのは以前と変わらず)なのですが、数分待つと、

f:id:treedown:20200428164757p:plain
よさげな反応、そして

f:id:treedown:20200428164813p:plain
無事、更新プログラムの一覧が表示されるように回復していました。メンテナンス効果。

ビューをクリックしてから分単位で待たされるという動作は仕方ないとしても、タイムアウトしなくなったのは良かったです。メンテナンス終了となりました。