【发布时间】:2014-06-26 01:43:48
【问题描述】:
我在插件注册工具中注册了两个插件。两个插件的“在用户上下文运行”值都有“calling user”。
- 第一个插件在 Entity X (Async) 更新后注册了一个步骤
- 第二个插件在retrievemultiple of products (Sync) 上注册了一个步骤
第一个插件检索产品,因此它触发了第二个插件。当我检查第一个插件的 context.UserId 属性时,我找到了登录用户的 userId。但在第二个插件中,该属性设置为 SYSTEM 用户 的 Guid。
我正在使用以下代码在两个插件中实例化组织服务:
this.OrganizationService =
factory.CreateOrganizationService(this.PluginExecutionContext.UserId);
知道发生了什么吗?为什么登录用户没有执行第二个插件?
编辑:
当我查看系统作业跟踪时,我发现以下 ID:
插件 1(异步):
context.Initiating User: Logged in user
context.User: SYSTEM
插件 2(同步):
context.Initiating User ID: SYSTEM
context.User ID: SYSTEM
异步服务用户 (SYSTEM) 触发插件 2 确实有意义,因此插件 2 中的 Context.UserId 实际上是 SYSTEM 用户 Guid。
实际上我正在尝试做的事情(在伪代码中)是这样的(在插件 1 中):
context.UserId = context.InitiatingUserId
但问题在于 context.UserId 是只读属性。
任何想法如何执行这样的事情?
【问题讨论】:
-
我不是 100% 确定,但我相信您不能强制执行初始用户 ID,因为系统会设置这个。您可以尝试启动新的retrieveMultipleRequest 设置您需要的用户并忽略第一个。提供有关您的问题的更多信息,说明您为什么要这样做,也许会有另一种解决方法。
-
感谢您的评论。实际上我不想触发插件 2(多语言插件)。我只想异步更新产品。所以我不需要翻译。我解决这个问题的方法是在不安全的配置中添加 SYTEM 用户 Guid,并检查它是系统用户还是其他执行插件的用户。如果是系统,停止插件的执行。
标签: dynamics-crm-2011 impersonation