离开大学校园,从一个底层的Coder,在多个技术领域深浅不知的跋涉过,渐渐专注于现在的微软Dynamics平台和Data技术。
以前总是在网络间不停的Search、Reading,也从来没有想过自己会写点什么。后来也许是老了,记忆不好了,哈。总是在解决了一些问题之后,如果没有及时保留下一些东西,久而久之就遗忘的差不多了。偶尔再碰到似曾相识的场景,又要花费不少的精力去Search。
终于,也提起笔来回顾一下自己趟过的泥潭,填过的坑。
先来个简单的场景作为开场白吧。
Microsot Dynamics On-Premise 创建用户之域账号已被使用
使用过微软Dynamics On-Premise的童鞋应该都比较清楚,Dynamics On-Premise用户最基本的来源就是微软域用户(Active Directory User)了,其原理就不在这里深挖了,反正是产品就这么要求的,大家也都是这么用的。
有时候在项目中,碰到过客户的业务人员或技术人员需要创建Dynamics On-Premise用户了,发现无论如何都创建不成功,总是提示“The specified Active Directory user already exists as a Dynamics 365 user.”
分析过几次这样的场景,常见的是以下几种情况:
- 需要创建的用户,其域账号(DomainName)确实在Dynamics中已经存在了,可能过去的某个时间,被系统管理人员禁用(Disable)了。而后来在查询系统用户的时候,没有留意已禁用的用户(Disabled User)中是否存在这个域账号对应的用户。所以会导致创建用户失败。这是很简单的一个场景,也算是一种人为操作失误了。
- 需要创建的用户,其域账号(DomainName)在Dynamics中确实不存在(无论是启用的用户还是禁用的用户都找不到)。这样的场景对于没有技术经验的业务人员来说,是比较抓瞎的。
上面的第1种情况,就没什么好说的了,仔细一点而已。下面我们就先来说说域用户(Active Directory User)与Dynamics On-Premise平台中的系统用户(System User)之间的关联关系。
微软的域用户(Active Directory User)是有多个唯一标识符的,除了常见的SPN,还有一个objectSid,都是在Dynamics On-Premise平台中用于识别域用户(Active Directory User)身份的。
Dynamics On-Premise平台中,业务人员可以直观的在页面上看到的用户表单中的内容,都是存储在对应的用户(SystemUser)实体中的,这里会存储每个用户的域账号(DomainName)。同时,Dynamics平台内部,还隐藏了2部分内容用于记录域用户的信息,这2部分的内容都是存储于Dynamics On-Premise平台后端的平台配置数据库MSCRM_Config中的。
- 组织用户信息。存储于MSCRM_Config数据库的SystemUserOrganizations表中。这里通过CrmUserId字段和UserId字段标识出Dynamics On-Premise用户与域用户(Active Directory User)的对应关系,同时,这个CrmUserId,也就是Dynamics On-Premise平台的用户实体主键(SystemUserId)。
- 用户认证信息。存储于MSCRM_Config数据库的SystemUserAuthentication表中。这里通过UserId字段和AuthInfo字段标识出这个域用户在域(Active Directory)中的用户记录。其中UserId就是上面组织用户信息表中的UserId,而AuthInfo中存储的就是类似“W:objectSid”的内容了,这个objectSid也就是域用户(Active Directory User)在域(Active Diretory)中的一种唯一标识。
到这里,就可以看出,即使Dynamics On-Premise的实体中不存在某个域用户(Active Directory User)对应的系统用户,但是如果在MSCRM_Config中,已经存在了这个域用户(Active Directory User)的信息,那么也是无法成功创建Dynamics On-Premise用户的。
如果碰到这种情况,可以在域(Active Directoy)的ADSI编辑器(ADSIEdit.msc)中,查看这个域用户(Active Directory User)的objectSid,然后再查找MSCRM_Config数据库的SystemUserAuthentication表中是否存在这个objectSid对应的记录。
select * from MSCRM_Config..SystemUserAuthentication where AuthInfo like 'W:' + objectSid
这种情况一般多见于开发或测试阶段,通过备份-还原的方式操作了XXXX_MSCRM数据库,在备份之后创建过用户,而没有同步备份-还原MSCRM_Config数据库。