共有の特定のサブフォルダーの 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);
}
}