5

ユーザーの %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呼び出しは失敗し、次のようerrnoに設定されEACCESます。

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

これは単純なアクセス許可の問題であると想定していましたが、(1) エクスプローラーで手動でディレクトリを作成でき、アクセス許可の問題は発生せず、(2) でプロジェクトにコピーするとまったく同じコードが正常に機能します。自体。

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

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

アップデート

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

4

1 に答える 1

0

Windows には、セキュリティ コンテキストを変更するためのさまざまな (そして大規模な) 関数セットがあります。一部はこちらをご覧ください。

そのコードを含むプロジェクトがセキュリティ コンテキストを変更している可能性がありますか? ImpersonateAnonymousToken()プログラムがパブリックアクセスサーバーとして実行されている場合、たとえば、を呼び出すと予想されます。

于 2012-04-22T11:40:12.917 に答える