2012-04-22 7 views
5

ユーザーの%APPDATA%ディレクトリ内に設定ディレクトリを作成する必要があるアプリケーションがあります。しかしアプリケーションは%APPDATA%に書き込めませんが(ユーザーは可能です)

std::string appDataBase = getenv("APPDATA"); 
std::string appDir = appDataBase + "\\MyDir"; 

std::cerr << "About to invoke _mkdir(" << appDir << ")" << std::endl; 
int rv = _mkdir(appDir.c_str()); 
std::cerr << "_mkdir returned " << rv << ", errno = " << errno << std::endl; 

、このコードが実行されるとき、_mkdir呼び出しが失敗し、errnoEACCESに設定されている:私が想定しているだろう

About to invoke _mkdir(C:\Users\mdm\AppData\Roaming\MyDir) 
_mkdir returned -1, errno = 13 

はこれはこれを行うには、次のようなコードを使用しています(1)アクセス権の問題なしでエクスプローラでディレクトリを手動で作成でき、(2)プロジェクトに単独でコピーすると、まったく同じコードが正常に動作するという点を除いて、単純なアクセス権の問題です。

私はこの問題に関する情報を幅広く検索しましたが、エクスプローラを使用してこのフォルダにアクセス/書き込みできないなど、一般的なアクセス許可の問題に関するディスカッションを見つけることができます。私のアプリケーション内のコードは、管理者として実行するとうまくいくので、その権限で何か奇妙なことが起こっていることは明らかですが、他に何を調べるべきかわかりません。私はプロセスエクスプローラで検査し、%APPDATA%ディレクトリへの完全な書き込み権限を持つユーザーアカウントでアプリケーションが実行されていることを確認し、%APPDATA%ツリーが非表示または読み取り専用に設定されていないことを確認しました。

Windowsアプリケーションで設定できる "有効なユーザーID"または "有効なアクセス許可"はありますか?これはビルド構成やプロセスの初期化に依存しますか?ある特定のアプリケーションが%APPDATA%に書き込むのを妨げる他の要因はありますか?

更新

さらなる調査は、挙動の違いは、コードの内容が、ファイルシステム内の実行可能の位置に関連していないことがわかります。私のアプリケーションは、ユーザディレクトリのDevelopmentフォルダ内のソースツリーから構築されており、_mkdir呼び出しはこのディレクトリ内の実行ファイルで失敗します。ただし、.exeファイルを新しいディレクトリC:\Developmentにコピーすると、正常に動作することができます(既存のDevelopmentディレクトリは移動しません)。シンプルなテストプログラムはDocuments\Visual Studio\Projectsの中にあり、これも満足のいく場所と思われます。

+0

「プロジェクトにコピーすれば、まったく同じコードが正常に動作します」 - おそらく周辺のコードで面白いことをやっているでしょう。しかし、実際に何を推測することはできません。 – Mat

+0

@Mat:それは私の推測でもあります。残念ながら私はWindows上での開発経験がほとんどないので、周囲のコードで何を探すべきか分かりません。 –

+0

デバッグの手段として、プロセスモニタ(MS Webサイトを検索)を使用して、システムが実際に作成しようとしているパスとファイルシステムが返すエラーコードを再確認してください。リダイレクトは何らかの形で起こっているかもしれませんが、私はそれがなぜここに当てはまるのか理解できません。 –

答えて

0

Windowsには、セキュリティコンテキストを変更するためのさまざまな(そして大きな)一連の機能があります。一部についてはhereを参照してください。

おそらく、そのコードを含むプロジェクトがセキュリティコンテキストを変更していますか?プログラムが公共アクセスサーバーとして実行されている場合、私はそれが例えばImpersonateAnonymousToken()を呼び出すと期待しています。

関連する問題