目录
背景描述
我所在的部门做的一款 LDAP Sync 的 windows 系统的应用,可以把用户 Directory Server 的数据,包括 LDAP User,LDAP Group,上传到我们的产品里来。
该 application 是用 C# 开发的,使用 System.DirectoryServices.Protocols.dll 库 ( 该库提供一系列 LDAP 的 API )。
在我本机上,该 dll 所在路径:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7\System.DirectoryServices.Protocols.dll
可以使用 Jetbrains 的 dotPeek 工具反编译 dll 文件,查看源码。
问题描述
我们 Sync LDAP Group 的成员的时候,是使用的 memberOf 属性,返回满足条件的 LDAP User,作为该 group 的member。LDAP filter 如下:
(&(objectClass=*)(memberOf=cn=security_group_1,dc=test2019,dc=com)(|(mail=*)(proxyAddresses=*)))
但是,AD 有一个特殊的 group:Domain Users,一般情况下,这台 AD server 中所有的 LDAP User 都属于这个 group。但是,LDAP user 的 memberOf 属性中并没有 Domain Users 的 dn。
所以导致,用户想要同步 Domain Users 这个 group, 却找不到任何 members。
问题分析
AD 里有一个 primary group,默认是 Domain Users。
所有的 LDAP User 默认属于 primary group,是通过 LDAP User 的一个属性:primaryGroupID,这个值就是 primary group 的 Rid。
在 AD server 上通过 powershell 来获取一个 LDAP User 的所有属性