【问题标题】:Dynamics CRM SDK Context.SaveChanges permission errorDynamics CRM SDK Context.SaveChanges 权限错误
【发布时间】:2023-03-09 23:36:01
【问题描述】:

我查看了很多 MS Dynamics CRM 博客和 SO 问题,并尝试了所有解决方案,但都没有奏效。

我面临的问题如下:我正在尝试遍历一个带有公司名称和公司类型的 excel 文件。然后,我在 CRM 中找到名称匹配的公司,并根据 excel 中的公司类型为一些自定义字段设置值。当我为一家公司执行此代码时,它工作正常,但是当我尝试为大量公司运行循环时,我不断得到:

SecLib::CrmCheckPrivilege 失败。在 UserId:xxxxxx 和 PrivilegeType:Read 上返回 hr = -2147220943。

相关用户拥有所有权限,并且是具有读/写 CAL 的管理员用户。就像我指出的那样,我能够对单个记录进行更新。但是当作为循环运行时,相同的记录会引发错误。

我一直无法找到解决方案,因此非常感谢任何帮助。我正在在线使用 MS Dynamics CRM。

这是我的代码:

while (!parser.EndOfData)
{
    counter++;

    if (counter >= 20) 
    {
        try
        {
            counter = 0;
            context.SaveChanges();
        }
        catch (Exception exc) 
        {
            while (exc != null)
            {
                System.Diagnostics.Debug.WriteLine("ERROR: " + exc.Message);
                exc = exc.InnerException;
            }
            continue;
        }
    }

    //Processing row
    string[] fields = parser.ReadFields();

    foreach (string field in fields)
    {
        //TODO: Process field
        company.Add(fields[0]);
        category.Add(fields[1]);

        var currAccs = context.CreateQuery<Account>().Where(x => x.Name.Contains(fields[0])).ToList();
        if (currAccs != null)
        {
            foreach (var currAcc in currAccs)
            {
                System.Diagnostics.Debug.WriteLine("Processing: " + currAcc.Name);
                currAcc.cir_MediaOwner = false;
                currAcc.cir_Agency = false;
                currAcc.cir_AdvertiserBrand = false;

                if (fields[1].Contains("MO"))
                {
                    currAcc.cir_MediaOwner = true;
                }

                if (fields[1].Contains("A"))
                {
                    currAcc.cir_Agency = true;
                }

                if (fields[1].Contains("B"))
                {
                    currAcc.cir_AdvertiserBrand = true;
                }

                try
                {
                    context.UpdateObject(currAcc);
                }
                catch (Exception exc)
                {
                    while (exc != null)
                    {
                        System.Diagnostics.Debug.WriteLine("ERROR: " + exc.Message);
                        exc = exc.InnerException;
                    }
                    continue;
                }
            }
        }

        break;
    }
}

【问题讨论】:

  • 这很奇怪,如果您尝试更新用户无权访问的相关实体的字段,您可能会收到该读取错误。如果您尝试在不使用上下文的情况下更新记录(即 OrganizationService.Update(account) 会发生同样的情况吗?如果您尝试使用 ExecuteMultiple?
  • 您好 Jordi,感谢您的回复。如果我注释掉 O rganizationService.Update(account) 调用,我不会收到任何异常,但我的更新也不会提交给 CRM。所以像:currAcc.cir_MediaOwner = true;不工作。
  • 意思是替换上下文。UpdateObject(currAcc);通过 service.Update(account) where account = new Account() {Id = new Guid("the id"), cir_MediaOwner = true, ... } 等等。
  • 看起来您只是尝试每 20 条记录提交更改。我想知道它是否在后台使用Bulk Update 执行此操作 - 您的用户是否有权进行批量更新?

标签: c# sdk dynamics-crm-online


【解决方案1】:

您可能有一个与帐户和创建/更新消息相关的工作流或插件步骤,被假冒为没有适当权限的用户。

对于工作流,可以选择“执行为:工作流的所有者”(link)

对于插件步骤,这些有一个选项“在用户上下文中运行”,可以设置为修复用户 (link)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多