If you decide to go with a custom plugin, your code might look like this:
var rights = AccessRights.ReadAccess | AccessRights.WriteAccess;
var principalAccess = new PrincipalAccess
{
AccessMask = rights,
Principal = sharingTarget.Key
};
var grantAcessRequest = new GrantAccessRequest();
grantAcessRequest.PrincipalAccess = principalAccess;
var entityReference = new EntityReference(localContext.PluginExecutionContext.PrimaryEntityName,
localContext.PluginExecutionContext.PrimaryEntityId);
grantAcessRequest.Target = entityReference;
localContext.OrganizationService.Execute(grantAcessRequest);
source
share