Обход защиты Field Level Security в плагине
Если плагин выполняется на стадии Pre и изменяет объект Target, который является входными для основной стадии работы плагина, то не имеет значения, есть ли у пользователя, который инициировал работу плагина, права на изменение защищенного поля — плагин все равно будет в состоянии изменить значение поля в объекта Target и «скормить» его основной стадии. Также не имеет значения контекст, в котором плагин был зарегистрирован.
В следующем примере происходит изменение значение поля new_sec в объекте «Target». При этом для поля new_sec была включена безопасность на уровне полей, а плагин был выполнен пользователем, который не имел права на изменение этого поля.
using System; using System.Diagnostics; using System.Linq; using System.ServiceModel; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using Microsoft.Xrm.Sdk.Messages; namespace protected1 { public class MyPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { try { IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); Entity entity = (Entity)context.InputParameters["Target"]; entity["new_sec"] = "1234"; } catch (FaultException<OrganizationServiceFault> ex) { throw new InvalidPluginExecutionException("Ошибка: ", ex); } } } }