最近被 Dynamics CRM 的权限配置问题恶心了一个星期,老是报“Access Is Denied”,几经波折,最后终于找到一个比较合适的解决方案,写个博客 mark 下来,方便以后查看。

首先,介绍一下权限设置的要求:

1.在根 Business Unit 下建立好 Security Role,并根据文档要求赋予 Sense Role 相关 Entity 及 CRM 系统的操作权限;

2.建立多个 Team,每个 Team 都有各自的权限配置,给 Team Role 赋予不同的 Security Role;

3.创建 User,但是不给 User Role 赋 Security Role,而是直接将 User 加到 Team 中,这样 User 也可以得到与 Team 相同的权限(但这个并不是User本身拥有的权限)。

然后,我来描述一下 Bug 是怎么产生的:

当我按照需求设置好 Security Role 的各种权限并添加完 Team 和 User 后,开始使用这些 User 在 CRM 系统上进行测试,当我测试完某个 Entity 的 BPF(Business Process Flow),返回到列表视图后,再次双击 Record 想进来再查看的时候,开始报错,如下图所示:

图1 Access Is Denied

      Acess Is Denied? 此时的我???Ok,这条 Record 进不去,那我换一条,双击,Access Is Denied。嗯???Ok,那我直接 New 一条 Record,Access Is Denied……

接下来,讲一下我艰难的排 BUG 过程:

既然发现了 Bug ,那么先来找找 Bug 是怎么被触发的。

Download Log File,从文件里可以得到以下的一段信息:

<Message>
SecLib::AccessCheckEx failed.
Returned hr = -2147187962,
ObjectID: f7014009-b409-e911-943a-00155d16b40a,
OwnerId: c062acbd-fcfc-e811-943a-00155d16b40a,
OwnerIdType: 8 and CallingUser: c062acbd-fcfc-e811-943a-00155d16b40a.
ObjectTypeCode: 2500,
objectBusinessUnitId: 9cfbf85c-3e0f-e911-8b87-e0aa182461d5,
AccessRights: WriteAccess
</Message>

第一眼看到 WriteAccess,我以为是 Security Role 没有设置好,检查了一下,设置没有问题,而且 Read 的权限也在正常运作,因为可以看到 Active View 里所有的 Record。接着在屏蔽了 JS 以及 Plugin 代码后,重新添加新的 system user 后,执行一步 BPF:OK,不出所料报了 Acess Is Denied 的错误,通过测试验证了这个 bug 跟 JS 以及 Plugin 代码无关,剩下就是要找出权限设置哪里出了差错。

现在,就讲一下这类bug要如何修复:

1.首先从下载下来的 log 中可以看到,ObjectTypeCode:2500,对 CRM 数据库新建查询,执行以下查询语句:

SELECT * from EntityView ORDER BY ObjectTypeCode

可以得到一个列表,并且可以在列表中查询到 ObjectTypeCode:2500 对应的 Entity Name 为 UserEntityUISettings

图2 数据库查询结果

2.在设置权限的时候我们可以看到这个 UserEntityUISettings 就在 Security Role -> Core Records -> User Entity UI Settings

图3 Security Role 设置

根据 log 上报缺少 Write 权限,那么我们在 Security Role 里面将整行权限全部点上(这里的设置也只能点一下,赋予了 User 级别的权限),然后使用 User 重新打开刚刚 Access Is Denied 的 Record:发现还是打不开,还是报了 Acess Is Denied ,还是报了 ObjectTypeCode:2500 的错误。

猜想:难道是 Team Role 的权限不能被带到 User Role 那边?于是在 System User 的 User Role 里勾上了这个 Security Role,再次使用 User 打开 Record,惊喜,所有的操作都可以正常执行,不再报 Acess Is Denied 的错误了(此刻内心简直思绪万千)。然而,bug 虽然解决了,但这个方式显然是不行的,因为如果在 User Role 里勾选上与 Team Role 一样的 Security Role 的话,那么通过将 User 加到 Team 里来获得权限这一点就已经失去了意义(除去 ownerid 为 Team 的情况),因为此时 User 自身已经拥有与 Team 相同的权限。

为了符合通过将 User 加入 Team 来获取权限这一需求,可以使用以下方法:

 新建一个叫做 UI 的 Security Role,在这个 Security Role 只赋予它 User Entity UI Setttings 的权限;
其他 Security Role 不赋予 User Entity UI Settings 权限,并且这些 Security Role 只供 Team Role 使用;
每个 System User 的 User Role 都使用 UI Security Role,不必勾选其他 Security Role。

Note:

这里再提一个奇怪的修复方法,也算是一个隐藏 bug,就是当你在 system user 的 User Role 那边勾选了一个具有 UserEntityUISettings 的 Security Role,并使用这个 user 去访问了之前无权限访问的 Record 后,这个时候我们再将 User Role 上勾选的 Security Role 取消,再去访问那些 Record,你可以发现都变成有权限访问了……没错,它就是如此的神奇,可能是存在“缓存”,或者勾选了之后会在数据库某张权限表上加了一条代表某种关系的记录,取消勾选又不会移除该条关系,关于具体原因我并没有深入探究,也不建议通过这种方式来修复这个 bug,因为当你新加了 Entity 实体后又会再次出现同样的错误,因为你之前并没有访问过。

总结:

最后总结一下,当出现“Acess Is Denied”相关的错误时,可以通过下载 log 文件,根据文件提示的 ObjectTypeCode 代码及其他相关的日志信息,在数据库中查询出相对应的 Entity Name,再具体修复该 bug。

参考:https://nishantrana.me/2018/05/15/seclibaccesscheckex-failed-objecttypecode-2500-accessrights-writeaccess-error-on-user-entity-ui-settings-in-dynamics-365/

Dynamics CRM 如何修复 Access Is Denied - ObjectTypeCode: 2500 的错误的更多相关文章

  1. 在VM虚拟机上安装Microsoft Dynamics CRM 2016 步骤图解及安装注意事项

    安装Dynamics CRM 2016环境配置要求: 系统版本:Windows Server 2012 R2(必须) SQL 版本: SQLServer2014SP1-FullSlipstream-x ...

  2. Step-by-Step Guide to Portal Development for Microsoft Dynamics CRM - 摘自网络

    The Challenge Oftentimes in the world of Dynamics CRM, the need arises for non-CRM users to gain acc ...

  3. Dynamics CRM 2013 installation

    原创地址:http://www.cnblogs.com/jfzhu/p/3445820.html 转载请注明出处 一 硬件要求 1. CRM Server 下表对硬件的要求是假定Microsoft S ...

  4. Marketing with Microsoft Dynamics CRM IDEA CONFERENCE

    Object:Marketing with Microsoft Dynamics CRM  IDEA CONFERENCE  24 SEPTEMBER 2015 | BROADCAST ONLINE ...

  5. How to control PrincipalObjectAccess table growth in Microsoft Dynamics CRM 2011

    https://support.microsoft.com/en-us/kb/2664150 How to control PrincipalObjectAccess table growth in ...

  6. 一、Microsoft Dynamics CRM 4.0 SDK概述

    Chapter 1. Microsoft Dynamics CRM 4.0 SDK Overview(SDK概述) You are probably reading this book because ...

  7. Dynamics CRM 2011 2013-(An error occurred while opening mailbox xxx@xx.com Microsoft.Crm.Tools.Email.Providers.)

    An error occurred while opening mailbox  Microsoft.Crm.Tools.Email.Providers. Whenever I check how C ...

  8. Dynamics CRM 2013 初体验(3):新增加的功能

    新系统除了修补系统历史漏洞外当然还会添加些比较有意思的新功能,至于这些新功能是否好用那就得看它是否能经过咱们这些使用者的考验了.Dynamics CRM 2013系统将不再支持Dynamics CRM ...

  9. 部署服务能在Dynamics CRM Online上使用吗?

    部署服务有些时候有用,改动一些参数不需要重启IIS,也不需要去数据库中更改.比如,系统默认设置一个仪表盘(Dashboard)最多6个组件,不能超过这个数量,通过部署服务是可以更改的.部署服务既可以通 ...

随机推荐

  1. 【English】六、am,is,are 分别用在什么地方

    is:第三人称单数am:第一人称单数are:第二人称单数,第一.二.三人称的复数 用于第一人称, I am ......(我是.......)用于第三人称, He is ......(他是...... ...

  2. Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建

    目录 目录 1.前言 1.1.什么是 Hadoop? 1.1.1.什么是 YARN? 1.2.什么是 Zookeeper? 1.3.什么是 Hbase? 1.4.什么是 Hive 1.5.什么是 Sp ...

  3. Git 安装 on centos7

    本文演示如何在CentOS7上安装和使用git. 1 准备工作 1.1 浏览器访问安装包下载地址: https://www.kernel.org/pub/software/scm/git/ 找到下载列 ...

  4. linux安装windows启动盘

    安装gparted

  5. oracle sql developer 出现 : 适配器无法建立连接问题解决方案 The Network Adapter could not establish the connection

    直接上图比较直观 tips one:先看看自己 控制台的 SQLplus 可以登录不 可以直接往下面走 ,如果不可以就现在服务里面找到 Oracle 开头的服务启动就好 实在不会可以百度 注:由于该步 ...

  6. centos基本命令

    $>ls $>ls --help //查看命令帮助 $>man ls //查看命令帮助 $>clear //清屏 $>cd /home //切换目录 $>cd . ...

  7. 网络流 之 P2766 最长不下降子序列问题

    题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...

  8. 最新版jQuery v3.3.1的BUG以及解决办法(什么问题不重要,怎么解决问题才重要)

    发现问题 最新版的 FineUIPro v5.2.0 中,我们将内置的 jQuery v1.12.4 升级到 jQuery v3.3.1 ,可以看升级记录: +升级到jQuery v3.3.1.    ...

  9. vmware workstation安装教程以及其中出现的错误解决方法

    VMware Workstation 安装教程   1 下载好虚拟机,然后运行,点击下一步 2 选择我接受,下一步 3 选择安装的位置,可以自己选择,也可以默认不更改,这个无影响(图中I:\下面的VM ...

  10. Xcode: Run Script 的运用, 使build打包后自动+1

    背景: 每次打包都要build+1处理,比较麻烦,使用 Run Script 的运用使build打包后自动+1 0. 使用xcode 添加run Script 然后就可以添加Run Script了 1 ...