Windows 秘話
接合ポイントの機能不全
Raymond Chen
接合ポイントが機能しないのは一体どういうことでしょうか。本当は、問題なく機能していますが、思うようには機能していないということです。今月のコラムでは、このことについて説明します。
Windows Vista と Windows 7 では、接合ポイントと呼ばれるファイル システムの機能が利用されており、これを利用するために、レガシ名があるシステム ディレクトリに接合ポイントを含めています。しかし、エクスプローラーからこのフォルダーに移動したり、dir コマンドを発行しても、アクセスが拒否されたことを示すエラーが返されます。マイクロソフトが接合ポイントを作成したのは、MSDN ガイダンスを無視して、さまざまな既知のファイル システムのパスをハードコードしたアプリケーションに互換性を提供するためであることは間違いないでしょう。それでは、なぜ接合ポイントを使用しても機能しないのでしょうか。
実際のところ、接合ポイントは本来の目的どおりに機能します。ですが、コマンドラインやエクスプローラーからアクセスされることは、本来の目的ではありません。このような状況に至った経緯を確認するために、時間を 10 年ほど巻き戻してみましょう。
Windows NT の発売当初、ユーザー プロファイルは、その呼び名のとおり、C:\WINNT\Profiles ディレクトリに存在していました。それから、当時 Windows ディレクトリの既定の名前は WINNT でした。Windows 2000 の開発中、オペレーティング システムの開発チームは、セキュリティに関する考慮事項と法人ユーザーからのフィードバックに基づいて、Windows ディレクトリのセキュリティ設定を強化できるように、ユーザー プロファイル ディレクトリを Windows ディレクトリから別の場所に移動しました。
この変更が行われる前、システムの中で最も重要なディレクトリである Windows ディレクトリでは、ユーザー プロファイル ディレクトリが含まれていることで、セキュリティの問題を抱えていました。開発チームは、新しい厳密なセキュリティを Windows ディレクトリ全体に適用する際に、誤ってシステムからすべてのユーザーを締め出すことにならないよう、Profiles のサブディレクトリを慎重に扱う必要がありました。Windows ディレクトリからユーザー プロファイルを移動すると、セキュリティの問題は解決しました。
フォルダーを再配置することで、フォルダーをより説明的な名前に変更する機会が生まれました。当初は Documents & Settings という名前が検討されていましたが、アンパサンドが原因で、アプリケーションの互換性に関する問題が非常に多く発生しました。たとえば、アンパサンドがキーボード アクセラレータのマーカーと誤って解釈された結果、ディレクトリが Documents _Settings と表示されたプログラムもあります (これは、メニューやダイアログ ボックスで使用される、アクセラレータ キーに下線を表示するという規則に従って行われた処理です)。
その結果、Windows 2000 では、Documents and Settings という名前に落ち着きました。この名前により、このディレクトリに適度に説明的な名前を付けることはできましたが、他の要素を考慮していませんでした。たとえば、ディレクトリ名にスペースが含まれていると、常に引用符を使用する必要があるため、パスの入力処理が煩雑になりました。また、名前の長さ自体も問題になりました。特に、Win32 パス名の
MAX_PATH
の制限を超える点が問題でした。この他にも問題となる点があったため、Windows チームは Windows Vista でいくつかのシステム ディレクトリをさらに再編成することになり、この構造は Windows 7 でも継続して使用されています。
ユーザー プロファイル ディレクトリを 2 回目に移動したとき、Windows チームは、このディレクトリのハードコードされたパスを含むアプリケーションをサポートするために、接合ポイントを配置しました。本来、アプリケーションでは、
SHGetFolderPath
や
GetProfilesDirectory
などの関数を使用すべきでした。また、スクリプトを使用している場合は、
Shell.Application.NameSpace
メソッドを使用する必要があります (これについては 2005 年 11 月号のコラムで説明しました)。
アプリケーションで、次のファイル
C:\Documents and Settings\<username>\スタート メニュー\プログラム\Internet Explorer.lnk
にアクセスする場合、
Documents and Settings
と
スタート メニュー
に設定された接合ポイントに従って、呼び出しは適切な新しい場所にリダイレクトされます。移動プロファイル以外のユーザーの現在のユーザー プロファイル ディレクトリは次のとおりです。
C:\ユーザー\<username>\AppData\Roaming\Microsoft\Windows\スタート メニュー\プログラム\Internet Explorer.lnk
当然ながら、プログラマーは、古い場所をハードコードすべきではなかったのと同様に、この新しい場所をハードコードするべきではありません。既知のフォルダーの場所を確認するために、適切な関数を使用する必要があります。
もちろん、新しい機会により、新たな問題が発生する可能性はあります。接合ポイントを考慮して設計されていないアプリケーションでは、ディレクトリ ツリーを再帰的に移動する際、無限ループに陥る場合があります。この問題を回避するため、互換性に関わる接合ポイントではディレクトリ トラバーサルを許可していますが、内容を一覧表示するアクセス許可は明示的に拒否しています。そのため、エクスプローラーやコマンド プロンプトで、このようなフォルダーにアクセスすると、アクセスが拒否されたことを示すエラーが返されます。
接合ポイントでは、互換性に関するシンボリック リンクを使用して十分なアクセス権を与えることで、ディレクトリ名をハードコードするという適切ではない方法で設計された古いアプリケーションに互換性を提供するという目標を達成しています。ただし、このような古いアプリケーションで深刻な自体を引き起こす柔軟性は与えないようにしています。また、内容を一覧表示するアクセス許可を拒否すると、経験の浅いプログラマーが、これまでと同様に古いアプリケーションのしきたりを引き続き使用するという厄介な問題を一掃できるという、すばらしい副作用があります。この手法で経験の浅いプログラマを正しい方向に導くことができたのか、ですって。時がたてばわかるでしょう。
Raymond Chen は、自身の Web サイト「The Old New Thing」(古くて新しいもの、英語) および同じタイトルの著書 (Addison-Wesley、2007 年発行) で、Windows の歴史、Win32 プログラミング、そして塩豆乳について触れています。
関連コンテンツ
Windows 秘話: エンコードは暗号化ではない (英語)