Vista では %PROGRAMFILES% への書き込みは仮想化(Virtualization)されますが、なんでこういう風になったのでしょう?
まず、%PROGRAMFILES% への書き込みですが、実は Windows 2000 だろうと Windows XP だろうと書き込みが制限されていました。ただ、最小限の権限で実行するという security の大原則を守っていない user があまりにも多かったため、今までは問題なくやり過ごしてきたという人も多いと思います。
ちゃんと説明できる人は意外と少ないと思われますので、この際説明しておきます。
第一の理由は、security です。
通常 user が application を起動するときはその中身が置き換わっているかなんて注意を払わないものです。User が知らないうちにその application が置き換わったとします。これ、ある意味簡単に攻撃が成功してしまう状態ですね。
ただ、これが実際に深刻な脆弱性を招くかというと、攻撃手段が非常に限定されるため一般的にはそれほど問題は発生しないでしょう。むしろ、%WINDIR% とか、環境変数 "PATH" を通している folder の ACL を気にした方がよいです。ただし、当然推奨されるべきものではありません。
第二の理由としては、第一の理由と似ていますが、可用性(availability)です。
User が書き込めるということはすなわち、user の誤操作によって application を破壊してしまう恐れがあります。
ここまでは、application の置きかえ、改竄に関する問題です。第三の理由はここまでとは全く違う要因です。それは、multi user の support の問題です。
まず、Windows は NT 以降 multi user を前提に設計されています。その上で動作する application?も一部の例外を除き原則 multi user で動作するように設計・実装を行うべきです。
では、なぜ %PROGRAMFILES% に書き込むのが multi user で動作することを阻害するのでしょうか?
こちらの一点目の要因は、user 毎の設定ができないことです。Client でも1台の端末を複数の user で共有する場合はありますね。その場合、User 毎の設定ができた方がいいのは当然ですよね。
一点目の要因はそれほど深刻な状況を招きませんが、これから述べる二点目の要因は時に深刻な事態を招きます。それは、同時実行性の阻害です。
Windows 上で同時に複数の user で実行するしくみの一つに Terminal Service があります。最近では情報漏洩対策として既存 application を Terminal Service に移行するといった案件も多いでしょう。この場合、%PROGRAMFILES% に書き込みを行っていると問題が発生する場合があります。
ただ、Citrix Presentation Server (旧 MetaFrame) のように Vista の仮想化と同様の手法にて強引に互換性を保つものもありますが、こういったものは application を変更できる環境であれば積極的に利用してはいけません。
それから、問題は Terminal Service だけではありません。Windows XP 以降の client OS には「簡易ユーザーの切り替え」?(FUS: Fast User Switching) が搭載されています。この機能を利用している場合には、client OS でも問題が発生します。
ただ、複数の user で共有するものを扱いたい場合もあるでしょう。その場合はどうしたらよいか?
一番いい方法は、それを扱う専用の service 等を作成して、必ずそれを介して処理を行わせる方法です。代表的なものに多くの DBMS なんかが挙げられます。わざわざ自作しなくても、そういったものをお手軽に利用すのも一手です。
次の一手ですが、同時実行性を一切考慮しないのであれば単純に "All Users" の "Application Data"?(Vista の場合 "%PROGRAMDATA%") を利用するという方法もあります。この方法を利用する場合には、OS version によっては ACL を変更する必要があります。
どうでしょうか? %PROGRAMFILES% に書き込んではいけない理由が漠然とでも理解していただければ幸いです。
最後に、application を設計・実装するのであれば、実際に設計・実装を行う前に下記 document に目を通しておくことをお勧めします。
Designed for Windows XP アプリケーション仕様書 2.3 日本語版
XP 時点の古いものですが、Vista でも有効な application の満たすべき要件が載っています。Vista に関しては下記 document を読んでおいた方がよいでしょう。
Certified for Windows Vista 技術要件
Designed for Windows XP (Vista で同じ level に当たるのは Works with Windows Vista) より厳しい Certified の要件ですが、非常に参考になると思います。