Установка прав доступа к каталогу - получение исключения "Невозможно установить флаги"

Я пытаюсь progamrtaiclly разрешить доступ на запись к учетной записи ASPNET в каталоге. Для этого я использую следующий код: (Обратите внимание, что я хочу, чтобы "доступ на запись разрешен" для ASPNET также распространялся на дочерние объекты:

static void Main(string[] args)
            {


                FileSecurity fileSecurity;

                fileSecurity = new FileSecurity();

                fileSecurity.SetAccessRuleProtection(true, false);

                fileSecurity.AddAccessRule(new FileSystemAccessRule("ASPNET",FileSystemRights.Write,InheritanceFlags.ObjectInherit|InheritanceFlags.ContainerInherit,PropagationFlags.InheritOnly,AccessControlType.Allow));                                   

                File.SetAccessControl("C:\\TestDir1", fileSecurity);
            }

Этот код приводит к исключению: "Флаги не могут быть установлены.\ R \n Параметр имени: inheritanceFlags"

Что может быть не так?

2 ответа

Решение

Получил решение, по-видимому, я должен был бы сделать это следующим образом:

DirectoryInfo dirInfo = new DirectoryInfo("C:\\TestDir2");
            DirectorySecurity dirSecurity = dirInfo.GetAccessControl();

            dirSecurity.AddAccessRule(new FileSystemAccessRule("ASPNET", FileSystemRights.Write|FileSystemRights.DeleteSubdirectoriesAndFiles, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));


            dirInfo.SetAccessControl(dirSecurity); 

Как вы указали, исходная проблема заключалась в том, что вы использовали FileSecurity class (который применяется к файлам, а не к каталогам) и пытается установить ACL для каталога, но это также может произойти по любой из следующих причин:

  1. При настройке правила для каталога вы указываетеInheritanceFlags.None как флаг наследования, но укажите любое значение, кроме PropagationFlags.None для флага распространения (вы не можете распространять наследование, которое не существует).
  2. При настройке правила для файла укажите любое значение, кромеInheritanceFlags.None а также PropragationFlags.None для соответствующих параметров (файлы не являются контейнерами, и поэтому наследование не может быть указано).

Вы можете увидеть соответствующие проверки, которые выполняет.NET Framework в источнике для метода CheckFlags.

Другие вопросы по тегам