ファイル/フォルダを特定のパスに書き込むことができるかどうかを示す関数をコーディングしたいと思います。私は実際にディスクにファイルを書き込むことなくそれをしたいと思います。そのための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. EWS - 制限ポリシーを取得する
- 2. エムページのパーサーのファイルシステムからのイメージのドラッグアンドドロップを制限する
- 3. 制限行数peewee取得
- 4. bashを使ってファイルシステムのディレクトリ制限をテストする方法
- 5. Javaのファイルシステムでサポートされている最大inode制限を取得する方法は?
- 6. パラメータの制限なしで無制限の引数を取得する方法
- 7. ラウンドツイッターAPIの制限を取得
- 8. OpenStreetMapからスピード制限を取得
- 9. 制限付きセットを取得中にレコードの総数を取得する - Oracle
- 10. ファイルシステム内でファイルストリームコンテナのデータを削除することを制限する
- 11. Jenaを使用したクラスのOWL制限を取得する
- 12. マーカーの座標を取得し、値を制限するGoogleマップ
- 13. Umbraco 5で無制限のFAQの入力を取得する
- 14. 他のサイトから無制限のコンテンツを取得する
- 15. バックエンドエラーおよび取得活動制限
- 16. Node.js HTTP取得URL長制限
- 17. Facebookのビデオアップロード制限を取得するには
- 18. Docusign APIサンドボックスの制限を取得する
- 19. 過去の行制限を取得する
- 20. Androidで最大OpenGL ES 2.0のテクスチャサイズ制限を取得する
- 21. instagram api:ユーザー情報とレートの制限を取得する
- 22. Salesforce Daily Apiリクエストの制限を取得する
- 23. Okta APIからパスワードの制限を取得する方法は?
- 24. 'find'クエリのmongo dbドキュメントサイズ制限を取得するには?
- 25. コンテナに使用できるDockerファイルシステムの容量を制限する方法
- 26. fopen()はファイルシステムによって制限されていますか?
- 27. Azure Webアプリケーションに画像を保存する。ファイルシステムの制限とパフォーマンス
- 28. ajaxリクエストで制限付きレコードを取得する方法
- 29. Twitterレート制限、認証、oauthでフォロワーを取得する方法
- 30. BigQueryのグループ制限を制限する
それを行います単一の機能はありませんと、その後
。セキュリティAPIをナビゲートすることができれば、事前にこれを確認することができます。これまでに の場所に書き込むことができるかどうかを確認する最も簡単な方法は、そうしようとすることです。 –
私はこのような状況にも対処しました。最初に私はACL権限のチェックに基づいて解決しましたが、まもなく、実際にGetTempFileName APIを使用して一時ファイルを実際に試して作成することが唯一の信頼できる方法であることに気づきました。 – kobik
さて、私はCD-ROMを挿入し、あなたのプログラムはACLをチェックします。あなたはファイルを作成する権利が与えられますが、メディアはそれをサポートしていません。ライトプロテクトされたフロッピー、SDカードなどの場合も同様です。ACLだけでは不十分です。より良い試み。エラーが発生したときに生きているゴミを恐れている場合は、Windowsのフラグを自動的にファイルを閉じるように設定します。 –