フォルダへの書き出し

じゃあ、そのフォルダへの書き出しはどうなってんの??って話ですよ。VistaTest.txtという名前のテキストファイルをそれぞれのフォルダに書き出してみました。書き出し内容はシステム時刻、成否の判定はエラーの有無です。

  • Xp
列挙体 Administrator PowerUser User
ApplicationData
CommonApplicationData
CommonProgramFiles ×
Cookies
Desktop
DesktopDirectory
Favorites
History
InternetCache
LocalApplicationData
MyMusic
MyPictures
Personal
ProgramFiles ×
Programs
Recent
SendTo
StartMenu
Startup
System ×
Templates
GetTempPath関数
列挙体 管理者権限あり 管理者権限無し
ApplicationData
CommonApplicationData
CommonProgramFiles
Cookies
Desktop
DesktopDirectory
Favorites
History
InternetCache
LocalApplicationData
MyMusic
MyPictures
Personal
ProgramFiles
Programs
Recent
SendTo
StartMenu
Startup
System
Templates
GetTempPath関数

VistaはあっさりオールOKですね。んー、なんだか拍子抜け。しかもこれじゃ管理者権限有り無しの違いが無い感じですねぇ。・・・とこれで終わるわけも無く。
今度はファイル名をVistaTest.dllにして書き出してみます。内容はさっきと同じです。

  • Xp
    • VistaTest.txtの時と同じ
  • Vista
列挙体 管理者権限あり 管理者権限無し
ApplicationData
CommonApplicationData
CommonProgramFiles ×
Cookies
Desktop
DesktopDirectory
Favorites
History
InternetCache
LocalApplicationData
MyMusic
MyPictures
Personal
ProgramFiles ×
Programs
Recent
SendTo
StartMenu
Startup
System ×
Templates
GetTempPath関数

管理者権限が無い場合CommonProgramFiles、ProgramFiles、Systemの3つで失敗しました。さっきはちゃんと書けたのになぜでしょう。

この3つのフォルダは特殊で一般ユーザーのシステムファイル(*.dll、*.sys等)の操作を許しません。しかもシステムファイル以外も先の検証で上手くいったように見えますが厳密に言うと成功していないことになります。というのは、この3つのフォルダは「[USER]\VirtualStore」フォルダの下にリダイレクトされます。*1つまり一般ユーザーでProgramFilesフォルダにVistaTest.txtを出力した場合は[USER]\VirtualStore\ProgramFiles\VistaTest.txtに書き出すことになります。しかも読み取りはVirtualStoreフォルダ配下を優先で探し無ければ元フォルダを探します。なのでファイル出力がからむ動作検証の時、エラーは発生しないけど書き出したはずのファイルが無いとか、設定ファイルは正しいのにさっぱりDBに繋がらないなんて勘違いしちゃう可能性があるんですねぇ。現にしちゃってる人を知っていますw 気をつけないといけませんねぇ。この仕組みさえ知っていればVista対応はそんなに難しいことじゃないんじゃないかと思っています。

*1:ちなみにレジストリも一部このような仕組みがあるようですが自分の業務には関係の無い部分なので検証はしていません。