Олицетворение не работает в Microsoft Dynamics CRM - всегда используется пользователь SYSTEM - PullRequest
0 голосов
/ 12 февраля 2019

Я расследую олицетворение в сервисе организации Microsoft Dynamics CRM 2016 / Dynamics 365 и обнаружил, что код всегда выполняется от имени системного пользователя (SYSTEM).

Я создал плагин, который должен выполнять запросыот имени разных пользователей:

  • системный пользователь (SYSTEM)
  • пользователь по умолчанию
  • пользователь, указанный в инструменте регистрации плагинов
  • пользователь, инициирующийrequest

Но код всегда выполняется от имени системного пользователя (SYSTEM).

Я пытался не только отобразить исключение, но и создать записи - они такжесоздан от имени системного пользователя (SYSTEM).

public class GetUsers : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
        var factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));

        var result = "";

        var service1 = factory.CreateOrganizationService(null);
        result += $"null = {GetUserInfo(service1)}";

        var service2 = factory.CreateOrganizationService(Guid.Empty);
        result += $"Guid.Empty ({Guid.Empty}) = {GetUserInfo(service2)}";

        var service3 = factory.CreateOrganizationService(context.UserId);
        result += $"UserId ({context.UserId}) = {GetUserInfo(service3)}";

        var service4 = factory.CreateOrganizationService(context.InitiatingUserId);
        result += $"InitiatingUserId ({context.InitiatingUserId}) = {GetUserInfo(service4)}";

        throw new InvalidPluginExecutionException(result);
    }

    private static string GetUserInfo(IOrganizationService service)
    {
        var request = new WhoAmIRequest();
        var response = (WhoAmIResponse)service.Execute(request);
        var userId = response.UserId;
        var user = service.Retrieve("systemuser", userId, new ColumnSet("fullname"));
        var data = $"{userId} | {user.GetAttributeValue<string>("fullname")}{Environment.NewLine}";
        return data;
    }
}

Я получаю такой результат:

null = 34248a5f-bf3e-4f3c-95c2-882424d25d37 | SYSTEM
Guid.Empty (00000000-0000-0000-0000-000000000000) = 34248a5f-bf3e-4f3c-95c2-882424d25d37 | SYSTEM
UserId (0a889533-cf85-e811-a21b-d47c6ef71c14) = 34248a5f-bf3e-4f3c-95c2-882424d25d37 | SYSTEM
InitiatingUserId (c69c88fb-4e41-e811-a214-83daa2756e35) = 34248a5f-bf3e-4f3c-95c2-882424d25d37 | SYSTEM

Все запросы выполняются от имени системного пользователя, хотя они должны от имениразных пользователей.

Раньше (в CRM 4.0-2013) это работало, но теперь не работает.Я пробовал на двух разных системах (разные версии) - результат один и тот же.

Почему?

1 Ответ

0 голосов
/ 15 февраля 2019

Ваш пример выполняет запрос WhoAmI от имени нескольких идентификаторов, но WhoAmI всегда возвращает systemuserid аутентифицированного пользователя, и, поскольку плагины выполняются учетной записью SYSTEM, его идентификатор всегда будет возвращаться.

Выполните, например, запрос Create для учетной записи сущности и проверьте атрибуты CreatedBy, CreatedOnBehalf и OwnerId.

...