2012-04-10 7 views
6

Escribo una pequeña utilidad en C# para asegurarme de que una carpeta especificada y todos sus contenidos tengan los derechos de acceso adecuados (quiero dar acceso completo al grupo Authenticated Users). El siguiente código parece funcionar adecuadamente para la actualización de ACL de la carpeta de nivel superior (Access Control List):¿Cómo ver si "incluir permisos heredables" está desmarcado para un archivo o carpeta?

SecurityIdentifier allUsers = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null); 
InheritanceFlags iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; 
FileSystemAccessRule newRule = new FileSystemAccessRule(allUsers, 
    FileSystemRights.FullControl, iFlags, 
    PropagationFlags.None, AccessControlType.Allow); 

DirectoryInfo info = new DirectoryInfo(folderPath); 
DirectorySecurity security = info.GetAccessControl(); 
security.AddAccessRule(newRule); 
info.SetAccessControl(security); 

me he dado cuenta, sin embargo, que esta nueva regla de acceso no se propaga a las subcarpetas que tienen el "Incluir permisos heredables ... "opción desmarcada en sus propiedades de seguridad. Eso solo tiene sentido. Entonces, lo que quiero hacer es volver a activar la herencia de permisos de seguridad para esas subcarpetas.

Mi excavación ha descubierto el método ObjectSecurity.SetAccessRuleProtection que debería ser la mitad de lo que necesito. Sin embargo, parece descuidado simplemente usar a ciegas el método anterior en objetos que ya heredan la DACL de sus padres. Por lo tanto, quiero determinar qué objetos tienen desactivada su herencia de permisos, pero parece que no puedo encontrar el método o propiedad correspondiente que devuelve esta información. ¿Hay alguno? ¿Me estoy perdiendo de algo?

+0

¿Por qué importa si una carpeta principal que ya ha establecido? Establecerlo de nuevo no debería causar ningún dolor. –

+0

@ M.Babcock: por razones prácticas, parece innecesario y derrochador forzar una actualización de un archivo o carpeta que no necesita actualización. En mi caso específico, solo hay unas pocas subcarpetas que * no * heredan derechos de acceso, pero hay cientos o incluso miles de archivos dentro de esas mismas carpetas que * do *. Por razones de rendimiento, preferiría actualizar un puñado de estos objetos en lugar de todos. – Jeremy

+1

Aunque no es un duplicado, es el inverso de http://stackoverflow.com/questions/6574196/programatically-removing-include-inheritable-permissions-from-this-objects-par – emd

Respuesta

4

recuerdo usando algo como esto:

también estaba tratando de encontrar un método para comprobar esto, pero no pude encontrar ninguna (incluso en C++). Así que terminé usando el código de arriba. Funcionó a las mil maravillas.

+0

Parece una supervisión de MS no proporcione un método más directo para verificar esto, pero esto es exactamente lo que estaba buscando. :) – Jeremy

+1

Su ejemplo muestra solamente 'si threre es algo heredado' y' no se muestra si la herencia está activada'. Esta es una diferencia cuando la carpeta principal solo propaga derechos a la carpeta principal (y no a subcarpetas o archivos) o cuando el acl está dañado. En ambos casos, obtendrás 'sin herencia incluso cuando esté encendido'. – boboes

1

parece que hay una manera logrado hacer esto:

DirectorySecurity ds = System.IO.Directory.GetAccessControl(@"C:\test"); 
byte[] rawBytes = ds.GetSecurityDescriptorBinaryForm(); 
RawSecurityDescriptor rsd = new RawSecurityDescriptor(rawBytes, 0); 

if ((rsd.ControlFlags & ControlFlags.DiscretionaryAclProtected) == 
         ControlFlags.DiscretionaryAclProtected) 
{ 
    // "Include inheritable permissions from this object's parent" is unchecked 
} 
else 
{ 
    // "Include inheritable permissons from this object's parent" is checked 
} 
Cuestiones relacionadas