Share Records in D365 CRM by Code

Introduction: This blog details steps how to share entity record in D365 CRM by Code.

Scenario:  We have client requirement to share record with multiple set of Users in D365 CRM based on criteria selected by User on Form and needed to be automated.

Implementation Step:

Below code to be developed for OnCreate of record.

  1. Create new method ShareRecords
    private static void ShareRecords(IOrganizationService service, Entity entity, Entity segmentUser) {
     var CreatedReference = new EntityReference("systemuser", segmentUser.Id);
     var grantAccessRequest = new GrantAccessRequest {
      PrincipalAccess = new PrincipalAccess {
       AccessMask = AccessRights.ReadAccess | AccessRights.WriteAccess | AccessRights.AppendToAccess,
       Principal = CreatedReference
      },
      Target = new EntityReference(entity.LogicalName, entity.Id)
     };
     service.Execute(grantAccessRequest);
    }
    

 

  1. Retrieve User List of Users and execute ShareRecords method
    EntityCollection segmentUsers = service.RetrieveMultiple(new FetchExpression(fetchXMLUsers));
    foreach(Entity segmentUser in segmentUsers.Entities) {
     ShareRecords(service, entity, segmentUser);
    }
    

Below code to be developed for OnUpdate of record.

  1. Create new method UnShareRecords
    private static void UnShareRecords(IOrganizationService service, Entity entity, Entity segmentUser) {
     var CreatedReference = new EntityReference("systemuser", segmentUser.Id);
     var revokeUserAccessReq = new RevokeAccessRequest {
      Revokee = CreatedReference,
      Target = entity.ToEntityReference()
     };
     service.Execute(revokeUserAccessReq);
    }
    

 

  1. Retrieve existing shared Users and remove there Access
    private static void RetrieveSharedUsers(IOrganizationService service, EntityReference entityRef)
    {
     var accessRequest = new RetrieveSharedPrincipalsAndAccessRequest
     {
      Target = entityRef
     };
     var accessResponse = (RetrieveSharedPrincipalsAndAccessResponse) service.Execute(accessRequest);
     foreach(PrincipalAccess principalAccess in accessResponse.PrincipalAccesses)
     {
      EntityReference prAcc = principalAccess.Principal;
      Entity entity = new Entity(entityRef.LogicalName, entityRef.Id);
      Entity segmentUser = new Entity(prAcc.LogicalName, prAcc.Id);
      UnShareRecords(service, entity, segmentUser);
     }
    }
    

Implement code for ShareRecords explained in step 1 & step 2.

 

Conclusion: Hope this blog helps you to to share and unshare records by code in D365 CRM based on custom criteria data on record dynamically.


Share Story :

Secured By miniOrange