私的なメモなので、あまり信用しないでください。 実際の動きは自分で確認してください。
どうもエクスプローラは管理者権限で起動しても管理者権限で起動されていないように見える。特殊な扱いなのか?
これか?(たぶん違うだろうけど)
Windows Explorer does not support file management using Principle of Least Privilege
シェルを一回落とせば管理者権限で起動することが可能。
Restarting Explorer in Vista in microsoft.public.platformsdk.shell
この状態だと昇格なしに全て管理者権限で動作するので、UACに慣れた身だと違和感がある、と言うか非常に怖い。
まあ、とりあえず仮想化の動作はVistaに対応していないプログラムのための緊急回避的動作(言い過ぎか)らしいので (仮想化自体もエラーが発生した場合に動作するらしいし)、 本来であれば仮想化が発生しない状態で正常に動作するのがVista上での正しいプログラムとのこと。
で、古いプログラム(?)はファイル操作時に勝手に仮想化が発生して、結果的に(権限がないとかの)エラーは発生しないんだけど、 ちゃんとVista対応しているのであれば仮想化されてはいけない(?)。 そんなわけで、Vistaに付属しているツール、メモ帳、ワードパッド、コマンドプロンプトなどは、 Program Filesフォルダのファイルを一般ユーザー権限で操作しても仮想化が行われずに、エラーが発生する(と言うか正常に処理できない)。
仮想化が勝手に行われるプログラムと行われないプログラムの違いは何かと言うと、プログラムに埋め込まれたマニフェストの内容。 マニフェストの内容としてrequestedExecutionLevelと言う要素を含むことができて、この要素が指定されたマニフェストがくっついているプログラムでは、 仮想化が行われない。この要素はVistaから登場した要素らしいので、 Vistaでの動作を考慮していないプログラムではrequestedExecutionLevel要素が設定されていない、もしくはマニフェスト自体がついていないことになり、 結果的に仮想化が行われることになる。 ちなみに、一般ユーザー権限での動作を想定していて且つ仮想化が行われない設定値 (正確には、そのプロセスを作成した親プロセスのプロセストークンを継承するだけで昇格の要求が発生しない)は、asInvoker。 メモ帳とかもrequestedExecutionLevelにasInvokerが指定されたマニフェストがついているので仮想化が発生しない。 ちなみに、マニフェスト自体はVistaより前からあった機能。
実行ファイルにマニフェストを埋め込むには、mt.exe(Manifest Tool)と言うツールを使用する。 MSDNライブラリでのmt.exeの説明は英語しかないし、内容も薄いんだけど、簡単な使用方法は以下のような感じになる。
mt.exe -inputresource:target.exe;#1 -out:temp.manifest
mt.exe -manifest temp.manifest -outputresource:target.exe;#1
基本的にリソースのIDは1つ(のはず?)なので、#1を指定すれば良い。 また、PE Explorerを使えば、リソースの状態がわかる(何番を使ってるとか)。
上記参考サイトのUACBlogの内容はUAC絡みで非常に参考になることが書かれている。特に、John(Microsoft)のコメントがかなり詳しい。 また、PCAやマニフェストの埋め込み方法などの情報も色々と書かれている。
Windows enables file and registry virtualization only for processes that meet the following criteria: 1) The process token is for an interactive standard user. 2) The executable is 32-bit (disabled by default for 64-bit processes). 3) The executable does not specify a requestedExecutionLevel in its application manifest.
requestedExecutionLevelがマニフェストに設定されていないと仮想化が行われるとのこと。
Most system executables specify an execution level, disabling virtualization. This includes explorer.exe, cmd.exe, and notepad.exe. You will not see virtual files at all (merged view) in processes with virtualization disabled.
エクスプローラ、コマンドプロンプト、ノートパッドなどのシステム実行ファイルは execution level が設定されているので仮想化が行われず、 仮想化ファイルを見ることはないらしい。
File virtualization is only allowed in %SystemRoot% (%windir%), %ProgramFiles%, and %ProgramData% (coming later) with some subdirectories excluded.
ファイルの仮想化は%SystemRoot%と%ProgramFiles%と%ProgramData%らしい。
っつーか、%ProgramData%はほんとか?
→少し試したぶんには、やっぱり%ProgramData%の操作で仮想化は行われないっぽい。
ローカルセキュリティポリシーのUAC仮想化ポリシーの説明に以下のような記載がある。
「アプリケーションの実行時データを %ProgramFiles%、%Windir%、%Windir%\system32、または HKLM\Software\.... に書き戻していたアプリケーションの問題を緩和します。」
\Users\All Users は \ProgramData へのシンボリックリンク。 ジャンクションのフォルダの中だと何も見えない。 ・・・シンボリックリンクとは何が違うのか?
C:\Users>dir /a:-
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は A031-50E9 です
C:\Users のディレクトリ
2007/02/17 15:46 <DIR> .
2007/02/17 15:46 <DIR> ..
2006/11/02 22:00 <SYMLINKD> All Users [C:\ProgramData]
2007/02/17 14:33 <DIR> Default
2006/11/02 22:00 <JUNCTION> Default User [C:\Users\Default]
2006/11/02 21:49 174 desktop.ini
2006/11/02 21:49 <DIR> Public
1 個のファイル 174 バイト
6 個のディレクトリ 38,620,946,432 バイトの空き領域
C:\Users>dir "All Users"
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は A031-50E9 です
C:\Users\All Users のディレクトリ
2007/03/06 21:04 <DIR> Apple Computer
2007/02/21 01:26 <DIR> ATI
2007/02/17 16:40 <DIR> Lenovo
2007/02/19 01:16 <DIR> Microsoft Help
2007/02/17 23:06 <DIR> PreEmptive Solutions
2007/02/18 01:59 <DIR> Trend Micro
2007/02/17 19:42 <DIR> UIB
0 個のファイル 0 バイト
7 個のディレクトリ 38,626,721,792 バイトの空き領域
C:\Users>dir c:\ProgramData
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は A031-50E9 です
c:\ProgramData のディレクトリ
2007/03/06 21:04 <DIR> Apple Computer
2007/02/21 01:26 <DIR> ATI
2007/02/17 16:40 <DIR> Lenovo
2007/02/19 01:16 <DIR> Microsoft Help
2007/02/17 23:06 <DIR> PreEmptive Solutions
2007/02/18 01:59 <DIR> Trend Micro
2007/02/17 19:42 <DIR> UIB
0 個のファイル 0 バイト
7 個のディレクトリ 38,631,768,064 バイトの空き領域
ジャンクションのフォルダでは何も見えないけど、移動することはできるらしい。 ちなみに、フォルダの作成とかも可能は可能だけど、そもそもジャンクションのフォルダはアクセス制限がかかってたりすることが多いので、 管理者権限がないと操作できなかったりすることはある。これはフォルダによって異なる。
C:\Documents and Settings>dir /a:-
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は A031-50E9 です
C:\Documents and Settings のディレクトリ
ファイルが見つかりません
C:\Documents and Settings>cd All Users
C:\Documents and Settings\All Users>dir /a:-
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は A031-50E9 です
C:\Documents and Settings\All Users のディレクトリ
2007/03/08 01:47 <DIR> .
2007/03/08 01:47 <DIR> ..
2007/03/06 21:04 <DIR> Apple Computer
2006/11/02 22:00 <JUNCTION> Application Data [C:\ProgramData]
2007/02/21 01:26 <DIR> ATI
2007/03/05 21:51 <DIR> CanonBJ
2006/11/02 22:00 <JUNCTION> Desktop [C:\Users\Public\Desktop]
2006/11/02 22:00 <JUNCTION> Documents [C:\Users\Public\Documents]
2006/11/02 22:00 <JUNCTION> Favorites [C:\Users\Public\Favorites]
2007/02/17 16:40 <DIR> Lenovo
2007/02/19 00:57 <DIR> Microsoft
2007/02/19 01:16 <DIR> Microsoft Help
2007/02/17 23:06 <DIR> PreEmptive Solutions
2006/11/02 22:00 <JUNCTION> Start Menu [C:\ProgramData\Microsoft\Windows\Start Menu]
2006/11/02 22:00 <JUNCTION> Templates [C:\ProgramData\Microsoft\Windows\Templates]
2007/02/18 01:59 <DIR> Trend Micro
2007/02/17 19:42 <DIR> UIB
2007/02/17 14:33 <JUNCTION> スタート メニュー [C:\ProgramData\Microsoft\Windows\Start Menu]
2007/02/17 14:33 <JUNCTION> デスクトップ [C:\Users\Public\Desktop]
0 個のファイル 0 バイト
19 個のディレクトリ 38,629,175,296 バイトの空き領域
この辺りのことは、 Developer Best Practices and Guidelines for Applications in a Least Privileged Environment のLocating of Per-User Application Settingsの項目に説明がある。
上記項目の説明で、アプリケーションがユーザー別やアプリケーション固有のデータをどのフォルダに持ったほうが良いかが記載されている。 アプリケーション固有のデータのフォルダに関しては、 例えばApple Computerのフォルダがこれに従っているように見える(Everyone がフォルダに書き込める設定になっている)。