13.02.2020, 17:20 | #1 |
Участник
|
Имперсонализация в кастомных шагах WF
CRM 2016
Пишу кастомный шаг WF (точнее для Action), который кой чего запрашивает из CRM. Фишка в том, что у пользователя нет доступа к той сущности, к которой должен обращаться шаг, поэтому я пытаюсь выполнить запрос от имени системного пользователя, т.е. получаю экземпляр Organization Service вот так: Код: var factory = context.GetExtension<IOrganizationServiceFactory>(); var service = factory.CreateOrganizationService(null); Цитата:
// Parameters:
// userId: // Type: Nullable<Guid>. Specifies the system user that calls to the service are // made for. // When called in a plug-in, a null value indicates the SYSTEM user and a Guid.Empty // value indicates the same user as Microsoft.Xrm.Sdk.IPluginExecutionContext. Microsoft.Xrm.Sdk.IExecutionContext.UserId. // Any other value indicates a specific system user. // When called in a custom workflow activity, all service calls are made in the // IWorkflowExecutionContext.Microsoft.Xrm.Sdk.IExecutionContext.UserId context. Пробовал использовать значения переменных UserId и InitiatingUserId из контекста, но на выходе получаю одну и ту же ошибку, из которой понятно, что при любом раскладе сервис работает от одного и того же пользователя. Я полез в библиотеку Microsoft.Crm.Workflow.dll и нашел там реализацию метода CreateOrganizationService: Код: IOrganizationService IOrganizationServiceFactory.CreateOrganizationService(Guid? userId) { return this.CreateSdkService(false); } public override IOrganizationService CreateSdkService(bool asAdminUser) { return this._sdkService.CreateInstance(asAdminUser, this.ProxyTypesAssembly); } Собственно вопрос... Это я дурак или лыжи не едут - это косяк реализации workflow или я что-то не так делаю? |
|
13.02.2020, 17:33 | #2 |
Чайный пьяница
|
Все у вас с лыжами в порядке. Попытался найти, но сейчас не смог - в SDK было описано именно то, что вы озвучили - в кастомных экшенах при получении инстанса сервиса параметр который вы передаете игнорируется и сервис всегда выполняется с правами пользователя его инициировавшего. Отсюда у вас 2 варианта:
1. Если у вас RealTime WorkFlow, то просто поменяйте настройку - выполнять от имени владельца процесса. 2. Если 1 не выполним, то выход следующий - создаете экшен, на него навешиваете плагин, который будет делать ровно то же, что и должен был делать ваш кастомный шаг бп с одним бонусом - в контесте плагина вы можете имперсонироваться. Удачи.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: ZooY (2). |