【问题标题】:Microsoft Dynamics CRM Async plugin executed by System User由系统用户执行的 Microsoft Dynamics CRM Async 插件
【发布时间】:2014-06-26 01:43:48
【问题描述】:

我在插件注册工具中注册了两个插件。两个插件的“在用户上下文运行”值都有“calling user”。

  1. 第一个插件在 Entity X (Async) 更新后注册了一个步骤
  2. 第二个插件在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


【解决方案1】:

要根据上面的代码在插件中模拟,请执行以下操作:

((OrganizationServiceProxy)this.OrganizationService).CallerId = loggedInUserId;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2017-07-09
    • 1970-01-01
    相关资源
    最近更新 更多