Criando um EventHandler que altere as permissões do próprio item do SharePoint
Eu pensei que fosse mais simples. Até parece simples, mas quando vc dá o BreakRoleInheritance o SharePoint exige que se tenha uma permissão maior. Assim, se um usuário comum tentar usar, não funciona.Uma solução óbvia para isto é usar o Runwithelevated que também não funciona. Porque ele eleva o privilégio autorizando a execução desta tarefa. Mas, como está num EventHandler, o seu contexto já está fixado no próprio usuário. Então, o BreakRoleInheritance com o Runwithelevated retiraria a permissão para a execução do próprio evento. Então não funciona.
Se tentar, terá o seguinte erro:
"Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
ou melhor
Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) at Microsoft.SharePoint.SPGlobal.HandleUnauthorizedAccessException(UnauthorizedAccessException ex) at Microsoft.SharePoint.Library.SPRequest.UpdateRoleAssignment(String bstrUrl, Guid& pguidScopeId, Int32 lPrincipalID, Object& pvarArrIdRolesToAdd, Object& pvarArrIdRolesToRemove) at Microsoft.SharePoint.SPRoleAssignmentCollection.UpdateAssignment(Int32 principalId, SPRoleDefinitionBindingCollection bindings, Boolean addOnly) at Microsoft.SharePoint.SPRoleAssignmentCollection.Add(SPRoleAssignment roleAssignment) at MYDLL.MYDLLHandler.ItemAdded(SPItemEventProperties properties)
Para resolver esta questão, tem que fazer algumas coisas.
O evento possui o properties que possui o ListItem, etc. Você deve ignorar isto e criar um novo ListItem, em um novo contexto. E esta criação deve estar com privilegio elevado.
Após isto, a função BreakRoleInheritance também deve estar com contexto elevado. Veja um exemplo a seguir:
public override void ItemAdded(SPItemEventProperties properties)
{
base.ItemAdded(properties);
SPSecurity.RunWithElevatedPrivileges(delegate()
{
Guid MywebGuid = properties.Web.ID;
Guid MysiteGuid = properties.Site.ID;
this.Web = new SPSite(MysiteGuid).OpenWeb(MywebGuid);
this.ListItem = Web.Lists[properties.ListId].GetItemById(properties.ListItemId);
this.CurrentUserId = properties.CurrentUserId;
ListItem.BreakRoleInheritance(false);
});
}
Nenhum comentário:
Postar um comentário