Дублирующиеся записи GetAccessRules, FileSystemAccessRule - PullRequest
10 голосов
/ 18 августа 2010

Я получаю дубликат FileSystemAccessRule из этого кода ниже:

C:\inetpub\wwwroot\AspInfo\Account
BUILTIN\IIS_IUSRS : Allow : ReadAndExecute, Synchronize
BUILTIN\IIS_IUSRS : Allow : -1610612736
NT SERVICE\TrustedInstaller : Allow : FullControl
NT SERVICE\TrustedInstaller : Allow : 268435456

и я не могу понять, что или почему.

И отображаемые разрешения не соответствуют тому, что я вижу в свойствах файла FileManager. Например, как найти разрешение «Список содержимого папки» из этой или аналогичной итерации. Если кто-нибудь знает пример в документации .NET, это будет полезно.

protected void directoryInfo()
{
  var di = new DirectoryInfo(Server.MapPath("/"));
  foreach (DirectoryInfo dir in di.GetDirectories())
  {
    Response.Write(dir.FullName + "<br/>");
    DirectorySecurity ds = dir.GetAccessControl();
    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();
      Response.Write(userName + " : " + userAccessType + " : " + userRights + "<br/>");
    }
  }
}

1 Ответ

14 голосов
/ 18 августа 2010

Вы получите отдельные записи правил для унаследованных правил и для правил, которые явно установлены в этой папке. Существует также разница в зависимости от настроек распространения для каждого правила. Например, у вас может быть один набор разрешений, которые установлены для распространения на подпапки, и другой набор для файлов в папке. Ваш код также получает правила аудита (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");
...