Windowsの設定で特定のタブが消えていたら
タイトルが非常に抽象的になってしまっているが、あまりにも適用範囲が広い情報なのでご勘弁を。
Windowsのコントロールパネルの項目やフォルダ・ファイルのプロパティには、標準ではない特定のタブが追加されていることがある。多くはメーカー製PCの独自設定であったり、自分で追加したツールの設定項目であるが、これが不意に表示されなくなった場合の対処方法のメモ。
困っていた状況
具体的には、筆者は以下の状況で困っていた。
- 筆者の所有するSONYのVAIO VGN-TX90PS(WindowsXP Professional)にてリカバリを実行。
- Windows XP ServicePack 3を適用。
- その他のWindows Updateを適用。
- VAIO Updateにて各種モジュールのアップデート。
- 不要なプリインストールソフトのアンインストール。
- アンチウィルスソフトの設定。
- 上記の間にWindowsに対して複数の設定を行う。具体的には以下のようなもの。
- 電源のプロパティに対する設定。
- スクリーンセーバーやデスクトップ関連の設定。
- フォルダの見栄えや操作性に関する設定。
- ネットワーク関連の設定。
- ふと気づくと、電源のプロパティにあるはずのVAIO 省電力設定のタブがない。
いや、省電力設定ができなくとも使用できないことはないのだが、バッテリ使用時でもCPUをフル回転させたい場合はあるし、モデムやDVDドライブの電源が設定できなくなるのも気持ち悪い。いくつかテストしてみると、どうやらVAIO省電力設定のタブで設定した内容自体は生きているが、タブが表示されていないだけのようだ。
ここから機種名(型番)や「VAIO」「省電力」「タブ」などの項目でWeb検索をかけてみたが、どうもピタリの情報が出てこない。
仕方がないので自分であたりをつけてみることにした。
思考と試行の過程
興味のない方は飛ばしてください。
VAIO Updateを疑う
まずはVAIO Updateでの更新が怪しいので、それを調査。まさにそのままの「VAIO 省電力設定 Ver.1.7.02」があるので、この更新を再度適用し直してみる。削除→再インストールしてみたものの、状況に変化なし。これは予測通り。
プロパティシートハンドラの登録はどこ?
次にレジストリを探索。Windowsの標準インターフェースである電源オプションにこのようなタブを追加するには、恐らくレジストリで特定のプロパティシートハンドラを追加するのだと考えたからだ。探索位置は、(HKCU|HKLM)\Software\Microsoft\Windows\CurrentVersionに決め打ちした。Windows2000の時代からあるインターフェースであるし、Windowsのごく標準的な場所にあるはずと踏んだからだ。
PowerManagementなどのキーワードを探してみるが、それらしきものが見あたらない。このあたりで、「ひょっとしてこのタブはファイルやフォルダのプロパティに追加されるシェルエクステンションのタブと同等なのでは?」と思い当たった。
Shell Extensions以下をみてみると、Approved, Blocked, Cachedというサブキーがある。Blockedは恐らく禁止すべきものと考えられ、エントリも空なので無視。HKLM側のApprovedには多数のGUID(CLSID)がエントリ名として登録されており、それぞれの名称らしきものが値となっていた。ここに"Sony Power Management Extensiond"を発見。これに間違いない。Extensiondの最後のdは何?とは思ったが。
登録内容は正しいのか?
今度はそのGUID({ED58A35B-B554-42AF-A26C-6F3D424200D3})を元にHKCRを見る。ここで予測していたのは、シェルエクステンションのプロパティシートハンドラを実装しているDLLのパスが間違って登録されていることだった。しかし、登録内容はどうやら間違っていない。さて、どうしたものか。
一旦戻って、HKLM側のShell ExtensionsのCachedを見てみると、登録されているエントリは、不思議なエントリ名になっている。具体的には以下のような、GUIDを2つ使用するものだ。
{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} {000214E?-0000-0000-C000-000000000046} 0x401
"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"の部分はApprovedに登録されているGUIDであり、後半のGUIDは8文字目を除いて共通のようだ。Cachedというからには、そのキャッシュ状態に不整合があるのかもしれない。このあたりを手がかりに、再度Web検索することにした。
なお、HKCU側のShell Extensionsも気にはなったが、VAIO省電力設定はHKLM側にあるべきもの(システムで共通)であろうし、HKCU側のCachedは値がバイナリであり、その意味を解読するのは骨が折れそうだった。また、HKLM側で共通性がある後半のGUIDも、HKCU側では他のものが多数使われており、これも調査が面倒だったのでひとまず後回しにした。
原因はWindowsのセキュリティパッチ
いくらか検索してみると、本家本元Microsoftの"セキュリティ更新プログラム MS06-015 のインストール後、エクスプローラまたは Windows シェルで問題が発生することがある"というページがかかった。内容は相変わらず呪文のようだが、大胆に意訳すると、「MS06-015のセキュリティ対策パッチ(Windows Update)を適用すると、Verclsid.exeのチェックに引っ掛かる一部の機能が扱えなくなる」というものだ。そして今回のケースに近い、「NVIDIA のシェル拡張を手動でレジストリに追加する方法」等という記載がある。これは怪しい。さらにこれを補完する情報を見つけ、これが原因であることをほぼ確信した。
謎のGUIDは何だったのか
謎であった類似のGUIDである"{000214E?-0000-0000-C000-000000000046}"は、どうやらCOMコンポーネントのインターフェースを示すGUIDであり、例えば"{000214E9-0000-0000-C000-000000000046}"であればIShellPropSheetExtを指しているようだ。おおざっぱに言って、COMコンポーネントの親クラスの型を示してシェルエクステンションの許可登録を行う場所が、レジストリのCachedキーということか。
結論
以下の内容をレジストリに登録することで、筆者のVAIOでは電源オプションのプロパティにVAIO 省電力設定のタブを復帰させることに成功した。
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Cached] "{ED58A35B-B554-42AF-A26C-6F3D424200D3} {000214E9-0000-0000-C000-000000000046} 0x401"=dword:00000001
他の環境でもMS06-015を原因として特定のプロパティシート(タブ)が表示されない場合、同様の方法で復帰させることができるだろう。ただし、1つめのGUIDにはApproved側で当該シェルエクステンションのGUIDを調査しそれを指定、2番目のGUIDには当該シェルエクステンションのCOM上での正しい親クラスを推測し、そのインターフェースのGUIDを指定する必要がある。まぁ、Windows(COM)プログラミングをしたことがないと難しいとは思うが…。OLE/COM Object Viewer (oleview.exe)を使えば比較的簡単に求められるかもしれないが、今回は試していないし、これはこれで話が長くなるので割愛する。
なお、最後の"0x401"は何を意味するかは調べていない。が、ひとまずWindowsXP以上では付けなければならず、逆にWindows2000/NTでは付けてはいけないようだ。
最終更新時間:2008年12月05日 05時50分02秒