Sunday 7 July 2013

MSConfig で無効にしたスタートアップが復元できない場合がある

http://ebikuzure.wordpress.com/2010/04/20/msconfig-で無効にしたスタートアップが復元できない場/

Hebikuzure's Tech Memo

2010年4月20日

MSConfig で無効にしたスタートアップが復元できない場合がある

カテゴリー: Windows トラブル — hebikuzure @ 8:14 AM

Startup application may not run after disabled and re-enabled in MSConfig
http://support.microsoft.com/kb/982591/en-us

Windows OS のトラブルシュートで活躍するツールの一つに MSConfig (システム構成) がある。このツールを使えば Windows の起動時に読み込まれるサービスやスタートアップ プログラムについて個別に有効/無効を切り替えることができるので、サードパーティーのサービスやスタートアップ プログラムが原因で発生するトラブルの原因確認に非常に役立つ。
参考情報
Windows Vista または Windows 7 でクリーン ブートを実行して問題のトラブルシューティングを行う方法
http://support.microsoft.com/kb/929135/ja
ところがこの MSConfig でいったん無効にしたスタートアップ項目を有効に戻しても、そのプログラムが起動時に読み込まれず起動しなくなる場合がある。このサポート技術情報ではそうした現象について解説している。
この現象はスタートアップ プログラムとしてレジストリに登録されている実行ファイルの起動パスが展開可能文字列 (REG_EXPAND_SZ) 値として書き込まれており、また起動パスに %SysytemRoot% や %ProgramFiles% などの環境変数が含まれている場合に発生する。
MSConfig ではユーザー インターフェイスで無効にされた (チェックを外された) スタートアップ プログラムが登録されているレジストリ値を記憶した上で削除し、有効に戻された場合はレジストリ値を復元しているのだが、この時に展開可能文字列 (REG_EXPAND_SZ) 値がただの文字列 (REG_SZ) 値として復元されてしまうために問題が発生する。展開可能文字列 (REG_EXPAND_SZ) 値であれば環境変数は展開されてプログラムが実行されるのだが、文字列 (REG_SZ) 値では環境変数の部分が展開されないでプログラムの起動パスとして使用されるので、当然そのプログラムは起動できない。
例えば以下のようなレジストリ値で登録されている
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
名前: notepad
データ: %SysytemRoot%\system32\notepad.exe
種類: REG_EXPAND_SZ
スタートアップ項目があれば、起動時には環境変数が展開されて (既定の環境であれば) “C:\Windows\system32\notepad.exe” が起動される。
この項目を MSConfig で無効にして、もう一度有効にすると、以下のようにレジストリが復元される
名前: notepad
データ: %SysytemRoot%\system32\notepad.exe
種類: REG_SZ
この状態では、起動時には環境変数が展開されない “%SysytemRoot%\system32\notepad.exe” を起動しようとするので、当然そんなパスはないから起動できない。
この問題は製品の問題 (バグ) と技術情報に書かれているが、修正プログラムは存在していない。また Windows XP 以降の現在サポートされているすべてのバージョンの Windows にこのバグが存在する。
技術情報では以下のような回避策が示されている。
  1. MSConfig を使う前に、展開可能文字列 (REG_EXPAND_SZ) 値でパスが登録されていないか確認する (その場合は MSConfig で無効にしない)
  2. 現象が発生してしまったら、レジストリ エディタでスタートアップ項目を手動で復元する
いずれにせよあまり感心できない対処方法であり、色々なトラブルシュートに MSConfig が幅広く使われる事を考えると、修正プログラムの提供が望まれる。
またスタートアップに登録するようなプログラムのインストーラでは、環境変数を使った展開可能文字列 (REG_EXPAND_SZ) 値ではなく、絶対パスを使い文字列 (REG_SZ) 値としてレジストリに登録するように注意が必要だろう。

http://ebikuzure.wordpress.com/2010/04/20/msconfig-で無効にしたスタートアップが復元できない場/