2012-09-10 29 views
5

Estaba tratando de otorgar permisos NTFS en una ruta UNC para un usuario específico, pero veo un comportamiento diferente dependiendo de la ruta UNC. A continuación se muestra el código (de MSDN), que estoy usando para dar permisos y el resultado en cada escenario,Permisos heredados perdidos al dar permisos NTFS

static void GiveNTFSPermissions(string folderPath, 
           string ntAccountName, 
           FileSystemRights accessRights) 
{ 
    DirectorySecurity dirSecurity = Directory.GetAccessControl(folderPath); 

    FileSystemAccessRule newAccessRule = 
     new FileSystemAccessRule(
       ntAccountName, 
       accessRights, 
       AccessControlType.Allow); 

    dirSecurity.AddAccessRule(newAccessRule); 

    Directory.SetAccessControl(folderPath, dirSecurity); 
} 

Supongamos que tengo un recurso llamado “RootShare” en mi máquina local, y otra carpeta “InsideRootShare "dentro de él.

Escenario 1: Cuando llamo,

GiveNTFSPermissions(@"\\sri-devpc\RootShare", 
        @"domain\username", 
        FileSystemRights.Write); 

Los permisos heredados se perdieron en el camino compartido,

Scenario2: Cuando llamo,

GiveNTFSPermissions(@"\\sri-devpc\RootShare\InsideRootShare", 
        @"domain\username", 
        FileSystemRights.Write); 

Los permisos heredados estaban intactos.

He intentado con diferentes constructores de FileSystemAccessRule pero no tuve suerte.

¿Cuál es la razón detrás de este comportamiento y cualquier solución para esto?

+0

¿Has probado el [constructor] (http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesystemaccessrule.aspx) que toma 'InheritanceFlags' como argumento? Además, 'AddNTFSPermission' es un nombre más razonable que' GiveNTFSPermissions', ya que intenta * agregar * una nueva regla de acceso a las reglas de acceso existentes. – Nawaz

+0

Consulte este tema: http://stackoverflow.com/questions/243995/setting-folder-permissions-on-vista – Nawaz

+0

@Nawaz: He intentado todos los constructores, y tengo el mismo resultado. Gracias por la sugerencia :) – sri

Respuesta

4

Nos encontramos con problemas similares al trabajar con el permiso del sistema de archivos mientras trabajábamos en el módulo de seguridad de Dropkick. La solución que se nos ocurrió es la siguiente. Esto establecerá permisos con éxito en cualquier carpeta sin cambiar las reglas de herencia en la carpeta.

public void SetFileSystemRights(string target, string group, FileSystemRights permission) 
    { 
     if (!IsDirectory(target) && !IsFile(target)) 
      return; 

     var oldSecurity = Directory.GetAccessControl(target); 
     var newSecurity = new DirectorySecurity(); 

     newSecurity.SetSecurityDescriptorBinaryForm(oldSecurity.GetSecurityDescriptorBinaryForm()); 

     var accessRule = new FileSystemAccessRule(group, 
                permission, 
                InheritanceFlags.None, 
                PropagationFlags.NoPropagateInherit, 
                AccessControlType.Allow); 
     bool result; 
     newSecurity.ModifyAccessRule(AccessControlModification.Set, accessRule, out result); 

     if (!result) Log.AddError("Something wrong happened"); 

     accessRule = new FileSystemAccessRule(group, 
               permission, 
               InheritanceFlags.ContainerInherit | 
               InheritanceFlags.ObjectInherit, 
               PropagationFlags.InheritOnly, 
               AccessControlType.Allow); 

     result = false; 
     newSecurity.ModifyAccessRule(AccessControlModification.Add, accessRule, out result); 
     if (!result) Log.AddError("Something wrong happened"); 

     Directory.SetAccessControl(target, newSecurity); 

     if (result) Log.AddGood("Permissions set for '{0}' on folder '{1}'", group, target); 

     if (!result) Log.AddError("Something wrong happened"); 
    } 

Encontrado the link that I originally used to figure this out.