Kei_Watanabeの日記: Windowsフォルダへの書き込みが反映されない? 7
恥を忍んで申し上げますと、弊社製品はいまだにC:\Windowsの直下にフォルダと設定ファイルを配置しています。
Windows95時代の化石のような構成を引きずっており、またユーザー数が極めて限られていて、皆様がサーバー(またはVM)を丸一台弊社製品のためだけに使うという条件を呑んでくださっているためです。
しかし、そんなやり方がいつまでも通用するわけがありません。
ある日、私は怪奇現象を目撃しました。Windows 7での出来事です。
C:\Windows\(myProduct)\以下にテキストファイルを配置して、ここに設定を書くのですが
1. メモ帳を「管理者として実行」して設定ファイルを修正
2. 弊社アプリを実行すると、修正前のパラメータで動作している
3. もう一度メモ帳で開くと、修正後の値になっている
4. コマンドプロンプトでtypeさせると、修正前の値になっている
5. 再起動させてみたが、3,4 の状態は変わらず、アプリは2の動作になる
結局、当該設定ファイルは\Windowsの外に配置できるように、アプリの一部を直して対処したのですが、UACに警告を受けることは当然として、なぜファイルが先祖がえりを起こすのかについては未解明のまま放置されることになりました。
そして私も少しは知恵を付けました。
答えは「VirtualStore」でした。
確かVista以降に付いたもので、Program FilesやWindowsなどの重要なフォルダにファイルを保存しようとするお行儀の悪いアプリについては、
C:\Users\(user)\AppData\Local\VirtualStore\Windows\(myApp)\......
といったフォルダに実際の書き込みを行い、アプリには要望通りのファイルにアクセスしたように見せかける、とても泥縄チックだけど賢い技術です。
かつて問題を起こしたVMのVirtualStoreを覗いてみると…ありました。うちのアプリの設定ファイルが。
メモ帳に対してはWindows以下にあるファイルが修正できたように応答し、ほかのアプリには従来の内容を返していた、ということではないかと勝手に解釈しています。
Roaming では? (スコア:2)
C:\Windows 以下にファイルを作成しようとすると
ユーザーフォルダ\AppData\Roaming\Microsoft\Windows
以下に作成されちゃうってやつでは?
管理者権限持ってても管理者のユーザーフォルダに格納されちゃいます。
typeコマンド (スコア:1)
4. コマンドプロンプトでtypeさせると、修正前の値になっている
これが不可解ですね。
typeコマンドは実ファイルの内容を表示するはずです。
Re:typeコマンド (スコア:1)
う、ここは記憶の揮発かもしれません^^;
管理者ユーザ (スコア:0)
管理者ユーザで起動したコマンドプロンプトを開いて
そこから「notepad ファイル名」でやると、また動作が変わるかも?
Re:管理者ユーザ (スコア:1)
タスクマネージャーの『表示』→『列の選択...』で『ユーザー アカウント制御 (UAC) の仮想化』にチェックを入れると、実行中のプロセスについて UAC の仮想化の有効/無効が確認できます。
ファイルに書き込もうとするとなるのかな? (スコア:0)
http://piro.sakura.ne.jp/latest/blosxom/topics/2010-07-29_virtualstore.htm [sakura.ne.jp]
Re:ファイルに書き込もうとするとなるのかな? (スコア:1)
これはより詳細なレポートですね、まさしく前車の轍。
もうすこし知恵がつきました。