- 締切済み
WinVista UACが有効なのにProgramFilesにアクセスできてしまう
こんにちは。 WindowsVista Home Premium SP2 Visual C++ 2008 Express Edition 上記の環境で作成したアプリで、不可解な事があるので質問させていただきます。 現在、C:\Program Filesの下の同一フォルダにインストールされている2つのプログラム間で、ファイルを介してデータのやり取りを行おうと考えております。 簡略化のため、最小限のファイル構成のみ書かせていただきます。 C:\Program Files + TargetApp ←インストール先フォルダ + TargetApp.exe ←データのやり取りの相手 + MyApp.exe ←私が作ったアプリ + Test.ini ←データ受け渡しをするファイル さて、ここでProgram Files\Test.iniをアプリからアクセスすると、通常ですとVistaのUAC機能により、本物のTest.iniにはアクセスできず、代わりにVirtualStore内の同名ファイルに飛ばされてしまう、という理解を私は現在しております。 たとえVirtualStoreに飛ばされても、2つのアプリがお互いに飛ばされれば、結果的に同じファイルをアクセスできるものと思っておりました。 ところが、やってみますと、私の作ったMyAppは、Program Files内の本物のTest.iniに直にアクセスしてしまうようなのです。 試しに、Program Files内とVirtualStore内のTest.iniの内容を、以下のように違うものにして、簡単なテストプログラム(TestApp.exe)を走らせてみました。 [Program Files\TargetApp\Test.ini] This File is in 'Program Files' [VirtualStore\Program Files\TargetApp\Test.ini] This File is in 'VirturlStore' [TestProgram] // Tabは全角スペースに置き換えています #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; int cc; if(argc < 2){ printf("ファイルを指定してください。\n"); return -1; } if(fopen_s(&fp, argv[1], "r")){ printf("ファイルが開けません。\n"); return -1; } while((cc = fgetc(fp)) != EOF){ printf("%c", cc); } fclose(fp); return 0; } テストプログラムを実行 >TestApp "C:\Program Files\TargetApp\Test.ini" This File is in 'Program Files' このように、本物が見えてしまいます。 なお、テキストエディタでこのファイルを開くと、VirtualStoreの内容が見えますので、うっかりUACがOFFになっている等はないと思います。 Vistaの基本的な知識が抜けているだけだとは思うのですが。。。 VirtualStoreの残像拳の方にアクセスできるよう、ご教示を頂ければと思います。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- zwi
- ベストアンサー率56% (730/1282)
Vistaでは、アプリを管理者権限で動かすとProgram Fileの下を直接参照できます。なので、どうしてもVirtualStore側を参照したい場合は一般権限で動かしてください。 ちなみに、#1の回答者の言われるとおりそもそも管理者権限や一般権限で参照場所が変わるアプリはお行儀が悪いので、SHGetFolderPath()でLOCAL_APPDATAを取得してこのパスの下に自分のアプリ用のフォルダを作ってデータを収めるのが良いかと思いますが。
- chie65536(@chie65535)
- ベストアンサー率44% (8753/19861)
http://dsas.blog.klab.org/archives/51108671.html#programfiles に ---------------- C:\Program Files フォルダ配下にプログラムの実行ファイルを配置することは一般的ですが、更新を前提とするデータファイル(.ini ファイル等)を配置すべきではありません。 ---------------- と書かれています。 なので、 C:\Program Files + TargetApp ←インストール先フォルダ + TargetApp.exe ←これはOK。 + MyApp.exe ←これはOK。 + Test.ini ←これはNG。 この位置にTest.iniを配置してはいけません。 ここに配置してはいけない理由は「UACを有効にした時と、UACを無効にした時で、プログラムがアクセスしに行くファイルが変わってしまい、一意の決まった動作が保証されない」からです。 つまり「UACがオンでもオフでも、どっちでも正しく動かなくてはならない」ので、ここにiniファイルを置いてはならないのです。 従って「C:\Program Files配下のiniファイルを使って情報の受け渡しをする事そのものが許されない」です。 情報の受け渡しは、環境変数を使うとか、環境変数に「専用のフォルダの位置」を設定し、環境変数を介して目的のフォルダ位置とファイル名を求めるなど「C:\Program Files配下のファイルに依存しない形」で行う必要があります。 結論は「iniファイルをそこに置くのは推奨されないから、やっちゃ駄目」って事です。 なお、質問者さんのケースのように「%PROGRAMFILES%を使わない」とか「SHGetFolderPath関数を使わない」など「生で、C:\Program Files\~~と書いてしまっている、お行儀の悪いプログラムに対しては、UACは責任を持たない」です。 なので「生で、C:\Program Files\~~と書いた場合」にはVirtualStoreにはアクセスしません。
お礼
ご回答ありがとうございます。 丁寧なご回答を頂いたのに、申し訳ありません。 実は、質問してからさらにググっていたら、自己解決してしまいました。 プロジェクトのプロパティ →リンカ →マニフェストファイル →UACを有効にする ↑これを「いいえ」にすると、VirtualStoreにアクセスできました。 運用的にダメなのは私も承知の上なのですが、そういう仕様で決められちゃった以上、進めなければいけないのが悲しい宮仕えでして・・・。 あと、すみません。 お行儀の悪いプログラムにこそ、UACは責任もってちゃんと仕事をするべきだと思うのですが・・・。 そういうものなのでしょうか。
お礼
ご回答ありがとうございます。 いえいえ、一般権限で動かしているのにアクセスできてしまうので、困っていたのです。 お行儀は、私も悪いと思います・・・。 結果的に、#1さんの所に書いたように自己解決いたしました。 申し訳ありません。