Показать сообщение отдельно
Старый 13.02.2020, 17:20   #1  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
377 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
Angry Имперсонализация в кастомных шагах WF
CRM 2016
Пишу кастомный шаг WF (точнее для Action), который кой чего запрашивает из CRM.
Фишка в том, что у пользователя нет доступа к той сущности, к которой должен обращаться шаг, поэтому я пытаюсь выполнить запрос от имени системного пользователя, т.е. получаю экземпляр Organization Service вот так:
Код:
var factory = context.GetExtension<IOrganizationServiceFactory>();
var service = factory.CreateOrganizationService(null);
И ожидаю, что код будет выполняться от пользователя SYSTEM (ну собственно как об этом написано в описании к методу CreateOrganizationService:
Цитата:
// 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);
}
Тоесть получается, что пареданный в метод CreateOrganizationService пользователь никакого значения не имеет и ни на что не влияет

Собственно вопрос... Это я дурак или лыжи не едут - это косяк реализации workflow или я что-то не так делаю?
__________________
Моё: Cайт - Код - Dynamics365 Tools