我正在调查Microsoft Dynamics CRM 2016/Dynamics 365组织服务中的模拟,我发现代码始终代表系统用户(SYSTEM(执行。
我创建了一个插件,应该代表不同的用户执行请求:
- 系统
- 用户(系统(
- 默认用户
- 插件注册工具中指定的用户
- 发起请求的用户
但是代码始终代表系统用户 (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中(它有效,但现在不起作用。我在两个不同的系统(不同的版本(上尝试过 - 结果是一样的。
为什么?
您的示例代表多个身份执行WhoAmI
请求,但WhoAmI
始终返回经过身份验证的用户的systemuserid
,并且由于插件由 SYSTEM 帐户执行,因此将始终返回其 ID。
例如,在实体帐户上执行Create
请求,并检查属性CreatedBy
、CreatedOnBehalf
和OwnerId
。