KB2686509の適用失敗についてのメモ。多分罠は2つ

本日のMicrosoft UpdateにてKB2686509の適用に失敗した。多分Windows Updateの時代を含めて初めて失敗したので、記録を残しておく。

http://support.microsoft.com/kb/2686509 を読むと、こんな記述がある。

This update enumerates all the keyboard layout files that are registered on your computer, and then it verifies that they are all in the %Windir%\System32 folder.

http://support.microsoft.com/kb/2686509

どうもKB2686509は適用時にこんなことをやっている模様。

  1. レジストリに登録されてるキーボードレイアウトファイルを列挙。
  2. %Windir%\System32 の中にキーボードレイアウトファイルの現物があるかチェック。

%Windir%\KB2686509.log の中に堂々と「RegQueryValueEx」だなんて名前が出てくるので、レジストリの中身を舐めているのは間違いないと思う。

同ページの他のセクションから推測するに、以下のレジストリキーがチェック対象らしい。

  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Keyboard Layout
  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Keyboard Layouts

このキー以下(サブキーを含む)の値を片っ端からチェックしているのではないかと思う。

このチェックは「レジストリに登録されているものの、%Windir%\System32 以下に現物が存在しないキーボードレイアウトファイルを炙り出す」という目的で行っていて、且つこのチェックによって更新が失敗することはMicrosoftも想定済み(むしろそうなることが目的?)なようで、先程のページにも色々と記述がある。

この場合は %windir%\Faultykeyboard.log が生成されているので、参考にして修正を行う。ページには「足りないキーボードレイアウトファイルを %Windir%\System32 にコピーする(但しコピーする前にそのファイルが信頼に足るものか確認してね)」的なことが書いてあるが、これみたいに「該当するファイルを使用しているレジストリエントリを削除」でもOKらしい。

さて、ここからは推測(という名の妄想)混じり。

Microsoft Updateしたらageるスレ 72を見ていると「キーボードレイアウトを変更していると失敗する」という書き込みがある。

Windows XPにはレジストリを弄ってキーボードレイアウトを変更するというネタがあって、それが「HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Keyboard Layout」直下に「Scancode Map」という名前で値を設定する、という方法だ*1

今回のKB2686509にとって「Scancode Map」は予期しない値で、予期しない値がレジストリに存在する為に更新に失敗する(そういうロジックで更新プログラムが実装されている)のではないだろうか? だから一旦その値そのものを削除(値を空にするのではなく)してから更新すると成功する――と考えると辻褄が合う気がする。

「予期しない」という言葉を使ったのは http://support.microsoft.com/kb/2686509 にこのようなケースに対する対応策が書かれてないから。「Scancode Map」があって失敗した場合は %windir%\Faultykeyboard.log は生成されない*2し、仮に生成されたとしても原因は「キーボードレイアウトファイルが無い」ではないので役に立たない。

しかもどちらが原因でもエラーコードは同じなんだよなあ。

という訳でKB2686509に失敗した場合は、

  1. 「Scancode Map」のような予期しない値がレジストリに存在しないか?
  2. キーボードレイアウトファイルが欠けていないか?

この順番に二段構えぐらいで臨むべきかと思う。

ちなみに私のPCは「Scancode Map」があって失敗。この値のみのバックアップは作成済みなので、値を削除してからMicrosoft Updateをかけて、後でリストアした。合計4台なので面倒だった。

*1:この方法ってVista以降でも有効なのだろうか?

*2:手元の環境での挙動。