• 目录服务(数据库)
  • 目录服务是一个特殊的数据库,用来保存描述性的、基于属性的详细信息,支持过滤功能。
  • 是动态的,灵活的,易扩展的。
  • 常用于人员组织管理(域控服务),电话簿,地址簿。
  • 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
  • surname
  • 姓,如“许”
  • 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
  • 使用域名/IP+端口号进行连接
  • 一般没打开ssl
  • 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