2011-05-10 10 views
9

Tengo un código C# que crea una carpeta y establece algunos permisos sobre ella. Aquí está el ejemplo de código:DirectorySecurity no configura correctamente los permisos

static void Main(string[] args){ 

     Directory.CreateDirectory("C:\\vk07"); 
     DirectorySecurity dirSec = Directory.GetAccessControl("C:\\vk07"); 

     dirSec.AddAccessRule(new FileSystemAccessRule("INTRANET\\fGLBChorusUsers", FileSystemRights.ReadAndExecute, AccessControlType.Allow));    
     Directory.SetAccessControl("C:\\vk07", dirSec); 
} 

Cuando compruebo los permisos establecidos en la carpeta creada anteriormente, en lugar de tener leer y modificar (que es lo que he puesto en el código), que muestra sólo "permisos especiales" como verificado

Por favor, ¿alguien me puede ayudar con esto? Soy nuevo en ACL, así que no lo entiendo muy bien.

Respuesta

2

FileSystemRights.ReadAndExecute no le permite modificar. Esto es solo de lectura. Necesitaría FileSystemRights.Modify para todo el rango. Es posible que desee comprobar out para las opciones disponibles.

aquí es un ejemplo de lo anterior:

String dir = @"C:\vk07"; 
Directory.CreateDirectory(dir); 
DirectoryInfo dirInfo = new DirectoryInfo(dir); 
DirectorySecurity dirSec = dirInfo.GetAccessControl(); 
dirSec.AddAccessRule(new FileSystemAccessRule("INTRANET\\fGLBChorusUsers",FileSystemRights.Modify,AccessCo‌ntrolType.Allow)); 
dirInfo.SetAccessControl(dirSec); 
+0

Hola, traté de modificar también. No importa lo que haga, solo puedo ver "Permisos especiales" en esa carpeta. Así que creo que me falta algo aquí. – Vikram

+0

Pruebe el siguiente código 'String dir = @" C: \ vk07 "; Directory.CreateDirectory (dir); DirectoryInfo dirInfo = new DirectoryInfo (dir); DirectorySecurity dirSec = dirInfo.GetAccessControl(); dirSec.AddAccessRule (new FileSystemAccessRule ("INTRANET \\ fGLBChorusUsers", FileSystemRights.Modify, AccessControlType.Allow)); dirInfo.SetAccessControl (dirSec); ' –

+0

Se puede encontrar un buen ejemplo de cómo agregar y eliminar [aquí] (http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.directorysecurity.aspx#Y4947) –

3

también he tenido este problema. Después de ejecutar el siguiente código:

var security = Directory.GetAccessControl(folderPath); 
security.AddAccessRule(
    new FileSystemAccessRule(
     new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null), 
     FileSystemRights.Modify, 
     InheritanceFlags.ObjectInherit, 
     PropagationFlags.InheritOnly, 
     AccessControlType.Allow 
    ) 
); 
Directory.SetAccessControl(folderPath, security); 

... entonces aparecería el diálogo de propiedades de rutaCarpeta de la siguiente manera:

Folder Properties Dialog

Como usted ha mencionado, sólo 'permisos especiales' se comprueba, pero si hace clic en Opciones avanzadas, luego ves:

Advanced Security Settings Dialog

Observe que en este cuadro de diálogo NETWORK SERVICE tiene el permiso de modificación.

Parece que al establecer los permisos de forma programática, Windows no muestra estos permisos en el cuadro de diálogo de propiedades de la carpeta, pero aún existen en la configuración de seguridad avanzada. También confirmé que mi servicio de Windows (que se ejecuta como SERVICIO DE RED) podía acceder a los archivos dentro de la carpeta Path.

+2

Tuve exactamente el mismo problema y descubrí que siguiendo la sugerencia de Alexander V. y el uso de PropagationFlags.None lo corrigió – PlantationGator

9

Estaba teniendo el mismo problema. El motivo real es que si mira esa imagen del servicio de red desde la otra publicación, solo se aplica a los archivos. Los permisos básicos solo se mostrarán en la primera imagen si dicen "Esta carpeta, subcarpetas y archivos". Para hacer esto, debe establecer los dos indicadores -InheritanceFlags.ContainerInherit + InheritanceFlags.ObjectInherit.

Try 
     'If destination directory does not exist, create it first. 
     If Not Directory.Exists(path) Then Directory.CreateDirectory(path) 

     Dim dir As New DirectoryInfo(path) 
     Dim dirsec As DirectorySecurity = dir.GetAccessControl() 
     'Remove inherited permissions 
     dirsec.SetAccessRuleProtection(True, False) 

     'create rights, include subfolder and files to be inherited by this 
     Dim Modify As New FileSystemAccessRule(username, FileSystemRights.Modify, InheritanceFlags.ContainerInherit + InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow) 
     Dim Full As New FileSystemAccessRule(admingroup, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit + InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow) 

     dirsec.AddAccessRule(Modify) 
     dirsec.AddAccessRule(Full) 
     'Set 
     dir.SetAccessControl(dirsec) 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
+0

Se preguntó por C#? – as9876

3

Este código funciona para mí:

security.AddAccessRule(
    new FileSystemAccessRule(
     "domain\\login", 
     FileSystemRights.Modify, 
     InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
     PropagationFlags.None, 
     AccessControlType.Allow 
    )); 
0

que tiene el mismo código para trabajar en VB, estableciendo FileSystemRights.FullControl.

 Dim fsRule As FileSystemAccessRule = New FileSystemAccessRule(sid, FileSystemRights.FullControl, (InheritanceFlags.ContainerInherit + InheritanceFlags.ObjectInherit), PropagationFlags.None, AccessControlType.Allow) 
Cuestiones relacionadas