3. 技术专题 - 域控&LDAP&Active Directory(活动目录)

  • 目录服务(数据库)
    • 目录服务是一个特殊的数据库,用来保存描述性的、基于属性的详细信息,支持过滤功能。
    • 是动态的,灵活的,易扩展的。
    • 常用于人员组织管理(域控服务),电话簿,地址簿。
  • 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

posted on 2021-06-07 10:17  碎羽love星谊  阅读(683)  评论(0编辑  收藏  举报

导航