C # – Establecer permisos de directorio para todos los usuarios en Windows 7

Este debería ser un problema bastante simple, pero por alguna razón parece que no puedo hacer que esto funcione. Todo lo que me gustaría hacer es establecer los permisos en un directorio determinado para permitir el acceso completo a todos los usuarios. Aquí está el código que tengo hasta ahora:

System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(destinationDirectory); FileSystemAccessRule fsar = new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow); DirectorySecurity ds = null; if (!di.Exists) { System.IO.Directory.CreateDirectory(destinationDirectory); } ds = di.GetAccessControl(); ds.AddAccessRule(fsar); 

No se lanzan excepciones, pero tampoco pasa nada. Cuando verifico los permisos del directorio después de ejecutar el código, no veo cambios.

¿Algunas ideas?

Gracias por adelantado,
Hijo

También debe llamar a SetAccessControl para aplicar los cambios.

 ds = di.GetAccessControl(); ds.AddAccessRule(fsar); di.SetAccessControl(ds); // nothing happens until you do this 

Parece que los ejemplos en MSDN carecen de detalles, como se discutió aquí . Pirateé el código de este artículo para obtener lo siguiente que se comporta bien:

 static bool SetAcl() { FileSystemRights Rights = (FileSystemRights)0; Rights = FileSystemRights.FullControl; // *** Add Access Rule to the actual directory itself FileSystemAccessRule AccessRule = new FileSystemAccessRule("Users", Rights, InheritanceFlags.None, PropagationFlags.NoPropagateInherit, AccessControlType.Allow); DirectoryInfo Info = new DirectoryInfo(destinationDirectory); DirectorySecurity Security = Info.GetAccessControl(AccessControlSections.Access); bool Result = false; Security.ModifyAccessRule(AccessControlModification.Set, AccessRule, out Result); if (!Result) return false; // *** Always allow objects to inherit on a directory InheritanceFlags iFlags = InheritanceFlags.ObjectInherit; iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; // *** Add Access rule for the inheritance AccessRule = new FileSystemAccessRule("Users", Rights, iFlags, PropagationFlags.InheritOnly, AccessControlType.Allow); Result = false; Security.ModifyAccessRule(AccessControlModification.Add, AccessRule, out Result); if (!Result) return false; Info.SetAccessControl(Security); return true; } 

La respuesta de David Heffernan no funciona en un equipo que no está en inglés, donde se produce un error al tratar de establecer los permisos en “Usuarios” con una excepción IdentityNotMapped . El siguiente código funcionará en todas partes, utilizando WellKnownSidType.BuiltinUsersSid lugar:

 static void SetFullControlPermissionsToEveryone(string path) { const FileSystemRights rights = FileSystemRights.FullControl; var allUsers = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null); // Add Access Rule to the actual directory itself var accessRule = new FileSystemAccessRule( allUsers, rights, InheritanceFlags.None, PropagationFlags.NoPropagateInherit, AccessControlType.Allow); var info = new DirectoryInfo(path); var security = info.GetAccessControl(AccessControlSections.Access); bool result; security.ModifyAccessRule(AccessControlModification.Set, accessRule, out result); if (!result) { throw new InvalidOperationException("Failed to give full-control permission to all users for path " + path); } // add inheritance var inheritedAccessRule = new FileSystemAccessRule( allUsers, rights, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow); bool inheritedResult; security.ModifyAccessRule(AccessControlModification.Add, inheritedAccessRule, out inheritedResult); if (!inheritedResult) { throw new InvalidOperationException("Failed to give full-control permission inheritance to all users for " + path); } info.SetAccessControl(security); }