Como criar um EventHandler que altera as permissões do próprio item

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