WSUSでWindows Updateが適用されない問題を解決したお話

WSUSサムネイル

概要/あらすじ

実務未経験から中小企業の情シスに転職。

従業員約350名規模、都内に3拠点、地方に4拠点の会社(非IT業種)で上司と後輩の3名体制。

2019年6月にActive Directoryと共にWSUS(Windows Server Update Service)を導入し、Windows Updateの管理をできる環境を構築していたのだが、このWSUSが正常に機能していないことが分かり、対策を講じた。

こんばんは、ばーふぃんです。

すっかり秋になりましたね。

今回は今夏にWSUSを導入していたものの、まだしっかり運用出来ていなかったため、やっと落ち着いて色々触りまくってみるかーと思った矢先に何故か全然Windows Updateが適用されないという問題に直面したため、解決するためにやったことを書いていきたいと思います。

WSUSを使用したWindows Updateの流れ

さて、まずWSUSを使ったWindows Updateの流れについて簡単に説明します(ADのグループポリシーも活用する前提)。

通常、WindowsのPCやサーバはインターネット上のWindows Updateを見に行って、そこから更新プログラムをダウンロードしたのち、インストールをします。

WSUSは、同様にインターネット上のWindow Updateからダウンロードをしてサーバに溜め込んでいきます。

そして、ADのグループポリシーで、Windowsクライアントはインターネット上のWindows Updateを見に行かず、WSUSサーバのみを見に行くよう制御することで、 WSUSでWindows Updateを制御することができるようになっています。

Windowsクライアントは、定期的(スパンはグループポリシーで設定可能)にWSUSサーバへ自分に適用が必要な更新プログラムがあるかどうかを検出しにいきます。

※グループポリシーで「自動更新を構成する」を無効にしている場合は、手動で検出をする必要があります。

WSUSでは、指定したプログラムを指定したコンピュータグループに対して「承認」という動作を行い、Windowsクライアントはその「承認」された更新プログラムのみをWSUSサーバからダウンロードします。

ダウンロードされた更新プログラムは、グループポリシーで設定されたスケジュールの時間帯でインストールが行われ、再起動が必要なものは再起動時(再起動のスケジューリングもグループポリシーで適用可)に適用される。大まかにこんな流れになります。

WSUSを使用したWindows Update適用の流れ

以上を踏まえ、今回行った対策は以下の3つです。

  1. グループポリシーでレジストリの設定値を変更し、強制的にデュアルスキャンを無効にする
  2. グループポリシーでグループポリシーの更新間隔を設定する
  3. グループポリシーで更新プログラムの検出頻度を設定する

グループポリシーでレジストリの設定値を変更し、強制的にデュアルスキャンを無効にする

まず、Windows Updateのログを確認してみると(ログはPower Shellで “Get-WindowsUpdateLog” と打ち込んで実行すればデスクトップ上にテキストファイル上で出力されます)、WSUSとの通信をしているっぽい箇所で、”0x8024500c” というエラーコードが出ていることを確認。

これ、自分も詳しいことはよくわからんのですが、Windowsのデュアルスキャンという機能が働いていて、WSUSとインターネット上のWindows Updaterの両方を見に行っちゃうらしいんです。これが有効になっていることで、WSUSからのダウンロードがうまくいっていないという記事をたくさん見ました。

今では、通常はグループポリシー管理エディタで

「コンピューターの構成」→「管理用テンプレート」→「Windows コンポーネント」→「Windows Update」

→「Windows Updateに対するスキャンを発生させる更新遅延ポリシーを許可しない」:有効

としてやることで、このデュアルスキャンが無効になります。そう、通常は。

設定を改めて確認したところ、なんとこの部分は元々グループポリシーで設定されていたのです。

・・・

もう少し調べていくと、このグループポリシーに対応したWindowsのレジストリの値があるとのこと。

早速レジストリエディタで確認をしてみる。設定箇所は、

コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\DisableDualScan

値は “0”(無効)

ややこしいですが、「DisableDualScan」とは「デュアルスキャンを無効にする」という意味。つまり、”0″ になっているとうことは、 デュアルスキャンの無効が無効になっている、イコールデュアルスキャンが有効になっているということ。あれ、グループポリシーが正しく適用されてない・・・

まず検証のためにこの値をとりあえず手動で “1” に変え、手動で更新プログラムの検出を実行してみると・・・ダウンロードが走り出した・・・これだ。

ということで、この値を強制的に変更できる方法はないかと模索したところ、はい、ありました。しかもちゃんとグループポリシーで制御できる。

「コンピューターの構成」→「基本設定」→「Windowsの設定」→「レジストリ」→右クリック→「新規作成」→「レジストリ項目」

 

  • アクション:更新
  • キーのパス:SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate(参照可)
  • 値の名前:DisableDualScan
  • 値の種類:REG_DWORD
  • 値のデータ:00000001(10進数なら1と入れればいいはず)

グループポリシーによるレジストリ値の設定

正しく設定されていれば、以下のように反映される。

グループポリシーによるレジストリ値の設定

グループポリシーにも反映されていることを確認。

WSUSグループポリシー

さて、これでレジストリの「DisableDualScan」の値が正しく “1” になるか・・・何度か再起動をしてみると・・・ “1” になっていたり”0″ になっていたり結果はまちまち。

たまーに 有効になってくれていますが、そのたまにに賭けるのはよくないですね。

ということで、次の手を打ちました。

グループポリシーでグループポリシーの更新間隔を設定する

どうやらWindowsが起動する時に、起動が速過ぎてグループポリシーを読み込まないまま起動されてしまうなんてことがあるみたい。

高速ブートを無効にする、ということもできるみたいだけど、それはあまりやりたくなかったので、この方法を選択しました。

要は起動時に適用されないなら起動後にちゃんと適用されればいいじゃんという考え。

これは、グループポリシー管理エディタで

「コンピュータの構成」→「管理者用テンプレート」→「システム」→「グループポリシー」→「コンピュータのグループポリシーの更新間隔」

から間隔を設定することができます。

とりあえず1時間で設定をして見たところ、依然として起動時にレジストリの「DisableDualScan」の値が必ずしも “1” にはなっていないものの、少し時間を置いて確認してみると、ちゃんと有効になっている!

これでいける!と思いましたが、まだダメでした。次の対策に移ります。

グループポリシーで更新プログラムの検出頻度を設定する

上述した通り、Windowsクライアントは、定期的に WSUSサーバへ自分に対して「承認」された更新プログラムを検出し、ダウンロードします。

このWSUSサーバへ検出しにいくタイミングで、デュアルスキャンが無効になっていないと意味がありません。

そこでクライアントが更新プログラムを検出するタイミングに着目したところ、毎朝PCを起動した直後だけで、それ以外では全く検出が行われていなかったのです。

これではたとえ起動後にデュアルスキャンが無効になるようにしたところで、意味がありませんよね。デュアルスキャンが有効になった状態で起動することも多々あったので、その状態で更新プログラムの検出をしちゃってたということです。

それならデュアルスキャンが有効になった後に更新プログラムの検出をしに行けばいいわけなので、こちらもグループポリシーで設定しました。

グループポリシー管理エディタで

「コンピューターの構成」→「ポリシー」→「管理用テンプレート」→「Windowsコンポーネント」→「Windows Update」→「自動更新の検出頻度」

で設定可能。今回は1時間で設定。この設定は、

「コンピューターの構成」→「ポリシー」→「管理用テンプレート」→「Windowsコンポーネント」→「Windows Update」→「自動更新を更新する」

が有効になっていないと、適用されないので、注意してください。

WSUSグループポリシー

WSUSグループポリシー

ちなみに、これは未構成や無効にしていると、デフォルトで22時間に1回検出するみたいです。どうりで毎朝PC起動直後にしか検出しないわけですね・・・

これで、とりあえずは1日に何回か更新プログラムの検出を行ってくれるようになったので(検出は1時間間隔にしているのに何故か2時間以上掛かったりすることはありますが・・・)、デュアルスキャンが無効状態で更新プログラムを検出する、という動きを取れるようになりました。ひとまず一件落着。

もちろん、ユーザーに夕方とかに手動でやってもらうという方法もありますが、やってくれない人も必ず出てくるため、この運用は現実的ではないと考えました。

まとめ

はい、今回は非常に悪戦苦闘しました。WSUSが上手く動かない問題って、ググると大体グループポリシーの設定が正しく行われていない、というもので、今回のような事象(デュアルスキャンのレジストリ問題)は全然見当たりませんでした。

今回の一件でWindowsクライアントがWSUSによってWindows Updateが適用される一連の流れについて理解することができ、非常に勉強になりました(実は冒頭で説明している「WSUSを使用したWindows Updateの流れ」、今回で初めてちゃんと理解しました・・・w)。

おそらくこの内容はレアケースだと思うので、なかなかないと思いますが、グループポリシーが正しく設定されているにもかかわらずWindows Updateが正しく適用されない場合は、是非参考にしてみてください。

とはいえ、今回の対策はADのグループポリシーがあってこそ。やっぱりWSUSとADはセットで考えるべきなんだなあと改めて実感させられました。