1

System.Security.AccessControl.FileSystemAccessRule継承されたものが実際にどこから継承されたかをC#/.NETで判断することは可能ですか? もしそうなら、どうすればいいですか?継承された ACE がどのオブジェクトに関連付けられているかを確認できる、Windows セキュリティ プロパティのような出力を作成したいと考えています。

4

1 に答える 1

2

ルールが発生した場所を見つけるには、ファイルまたはフォルダーのパスをたどる必要があります。以下は、すべてのアクセス ルールとその発信元を表示する関数の大まかなセットです。これを簡単に変更して、より便利な API を作成できます (つまり、コンソールに出力するだけではありません)。

void PrintAccessRules(string path)
{   
    var security = File.GetAccessControl(path);

    var accessRules = security.GetAccessRules(true, true, typeof(NTAccount));


    foreach (var rule in accessRules.Cast<FileSystemAccessRule>())
    {
        if (!rule.IsInherited)
        {
            Console.WriteLine("{0} {1} to {2} was set on {3}.", rule.AccessControlType, rule.FileSystemRights, rule.IdentityReference, path);
            continue;
        }

        FindInheritedFrom(rule, Directory.GetParent(path).FullName);
    }
}

void FindInheritedFrom(FileSystemAccessRule rule, string path)
{
    var security = File.GetAccessControl(path);
    var accessRules = security.GetAccessRules(true, true, typeof(NTAccount));

    var matching = accessRules.OfType<FileSystemAccessRule>()
        .FirstOrDefault(r => r.AccessControlType == rule.AccessControlType && r.FileSystemRights == rule.FileSystemRights && r.IdentityReference == rule.IdentityReference);

    if (matching != null)
    {
        if (matching.IsInherited) FindInheritedFrom(rule, Directory.GetParent(path).FullName);
        else Console.WriteLine("{0} {1} to {2} is inherited from {3}", rule.AccessControlType, rule.FileSystemRights, rule.IdentityReference, path);
    }
}

例えば:

PrintAccessRules(@"C:\projects\mg\lib\repositories.config");

私のために以下を印刷します:

Allow FullControl to SkipTyler\Mike was set on C:\projects\mg\lib\repositories.config.
Allow ReadAndExecute, Synchronize to SkipTyler\Mike is inherited from C:\projects\mg
Allow FullControl to BUILTIN\Administrators is inherited from C:\
Allow FullControl to NT AUTHORITY\SYSTEM is inherited from C:\
Allow ReadAndExecute, Synchronize to BUILTIN\Users is inherited from C:\
于 2012-05-13T13:57:46.597 に答える