Sharing
using Microsoft.Crm.Sdk.Messages; public static void ShareRecord(IOrganizationService OrganizationService, string entityName, Guid recordId, Guid UserId) { EntityReference recordRef = new EntityReference(entityName, recordId); EntityReference User = new EntityReference(SystemUser.EntityLogicalName, UserId); //If its a team, Principal should be supplied with the team //EntityReference Team = new EntityReference(Team.EntityLogicalName, teamId); GrantAccessRequest grantAccessRequest = new GrantAccessRequest { PrincipalAccess = new PrincipalAccess { AccessMask = AccessRights.ReadAccess | AccessRights.WriteAccess | AccessRights.AppendToAccess | AccessRights., Principal = User //Principal = Team }, Target = recordRef }; OrganizationService.Execute(grantAccessRequest); }
Its great that VS intellisense would help you identify which Access Right you can set.
Retrieve user who has been shared with
public static void RetrieveSharedUsers(IOrganizationService OrganizationService, EntityReference entityRef) { var accessRequest = new RetrieveSharedPrincipalsAndAccessRequest { Target = entityRef }; var accessResponse = (RetrieveSharedPrincipalsAndAccessResponse)OrganizationService.Execute(accessRequest); foreach (var principalAccess in accessResponse.PrincipalAccesses) { // principalAccess.Principal.Id - User Id } }
Revoke the Share (UnShare)
public static void RevokeShareRecord(IOrganizationService OrganizationService, string TargetEntityName, Guid TargetId, Guid UserId) { EntityReference target = new EntityReference(TargetEntityName, TargetId); EntityReference User = new EntityReference(SystemUser.EntityLogicalName, UserId); RevokeAccessRequest revokeAccessRequest = new RevokeAccessRequest { Revokee = User, Target = target }; OrganizationService.Execute(revokeAccessRequest); }