1

.NET プラットフォームの DirectorySecurity 名前空間 (GetAccessRules() など) のメソッドは、私の目的には遅すぎます。代わりに、NTFS $Secure メタファイル (または、代わりに $SDS ストリーム) を直接クエリして、各ファイル システム オブジェクトのローカル アカウントとそれに関連付けられたアクセス許可のリストを取得したいと考えています。

私の計画は、最初に $MFT メタファイルを読み取り (方法は既に理解しています)、次に、その中の各エントリについて、メタファイル (またはストリーム) 内の適切なセキュリティ記述子を検索することです。

理想的なコード ブロックは次のようになります。

//I've already successfully written code for MFTReader:
var mftReader = new MFTReader(driveToAnalyze, RetrieveMode.All);
IEnumerable<INode> nodes = mftReader.GetNodes(driveToAnalyze.Name);

foreach (NodeWrapper node in nodes)
{
    //Now I wish to return security information for each file system object
    //WITHOUT needing to traverse the directory tree.
    //This is where I need help:
    var securityInfo = GetSecurityInfoFromMetafile(node.FullName, node.SecurityID);
    yield return Tuple.Create(node.FullName, securityInfo.PrincipalName, DecodeAccessMask(securityInfo.AccessMask));
}

そして、出力を次のようにしたいと思います。

c:\Folder1\File1.txt    jane_smith  Read, Write, Execute
c:\Folder1\File1.txt    bill_jones  Read, Execute
c:\Folder1\File2.txt    john_brown  Full Control
etc.

Windows 10 で .NET バージョン 4.7.1 を実行しています。

4

3 に答える 3

0

FSCTL_QUERY_FILE_LAYOUT を使用していますか? 私が見つけたこの関数の使用方法の唯一の実際のソースは次のとおりです

彼は次のようなセキュリティ記述子で問題を解決しているようです。基本的に、ファイルに関するすべての情報を MFT から取得しますが、セキュリティ記述子は取得しません。それらについて、彼は MFT からフィールド SecurityId を取得し、この ID から ACL へのマッピングが既にあるかどうかをハッシュ テーブルで調べます。持っている場合はそれを返し、そうでない場合は NtQuerySecurityObject を使用してハッシュ テーブルにキャッシュします。これにより、コールの量が大幅に削減されるはずです。これは、セキュリティ記述子がほとんどなく、SecurityID フィールドが記述子の単一のインスタンス化を正しく表していることを前提としています。

于 2020-06-01T10:40:08.123 に答える