本日の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は適用時にこんなことをやっている模様。
- レジストリに登録されてるキーボードレイアウトファイルを列挙。
- %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に失敗した場合は、
- 「Scancode Map」のような予期しない値がレジストリに存在しないか?
- キーボードレイアウトファイルが欠けていないか?
この順番に二段構えぐらいで臨むべきかと思う。
ちなみに私のPCは「Scancode Map」があって失敗。この値のみのバックアップは作成済みなので、値を削除してからMicrosoft Updateをかけて、後でリストアした。合計4台なので面倒だった。