2009-09-11 19 views
6

He estado teniendo problemas para asignar permisos de forma programada a las entradas de carpetas/registro. He conseguido asignar permisos heredar usando el siguiente código:C# - Windows ACL - Aplicación de permisos heredados

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow); 

DirectorySecurity security = new DirectorySecurity(); 
security.SetAccessRule(rule); 

Directory.CreateDirectory(dir); 
Directory.SetAccessControl(dir, security); 

Ajusta correctamente mis permisos de archivo en todas las carpetas secundarias i crear un administrador. Sin embargo, no establece los permisos en la carpeta dir. He jugado con algunas permutaciones de herencia y propogación, pero no tuve ninguna alegría.

Por ejemplo, tengo:

dir = %programfiles%\Test 

Si he creado una carpeta en la prueba (%programfiles%\Test\SubFolder), que tienen todos los permisos asignados a ella para mi usuario, pero no tengo permisos completos en %programfiles%\Test. Esto es realmente molesto, ya que me gustaría otorgarle a mi usuario permisos completos para hacer lo que sea con el directorio de prueba también.

Tengo problemas similares con los permisos de registro, pero creo que si puedo resolver uno, puedo resolver los dos problemas pendientes.

¿Alguien sabe cómo se puede resolver esto?

Regards
Tris

+0

subcarpeta es un objeto secundario de la prueba por lo que hereda reglas de prueba , no de la otra manera. ¿Has intentado crear la ACL en la prueba? –

Respuesta

14

Para la carpeta:

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME, 
    FileSystemRights.FullControl, AccessControlType.Allow); 

Para subcarpetas y archivos:

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME, 
    FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | 
    InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, 
    AccessControlType.Allow); 

ambas líneas deben estar en su proyecto. luego, aparece una lista que se aplica a esta carpeta, subcarpetas y archivos

+0

bueno, gracias! –

7

No soy un experto aquí, pero después de tener que resolver esto para mis propios fines, creo que la respuesta de Dave, aunque funcional, es demasiado complicada. Usted debe ser capaz de lograr esto con una sola regla:

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME, 
    FileSystemRights.FullControl, 
    InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
    PropagationFlags.None, 
    AccessControlType.Allow); 

El parámetro PropagationFlags.InheritOnly utilizado por el PO en su código original es lo que impide que la regla de acceso de la aplicación al objeto mismo.

Además, es posible así establecer la seguridad del directorio que va a crear, ya que .NET proporciona una sobrecarga para ese fin:

Directory.CreateDirectory(dir, security);