- 目录服务(数据库)
- 目录服务是一个特殊的数据库,用来保存描述性的、基于属性的详细信息,支持过滤功能。
- 是动态的,灵活的,易扩展的。
- 常用于人员组织管理(域控服务),电话簿,地址簿。
- LDAP
- 通常是389端口
- C#中连接时,直接使用domain:389即可,不需要前面指定LDAP://
- LDAP(Light Directory Access Portocol,轻量目录访问协议),它是基于X.500标准的轻量级目录访问协议。是一个用于查询目录服务(提供程序中的项目)的(应用)标准/协议。
- AD等多种域/目录服务器都支持LDAP形式的查询。
- 基本概念
- 目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
- 条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。
- 对象类(objectClass):与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必须属性也会被继承下来。
- 属性(property):描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性。
- DC、UID、OU、CN、SN、DN、RDN
- dc
- domain component
- 域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置)
- 类似于程序中的命名空间,多级的话就拆成多个
- uid
- user id
- 用户ID songtao.xu(一条记录的ID)
- ou
- organization unit
- 组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织)
- cn
- common name
- 公共名称,如“Thomas Johansson”(一条记录的名称)
- sn
- dn
- distinguished name
- “uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一)
- 并不是字面上的一个name而已,可以理解成一个完整的绝对路径,还包含了dc等信息
- ldp.exe中search时用的Base Dn其实就是指的dn
- run
- LDAPS
- 基于ssl,通常是636端口
- C#中连接时,直接使用domain:636即可,不需要前面指定LDAP://或LDAPS://
- 也就是所谓的Secure LDAP或者说LDAP via SSL
- 认证时,通常需要先把认证server端的证书用的根证书先装好,一般导入/装在计算机上
- 从代码上看,和LDAP相比,只是连接端口不同,用的类和执行查询语句是一样的,代码不需要改动,但client可能需要验证server certificate
- Active Directory(活动目录)
- AD是微软(专有)的对目录服务数据库的实现(和更多)。
- Active Directory是一个基于数据库的系统,在Windows环境中提供身份验证,目录,策略和其他服务。
- Windows Server上可以通过控制面板->程序与Windows功能->添加Windows功能进行安装
- 工具
- AD Explorer
- 微软本身就有一个Active Directory可视化工具,可以按层显示所有条目,但不知道能不能执行搜索语句,可以去官网下载
- ldp.exe
- 包含在Windows Support Tools中,Windows Server中已经有了,普通的Windows中需要单独下载
- 使用
- Connect
- Bind
- 使用域账号登陆。
- 要看服务器的配置和要求,有的支持匿名查询(即可以跳过这一步直接search),有的要求必须先登录(这时如果没有bind就search,会报错让你去先bind)
- Browser->Search
- Base Dn
- 搜索范围,如DC=xxx,DC=yyy,DC=zzz
- Filter
- 搜索表达式
- 最外层包一层小括号()
- 要同时满足多个子条件的话,开头放一个&,然后后面依次放多个小括号包着的子条件,如(&(x=Xx)(y=yy)(z=zz))
- 每个条件/子条件都是一个AttributeName=value的形式,不过value支持模糊匹配,可以在前后使用*进行模糊匹配(有的域服务器可能会做限制,比如不能在最前面加*)
- scope
- 一般选subtree,那么每一级都会去search
- 代码中也要去设
- Options
- Attributes
- 想要搜索哪些属性/字段
- 默认只有一些重要的通用的属性(如objectClass,name,ou,dc,cn,distinguishName等),域服务器上可以根据公司需要自定义一些字段
- 填*,即代表要返回所有字段
- Disconnect
- 代码
- .NET
- 使用System.DirectoryServices和System.DirectoryServices.Protocols进行连接/认证/查询
- 查询时,SearchRequest的attributesList参数设成null,即要求返回所有attributes