プログラム関連 >  メモ >  Vista関連 >  UAC関連
最終更新日:2007/06/06

UAC関連

基本的な注意事項

私的なメモなので、あまり信用しないでください。 実際の動きは自分で確認してください。

■ 管理者権限が必要なフォルダに対する操作について

■ 管理者権限が必要なフォルダに対して一般ユーザー権限でファイル操作を行った場合(.NET Frameworkを使用してテスト)

■ UAC、仮想化関連の参考リンク

■ マニフェストを使用した仮想化回避

まあ、とりあえず仮想化の動作はVistaに対応していないプログラムのための緊急回避的動作(言い過ぎか)らしいので (仮想化自体もエラーが発生した場合に動作するらしいし)、 本来であれば仮想化が発生しない状態で正常に動作するのがVista上での正しいプログラムとのこと。

で、古いプログラム(?)はファイル操作時に勝手に仮想化が発生して、結果的に(権限がないとかの)エラーは発生しないんだけど、 ちゃんとVista対応しているのであれば仮想化されてはいけない(?)。 そんなわけで、Vistaに付属しているツール、メモ帳、ワードパッド、コマンドプロンプトなどは、 Program Filesフォルダのファイルを一般ユーザー権限で操作しても仮想化が行われずに、エラーが発生する(と言うか正常に処理できない)。

仮想化が勝手に行われるプログラムと行われないプログラムの違いは何かと言うと、プログラムに埋め込まれたマニフェストの内容。 マニフェストの内容としてrequestedExecutionLevelと言う要素を含むことができて、この要素が指定されたマニフェストがくっついているプログラムでは、 仮想化が行われない。この要素はVistaから登場した要素らしいので、 Vistaでの動作を考慮していないプログラムではrequestedExecutionLevel要素が設定されていない、もしくはマニフェスト自体がついていないことになり、 結果的に仮想化が行われることになる。 ちなみに、一般ユーザー権限での動作を想定していて且つ仮想化が行われない設定値 (正確には、そのプロセスを作成した親プロセスのプロセストークンを継承するだけで昇格の要求が発生しない)は、asInvoker。 メモ帳とかもrequestedExecutionLevelにasInvokerが指定されたマニフェストがついているので仮想化が発生しない。 ちなみに、マニフェスト自体はVistaより前からあった機能。

■ マニフェストの操作

実行ファイルにマニフェストを埋め込むには、mt.exe(Manifest Tool)と言うツールを使用する。 MSDNライブラリでのmt.exeの説明は英語しかないし、内容も薄いんだけど、簡単な使用方法は以下のような感じになる。

■ 上記参考サイトのUACBlogの内容について

上記参考サイトの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の項目に説明がある。

■ プログラムを行う上でのUACに関する考慮事項

▲画面上へ