1

I am trying to Break Inheritance on a sub folder within a Document Set using the following code. After running the code and examining the Document Set's Sub Folder I can see that it still inherits from the parent. Can anyone see what is wrong here?

using(var site = new SPSite("http://tmtech-sp13b:8080/sites/Doc%20Set%20Test")) {
 // TODO: Replace with current site
 using(var web = site.AllWebs[0]) {
  SPList list = web.Lists["Projects"];

  // Test if list has project document set content type
  if (list.ContentTypes.Cast < SPContentType > ().Any(c => c.Parent.Id == _projContentTypeId)) {

   foreach(SPFolder projfolder in list.RootFolder.SubFolders) {
    if (projfolder.Name.ToLower() != "forms") {
     Console.WriteLine(projfolder.Name);

     // Container to hold the temporary files which are to be deleted.
     List < SPFile > files2Delete = new List < SPFile > ();

     foreach(SPFolder projSubFolder in projfolder.SubFolders) {
      // Set Contractor Permissions
      if (projSubFolder.Name == CONTRACTOR_FOLDER_NAME) {

       SPRoleAssignment roleAssignment = new SPRoleAssignment((SPPrincipal) web.SiteGroups["Contractors"]);

       SPFolder f = web.GetFolder(projSubFolder.Item.Url);
       SPListItem i = f.Item;
       i.BreakRoleInheritance(true);

       roleAssignment.RoleDefinitionBindings.Add(web.RoleDefinitions["Contribute"]);
       i.RoleAssignments.Add(roleAssignment);

       web.AllowUnsafeUpdates = true;
       i.Update();
       web.Update();
       web.AllowUnsafeUpdates = false;
      }

      // Capture the temporary files
      foreach(SPFile file in projSubFolder.Files) {
       if (file.Name.ToLower().Contains("temporary document delete me")) {
        files2Delete.Add(file);
       }
      }
     }

     // Delete Temporary Files
     foreach(SPFile f in files2Delete) {
      f.Delete();
      f.ParentFolder.Update();
     }
    }
   }
  }
 }
}

2 Answers 2

0

You'll want to use i.BreakRoleInheritance(false) on this one, instead of true.

From this: https://social.technet.microsoft.com/forums/sharepoint/en-US/313effab-a5af-4fda-b39c-37f620fe95f2/itembreakroleinheritancetrue-vs-itembreakroleinheritancefalse

"

When you call SPItem.BreakRoleInheritance(true), you are assigning the list item with unique permissions, while copying existing permissions on the list to the item. Any new permissions added to the item are only applied to the item.

When you call SPItem.BreakRoleInheritance(false), you are assigning the list item with unique permissions. Existing permissions on the list are NOT copied to the list item. Any new permissions added to the item are only applied to the item.

"

0

Your code should work from what I can see, haven't tested it. But you use i.BreakRoleInheritance(true); , meaning it will copy all the permissions it has before breaking the inheritance (from the parent). Are you sure it does not say "This folder has unique permissions." when you check the permission of the SubFolders in the GUI?

2
  • 1
    Actually the Ribbon menus were confusing me. I was not looking at the permissions on the folder but the library. I had to select the Folder then "Share With" | "Advanced" to see that my code was working correctly.
    – ChiliYago
    Feb 25, 2014 at 18:20
  • 2
    Yeah, one could discuss if all the changes to the user interface in 2013 is to the better for the users :) Feb 26, 2014 at 7:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.