Установка прав доступа к каталогу - получение исключения "Невозможно установить флаги"
Я пытаюсь 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 для каталога, но это также может произойти по любой из следующих причин:
- При настройке правила для каталога вы указываете
InheritanceFlags.None
как флаг наследования, но укажите любое значение, кромеPropagationFlags.None
для флага распространения (вы не можете распространять наследование, которое не существует). - При настройке правила для файла укажите любое значение, кроме
InheritanceFlags.None
а такжеPropragationFlags.None
для соответствующих параметров (файлы не являются контейнерами, и поэтому наследование не может быть указано).
Вы можете увидеть соответствующие проверки, которые выполняет.NET Framework в источнике для метода CheckFlags.