スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Program Files内の設定ファイルに何をしようとも書き込めなかった件

Windowsでの話。
インストール用exe『無し』のアプリケーションで、自分でProgram Files (x86)にフォルダを作成してアプリケーションを入れてみたけど、どんなことしてもそのアプリの設定ファイルが書き込めなかった。
ただし、別のファイルは普通に書き込める。

例えば、aaaというフォルダをCドライブのProgram Files (x86)に新しく作って、その中にアプリケーションを移したとする。

C:
¥Program Files (x86)
¥aaa
bbb.exe
bbb.ini
bbb.ddc

実行ファイルは『bbb.exe』
このような状態で、設定ファイル『bbb.ini』には普通に書き込める。
問題は『bbb.ddc』の方。なぜか全く書き込めない。
書き込めないというか、内容変更して保存し再び開くと保存したときの変更が反映されていない。



原因はWindowsのUACにあった (+自分の勘違いも少々)

ここのページ『Windows Vista,7 & 8のUAC対策について』によると、
WndowsではUAC(ユーザーアカウント制御)の関係上から、

C:¥Users¥ユーザー名¥AppData¥Local¥VirtualStore¥Program Files

64bit版では
C:¥Users¥ユーザー名¥AppData¥Local¥VirtualStore¥Program Files (x86)

に仮想化用のフォルダとして、自動でProgram Files (x86)にあるフォルダと同じ名前のフォルダが生成されて設定ファイルの一部がコピーされるみたい。


上の例だと
C:¥Program Files (x86)¥aaaを作り(ある操作をすると)
C:¥Users¥ユーザー名¥AppData¥Local¥VirtualStore¥Program Files (x86)¥aaaという仮想化のフォルダが勝手にできる。

なので、そこの中にあるbbb.ddcを変更すると
見事、C:¥Program Files (x86)¥aaa内のbbb.ddcもちゃんと変更されている(本当は見た目上だけ)のでした!

パチパチパチパチ~。

アプリケーションbbb.exeの実行時もbbb.ddcの設定がちゃんと反映されています。

でもなんでbbb.iniファイルには書き込めてbbb.ddcには書き込めなかったのかはよく分からなかった。
拡張子に関係があるのか?分からない。
じゃあ、自分で色々と調べてみるか。



UACの仮想化フォルダを調べて分かったこと


●仮想化フォルダが生成される条件

C:¥Program Files (x86)にファイルやフォルダを移動・作成しただけでは仮想化フォルダは生成されない。
生成されるのは、ファイルの一つを操作するするときに、
自分がそのファイルに対して『書き込み権限がない』場合で
かつ、操作を実行するアプリが一般ユーザー権限であるときに(管理者として実行していないときに)、
保存をしようとする
と仮想化フォルダとファイルが生成される。

(例)

1.
 別の場所にあるbbb.ddcなどのファイルが入ったフォルダaaaをC:¥Program Files (x86)に移動させる。
 →移動しただけでは仮想化フォルダは生成されない。


C:¥Program Files (x86)¥aaaで、『bbb.ddc』をエディタなどで変更して保存するとき

2.
 bbb.ddcに対して自分が書き込み権限がある場合
 もしくはエディタを管理者権限で実行中

 →権限があるので仮想化フォルダは生成されない。
  C:¥Program Files (x86)¥aaaのbbb.ddcに保存される。

3.
 bbb.ddcに対して書き込み権限がなくて、
 bbb.ddcを保存しようとしているエディタが一般ユーザーとして実行中。
→C:¥Users¥ユーザー名¥AppData¥Local¥VirtualStore¥Program Files (x86)にaaaフォルダが生成されてbbb.ddcの変更が保存される。
C:¥Program Files (x86)¥aaaのbbb.ddcは変更されない。



※追記:
   書き込み権限の詳細はファイルを右クリック、プロパティ→セキュリティタブを参照のこと。
   あとネットで調べたら*.exe、*.dll、*.sysのファイルは仮想化せずに直接書き込むみたい。
   



●仮想化フォルダが参照されるのは開くアプリケーションの種類にもよる

例として、C:¥Program Files (x86)¥aaa¥bbb.ddc(自分に書き込み権限なし)を開こうとしたときとする。
この場合アプリケーションによって動作が異なる。

1.メモ帳で開く

一般ユーザーとして実行
読み込み: C:¥Program Files (x86)¥aaa¥bbb.ddc を読み込む
書き込み: 書き込み不可、保存できない

管理者として実行
読み込み: C:¥Program Files (x86)¥aaa¥bbb.ddc を読み込む
書き込み: C:¥Program Files (x86)¥aaa¥bbb.ddc に保存


2.サクラエディタで開く

一般ユーザーとして実行
読み込み: C:¥Program Files (x86)¥aaa¥bbb.ddc を読み込む
書き込み: C:¥Program Files (x86)¥aaa¥bbb.ddc に保存

管理者として実行はできなったので不明


3.TeraPad(エディタ)で開く

一般ユーザーとして実行

読み込み:
すでに仮想化のフォルダ
C:¥Users¥ユーザー名¥AppData¥Local¥VirtualStore¥Program Files (x86)¥aaa¥bbb.ddc
が存在する場合:
C:¥Users¥ユーザー名¥AppData¥Local¥VirtualStore¥Program Files (x86)¥aaa¥bbb.ddcを読み込む

仮想化のフォルダが存在しない場合:
C:¥Program Files (x86)¥aaa¥bbb.ddc を読み込む

書き込み:
まだ仮想化のフォルダがない場合には生成して、
C:¥Users¥ユーザー名¥AppData¥Local¥VirtualStore¥Program Files (x86)¥aaa¥bbb.ddc に保存


管理者として実行
読み込み: C:¥Program Files (x86)¥aaa¥bbb.ddc を読み込む
書き込み: C:¥Program Files (x86)¥aaa¥bbb.ddc に保存


4.アプリケーションbbb.exeの実行する
 →TeraPadと同じ読み書きのふる舞いをする


3と4は、仮想化フォルダが生成される条件に従うけど、
1と2ではそれとは異なる振る舞いをした。
仮想化フォルダが生成されてその中のファイルが使われるかはアプリによってまちまちみたい。


つまり↓こんな感じになってるのかなあ。

~ユーザーアカウント制御(UAC)による仮想化のしくみ~

アプリケーションA: C:¥Program Files (x86)に設定ファイルを保存させて
Windows: Program Filesに書き込み権限が無いからダメ。代わりに¥Users¥ユーザー名¥AppData¥Local¥VirtualStore¥Program Files (x86)¥に別のフォルダを作ったからそこに書き込んで

アプリケーションB: アプリケーションAの設定ファイルを見たい
Windows: あなたには書き込み権限があるからC:¥Program Files (x86)のアプリケーションAの設定ファイルを参照してください

アプリケーションC: アプリケーションAの設定ファイルを見せてくれ
Windows: あんたには権限が無いからC:¥Users¥ユーザー名¥AppData¥Local¥VirtualStore¥Program Files (x86)¥の設定ファイルを見て

アプリケーションによって対応が違うというWindows……。
なんか人間社会の縮図を見ているよーな(笑)



今回のまとめ

冒頭に書いた書き込みが元に戻ってしまった件は、仮想フォルダに関連する現象が複雑にからみ合って起きたことなのでした。
管理者としてアプリーケーションを実行すると、保存するときに
ファイルに対して自分の書き込み権限が付け加えられる。
iniファイルが普通に書き込めたのは、前にたまたまエディタかアプリを管理者として実行して
ファイルに書き込み権限が付け加えられたせいだと思う。

冒頭の件の解決策にはもうひとつあって、
C:¥Users¥ユーザー名¥AppData¥Local¥VirtualStore¥Program Files (x86)¥aaaフォルダ
を削除して、C:¥Program Files (x86)¥aaaのbbb.ddcを
管理者として実行したアプリーケーションで変更保存するという方法もあって
そちらでも良かったのかもしれない。自分一人でしか使ってないPCなので。


常に管理者権限でアプリを実行して仮想化フォルダを生成されないようにすればいいと
思う方もいるかもしれないけど、それではUACの意味がなくなってしまう。

それに自分の C:¥Users¥ユーザー名¥AppData¥Local¥VirtualStore¥Program Files (x86)¥
にはすでに10コぐらいのフォルダができてて、それらはエディタなどで設定ファイルをいじっていないものがほとんど。
多分アプリケーション自らが書き込み権限の無いiniファイルに対して変更しようとしたため作られたみたい。
(アプリが自分の設定ファイルに対して書き込めないっつーのはどうなんだ。)


というわけで結論

C:¥Program Filesに自分でフォルダ作ってアプリケーションをインストールするときは、

フォルダ内のファイルに対する自分の書き込み権限に注意する。
アプリケーションの実行権限に注意する。(設定ファイルを操作するときはエディタの実行権限も)
C:¥Users¥ユーザー名¥AppData¥Local¥VirtualStore¥Program Files (x86)に同じ設定ファイルが存在しているか注意する。


もしくは、そもそもC:¥Program Files (x86)にはインストールしない。別のところにフォルダを作る。


ということでした。
WindowsのUACの仕組みは複雑怪奇でいまだよーわからんですな。


CM

ユーザータグ: Windows UAC 仮想化 Program_Files
関連記事
月替わりブログパーツ
プロフィール

Author:Enear

最新記事
Amazonピックアップ
検索フォーム
全記事表示リンク

全ての記事を表示する

カテゴリ
RSSリンク
ブログランキング
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。