Share record with multiple users programatically in CRM 2013

Here is the code for sharing record with multiple users in single shot. It’s simple but effective.

private void MultiShare(IOrganizationService service)
{

//Initializes a new instance of the OrganizationRequestCollection class
OrganizationRequestCollection orgReqCollection = new OrganizationRequestCollection();
string[] userId=new string[4];
userId[0] = “B6CD6291-103F-E411-A66F-A4BADB09B4C2”;
userId[1] = “F9245526-4F42-E411-9DD5-00505696000A”;
userId[2] = “4CE84620-4F42-E411-9DD5-00505696000A”;
userId[3] = “51DD0950-8E78-E311-86B2-A4BADB09B4C2”;

foreach (string s in userId)
{
EntityReference TargetEntity = new EntityReference(“opportunity”, new Guid(“9F260320-E255-E411-93F3-00505696011C”));
EntityReference TargetShare=new EntityReference(“systemuser”,new Guid(s));

//Call the CreateCollection function to prepare the OrganizationRequestCollection class object

orgReqCollection = CreateCollection(TargetEntity, TargetShare, orgReqCollection );
}
// Intialize ExecuteMultipleRequest

ExecuteMultipleRequest executeMutlipleRequest = new ExecuteMultipleRequest();
executeMutlipleRequest.Requests = orgReqCollection;
executeMutlipleRequest.Settings = new ExecuteMultipleSettings();

// ContinueOnError – specifies whether to continue in case of error in any of the request or not
executeMutlipleRequest.Settings.ContinueOnError = false;

// ReturnResponses – specifies whether to return responses for the requests or not
executeMutlipleRequest.Settings.ReturnResponses = true;

ExecuteMultipleResponse executeMulResponse = (ExecuteMultipleResponse)service.Execute(executeMutlipleRequest);

}

//To share the record

private OrganizationRequestCollection CreateCollection(EntityReference TargetEntity, EntityReference TargetShare, OrganizationRequestCollection orgReqCollection )
{
GrantAccessRequest grant = new GrantAccessRequest();
grant.Target = new EntityReference(TargetEntity.LogicalName, TargetEntity.Id);

PrincipalAccess principal = new PrincipalAccess();
principal.Principal = new EntityReference(TargetShare.LogicalName, TargetShare.Id);
principal.AccessMask = AccessRights.ReadAccess | AccessRights.AppendAccess | AccessRights.WriteAccess | AccessRights.AppendToAccess | AccessRights.ShareAccess | AccessRights.AssignAccess;
grant.PrincipalAccess = principal;

orgReqCollection.Add(grant);

return orgReqCollection;
}

This is the way you can share record with multiple user without executing multiple requests each time.

Namaste 🙂

Megh

Leave a comment