ファイル/フォルダを特定のパスに書き込むことができるかどうかを示す関数をコーディングしたいと思います。私は実際にディスクにファイルを書き込むことなくそれをしたいと思います。そのためのWINAPI機能はありますか? ありがとうございます。ファイルシステムの制限を取得する
答えて
GetFileSecurity()とAccessCheck()機能を使用できます。 Aaron Ballmanの記事How to Check Access Rightsを読んでください。彼はCanAccessFolder()
機能をあなたが尋ねたことをするために提供しました。
ありがとうございます。それは私が探していたものです! –
function CheckFileAccess(const FileName: string; const CheckedAccess: Cardinal): Cardinal;
var Token: THandle;
Status: LongBool;
Access: Cardinal;
SecDescSize: Cardinal;
PrivSetSize: Cardinal;
PrivSet: PRIVILEGE_SET;
Mapping: GENERIC_MAPPING;
SecDesc: PSECURITY_DESCRIPTOR;
begin
Result := 0;
GetFileSecurity(PChar(Filename), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, nil, 0, SecDescSize);
SecDesc := GetMemory(SecDescSize);
if GetFileSecurity(PChar(Filename), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, SecDesc, SecDescSize, SecDescSize) then
begin
ImpersonateSelf(SecurityImpersonation);
OpenThreadToken(GetCurrentThread, TOKEN_QUERY, False, Token);
if Token <> 0 then
begin
Mapping.GenericRead := FILE_GENERIC_READ;
Mapping.GenericWrite := FILE_GENERIC_WRITE;
Mapping.GenericExecute := FILE_GENERIC_EXECUTE;
Mapping.GenericAll := FILE_ALL_ACCESS;
MapGenericMask(Access, Mapping);
PrivSetSize := SizeOf(PrivSet);
AccessCheck(SecDesc, Token, CheckedAccess, Mapping, PrivSet, PrivSetSize, Access, Status);
CloseHandle(Token);
if Status then
Result := Access;
end;
end;
FreeMem(SecDesc, SecDescSize);
end;
は、あなたはこのように使用します。 場合(CheckFileAccess(SysteemGegevens.DFImportPath、FILE_ALL_ACCESS)<> FILE_ALL_ACCESS)
const
FILE_READ_DATA = $0001;
FILE_WRITE_DATA = $0002;
FILE_APPEND_DATA = $0004;
FILE_READ_EA = $0008;
FILE_WRITE_EA = $0010;
FILE_EXECUTE = $0020;
FILE_READ_ATTRIBUTES = $0080;
FILE_WRITE_ATTRIBUTES = $0100;
FILE_GENERIC_READ = (STANDARD_RIGHTS_READ or FILE_READ_DATA or
FILE_READ_ATTRIBUTES or FILE_READ_EA or SYNCHRONIZE);
FILE_GENERIC_WRITE = (STANDARD_RIGHTS_WRITE or FILE_WRITE_DATA or
FILE_WRITE_ATTRIBUTES or FILE_WRITE_EA or FILE_APPEND_DATA or SYNCHRONIZE);
FILE_GENERIC_EXECUTE = (STANDARD_RIGHTS_EXECUTE or FILE_READ_ATTRIBUTES or
FILE_EXECUTE or SYNCHRONIZE);
FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $1FF;
この関数が何をしているのか、入力パラメータは何か、そして結果は何ですか? Btw。Windows API関数呼び出しの結果を確認する必要があります。 – TLama
これは、上記の答えから、移植されたCanAccessFolder関数のようです。 –
TLama:申し訳ありませんが、追加されました。ベンジャミン:私は知らないだろう、私たちのコードベースからそれをつかんだ –
- 1. Javaのファイルシステムでサポートされている最大inode制限を取得する方法は?
- 2. bashを使ってファイルシステムのディレクトリ制限をテストする方法
- 3. OpenStreetMapからスピード制限を取得
- 4. 制限付きセットを取得中にレコードの総数を取得する - Oracle
- 5. バックエンドエラーおよび取得活動制限
- 6. Node.js HTTP取得URL長制限
- 7. Jenaを使用したクラスのOWL制限を取得する
- 8. Umbraco 5で無制限のFAQの入力を取得する
- 9. Facebookのビデオアップロード制限を取得するには
- 10. Androidで最大OpenGL ES 2.0のテクスチャサイズ制限を取得する
- 11. Salesforce Daily Apiリクエストの制限を取得する
- 12. ファイルシステム内でファイルストリームコンテナのデータを削除することを制限する
- 13. Twitterレート制限、認証、oauthでフォロワーを取得する方法
- 14. コンテナに使用できるDockerファイルシステムの容量を制限する方法
- 15. fopen()はファイルシステムによって制限されていますか?
- 16. Azure Webアプリケーションに画像を保存する。ファイルシステムの制限とパフォーマンス
- 17. デフォルトの制限よりも多くのFacebookブックを取得
- 18. 年齢制限付きページのページ情報を取得
- 19. 2列から値による制限の行を取得する方法
- 20. Solaris/Unix上のファイルシステムのinode数を取得する方法は?
- 21. ファイルシステム内の画像の寸法を取得する
- 22. API制限なしですべてのTwitterフォロワーを取得する方法
- 23. ユーザの機能使用制限を取得するFlexLMサーバの照会
- 24. 大容量ファイルシステムのファイルリストを効率的に取得する
- 25. ローカルストレージにデータの格納を制限して取得する方法は?
- 26. より高い電子メールの送信制限を取得するオプション
- 27. googleカスタム検索apiから無制限のクエリを取得する方法
- 28. タブコントロールのCSS権限を取得する
- 29. Rails:どこにも制限なしで関係を取得する
- 30. YouTube API - すべての動画をユーザー制限から取得しますか?
それを行います単一の機能はありませんと、その後
。セキュリティAPIをナビゲートすることができれば、事前にこれを確認することができます。これまでに の場所に書き込むことができるかどうかを確認する最も簡単な方法は、そうしようとすることです。 –
私はこのような状況にも対処しました。最初に私はACL権限のチェックに基づいて解決しましたが、まもなく、実際にGetTempFileName APIを使用して一時ファイルを実際に試して作成することが唯一の信頼できる方法であることに気づきました。 – kobik
さて、私はCD-ROMを挿入し、あなたのプログラムはACLをチェックします。あなたはファイルを作成する権利が与えられますが、メディアはそれをサポートしていません。ライトプロテクトされたフロッピー、SDカードなどの場合も同様です。ACLだけでは不十分です。より良い試み。エラーが発生したときに生きているゴミを恐れている場合は、Windowsのフラグを自動的にファイルを閉じるように設定します。 –