2

共有の特定のサブフォルダーの ACL から、特定のアカウント ("Everyone" トラスティまたはすべてのフォルダーへのアクセスを許可しているグローバル グループなど) を削除する必要があります。DirectorySecurity オブジェクトを取得し、AuthorizationRuleCollection を取得してループし、問題の AccessRule を ACL から削除してから、SetAccessControl を呼び出して変更を適用します。ターゲット フォルダーが小さい場合はすべて正常に機能しますが、子フォルダーとファイルが多数ある場合は、変更を適用するのに時間がかかります (手動で行うよりもはるかに時間がかかります)。ターゲット フォルダーの ACL のみを処理したい。.net DirectorySecurity クラスを使用してこれを行う方法はありますか? または、Win32 API またはその他のソリューションに頼る必要がありますか? ありがとう。

コードのスニペットを次に示します。dirInfo.SetAccessControl(dirSec) への呼び出しは、フォルダーのサイズが非常に大きい場合にハングする場所です。

DirectoryInfo dirInfo = new DirectoryInfo(path);
DirectorySecurity dirSec = dirInfo.GetAccessControl();
AuthorizationRuleCollection acl = dirSec.GetAccessRules(true, true,     
                                  typeof(System.Security.Principal.NTAccount));
foreach (FileSystemAccessRule ace in acl)
{
    if (groupsToRemove.Contains(ace.IdentityReference.Value))
    {
        dirSec.RemoveAccessRuleSpecific(ace);
        dirInfo.SetAccessControl(dirSec);
    }
}
4

2 に答える 2

2
DirectoryInfo dirInfo = new DirectoryInfo(path);
DirectorySecurity dirSec = dirInfo.GetAccessControl();
AuthorizationRuleCollection acl = dirSec.GetAccessRules(true, true,     
                                  typeof(System.Security.Principal.NTAccount));
foreach (FileSystemAccessRule ace in acl)
{
    if (groupsToRemove.Contains(ace.IdentityReference.Value))
    {
        dirSec.RemoveAccessRuleSpecific(ace);
        dirInfo.SetAccessControl(dirSec);
    }
}

コードでは、ループの反復ごとに ACL に更新を適用しているため、非常にコストがかかります。dirInfo.SetAccessControl(dirSec);の外に移動しようとしましたforeachか? これにより、オブジェクトのSetAccessControlメソッドが1 回呼び出され、次のようにすべての変更が 1 回のパスで適用されます。DirectoryInfo

foreach (FileSystemAccessRule ace in acl)
{
    if (groupsToRemove.Contains(ace.IdentityReference.Value))
    {
        dirSec.RemoveAccessRuleSpecific(ace);        
    }
}
dirInfo.SetAccessControl(dirSec);
于 2012-03-10T21:03:23.760 に答える
1

「親コンテナのDACLに設定されたACE、およびディレクトリ階層内の親コンテナより上のオブジェクトがオブジェクトDACLに適用されないようにする」には、 SE_DACL_PROTECTEDフラグを設定する必要があります。これにより、すべての子オブジェクトを適用する必要がなくなるため、操作が高速化される可能性があります。また、MSDNから、

SE_DACL_PROTECTEDを設定するにはSE_DACL_PRESENTフラグが存在する必要があり、SE_SACL_PROTECTEDを設定するにはSE_SACL_PRESENTが存在する必要があることに注意してください。

次に、 IADsSecurityDescriptor.Controlプロパティを使用して、DACLとSACLがオブジェクトによってその親コン​​テナから継承されるかどうかを制御する必要があります。

IADsSecurityDescriptorインターフェイスの詳細については、MSDNを参照してください。

于 2011-07-20T19:21:55.743 に答える