2009-01-19 6 views
5

Estoy tratando de programar el acceso de escritura a la cuenta ASPNET en un directorio. Estoy utilizando el siguiente código para hacer esto: (Tenga en cuenta que quiero que el "acceso de escritura permitida" para ASPNET se propaguen a los objetos secundarios, así:Establecimiento de derechos de acceso para un directorio - recepción de excepción "No se pueden establecer indicadores"

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); 
      } 

Este código está dando lugar a la excepción: " No hay banderas se pueden establecer \ r \ nParameter nombre:. inheritanceFlags"

Qué podría estar mal

Respuesta

9

Tienes la solución, al parecer, tendría que hacerlo de esta manera:?

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); 
+0

Parece que establecer indicadores de herencia no funciona a menos que se use un objeto FileSecurity existente? Esto no hace que las pruebas sean más fáciles. – wesm

2

Como usted señala, el problema original era que estaba usando la clase FileSecurity (que se aplica a archivos, no directorios) y que intenta establecer la ACL para un directorio, pero esto también puede ocurrir por cualquiera de los siguientes motivos:

  1. al establecer una regla para un directorio , se especifica InheritanceFlags.None como el indicador de herencia, pero el suministro de cualquier valor distinto de PropagationFlags.None de la bandera de propagación (no se puede propagar la herencia que no existe) .
  2. Al establecer una regla para un archivo, especifique un valor distinto de InheritanceFlags.None y PropragationFlags.None para los respectivos parámetros (archivos no son contenedores, por lo que la herencia no se puede especificar).

Puede ver las comprobaciones relevantes que hace .NET Framework en el source for the CheckFlags method.

Cuestiones relacionadas