BreakRoleInheritance(true) não tem efeito no Conjunto de Documentos Sub Pastas
-
10-12-2019 - |
Pergunta
Eu estou tentando Quebrar a Herança de uma sub-pasta dentro de um Conjunto de Documentos usando o seguinte código.Depois de executar o código e examinar o Conjunto de Documentos da Pasta de Sub-rotina, eu posso ver que ele ainda herda do pai.Qualquer pessoa pode ver o que está errado aqui?
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();
}
}
}
}
}
}
Solução
Você vai querer usar eu.BreakRoleInheritance(falso) sobre este, em vez de verdade.
"
Quando você chamar SPItem.BreakRoleInheritance(verdadeiro), o que você está atribuindo o item de lista com permissões exclusivas, ao copiar as permissões existentes na lista para o item.Qualquer novo permissões adicionadas ao item são aplicadas apenas para o item.
Quando você chamar SPItem.BreakRoleInheritance(falso), você está atribuindo o item de lista com permissões exclusivas.Permissões existentes na lista NÃO são copiados para o item da lista.Qualquer novo permissões adicionadas ao item são aplicadas apenas para o item.
"
Outras dicas
Seu código deve trabalhar a partir do que eu posso ver, ainda não testei.Mas você usa i.BreakRoleInheritance(true);
ou seja , cópia de todas as permissões que ele tem antes de dividir a herança (do pai).Tem certeza de que não dizer "Esta pasta tem permissões exclusivas." quando você verificar a permissão do Subpastas na GUI?