Вы получите отдельные записи правил для унаследованных правил и для правил, которые явно установлены в этой папке. Существует также разница в зависимости от настроек распространения для каждого правила. Например, у вас может быть один набор разрешений, которые установлены для распространения на подпапки, и другой набор для файлов в папке. Ваш код также получает правила аудита (SACL) для папки, в которой вы, похоже, просто хотите получить права доступа (DACL).
Попробуйте это:
protected void directoryInfo()
{
var di = new DirectoryInfo(Server.MapPath("/"));
foreach (DirectoryInfo dir in di.GetDirectories())
{
Response.Write(dir.FullName + "<br/>");
DirectorySecurity ds = dir.GetAccessControl(AccessControlSections.Access);
foreach (FileSystemAccessRule fsar in ds.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
{
string userName = fsar.IdentityReference.Value;
string userRights = fsar.FileSystemRights.ToString();
string userAccessType = fsar.AccessControlType.ToString();
string ruleSource = fsar.IsInherited ? "Inherited" : "Explicit";
string rulePropagation = fsar.PropagationFlags.ToString();
string ruleInheritance = fsar.InheritanceFlags.ToString();
Response.Write(userName + " : " + userAccessType + " : " + userRights + " : " + ruleSource + " : " + rulePropagation + " : " + ruleInheritance + "<br/>");
}
}
}
Разрешение ReadAndExecute
, которое вы видите, включает в себя разрешение "Список содержимого папки". Вы можете проверить отдельные разрешения, используя соответствующий флаг в перечислении FileSystemRights. Например:
if (fsar.FileSystemRights && FileSystemRights.ListDirectory)
Console.WriteLine("Has List Directory permission");