UAC (User Account Control)が有効な状態だと、管理者グループに属しているユーザでも通常は管理者権限がない状態でプログラムが実行されます。管理者権限で実行されるのは、
などです。
管理者権限がない状態で実行されたプログラムから、C:\WindowsやC:\Program Filesや、レジストリのHKLM\Softwareなど以下に書き込むと、ユーザが書き込める領域にリダイレクトされます。この仮想化は以下の場合には機能しません。
というわけで、Vista未対応アプリケーションはmanifestにrequestedExecutionLevelが指定されていないのでリダイレクトが有効、Vistaに対応しているのであればrequestedExecutionLevelを指定するべきで、その場合にはリダイレクトは無効になる、ということのようです。
ちなみに、デフォルトで入っているアプリ(メモ帳など)はrequestedExecutionLevelが指定されているためリダイレクトが無効になっています。つまり、Vista非対応アプリでC:\Program Files以下にファイルを書き込むと、そのファイルはメモ帳ではそのまま開くことができません(リダイレクト先のファイルのパスを指定すれば開くことができます)。
以下は参考サイト。
Vista用にマニフェストにtrustInfoを加えてみたところ、mt.exeが警告を出すようになってしまいました。
mt.exe:manifest authoring warning 81010002:Unrecognized Element "trustInfo" in namespace "urn:schemas-microsoft-com:asm.v3".
VistaのSDKに入っているmt.exeを使えば警告が出なくなるようですが、試しに入れてビルドしてみたところ、一部のファイルでコンパイラがメッセージも出さずにエラーで終了してしまいます。VS2005 SP1も入れる必要があるのかも知れませんが、まだβなのでためらわれるところ。
とりあえず、マニフェスト自体は正しく入っているようで、ファイルやレジストリの仮想化は無効になりました。
C++0xの部分的なドラフトが公開されました。
追加されたものは、
らしいです。もちろんTR1やTR2も入るようです。2009年に出すというマイルストーンが出ていますが(出ないと0xじゃなくなってしまいますし)、本当に出て、実装もされるのでしょうか。