• Active Directory的LDAP协议与DN(Distinguished Name)详解


     

    前言

    光copy几段代码的文章没什么意思,本章上最基础的代码,主要是为了从编程方面聊LDAP和DN,其它的后面聊,一步步慢慢来吧。

    Active Directory编程须知

    1.域控服务器:

    Windows Server 2000及以上;推荐Windows Server为2003以上(因为Microsoft在2000以后的Server中对AD有了新的架构级的修改,2000版本的系统与之后的操作系统AD架构方面存在差异)。个人使用的是Windows Server 2012 R2版本做测试 。

    2.服务器角色:

    已经完成安装Active Directory域控角色,并且已经成功部署。

    3.开发工具

    Visual Studio 2008及以上。

    4.NET Framework版本

    .NET Framework2.0及以上.NET Framework4.6.2以下(本文编写时建议请先使用4.6.2以下的程序集,以后这里会做修改。)

    5.核心程序集

    System.DirectoryServices.dll;

      System.DirectoryServices 命名空间中提供轻松访问到 Active Directory 域服务,从托管代码。 该命名空间包含两个常用组件,DirectoryEntry和DirectorySearcher。

      详细资料:https://msdn.microsoft.com/zh-cn/library/system.directoryservices

    System.DirectoryServices.AccountManagement.dll;

      System.DirectoryServices.AccountManagement 命名空间在多个主体存储提供统一访问和操作的用户、 计算机和组的安全主体︰ Active Directory 域服务 (AD DS)、 Active Directory 轻型目录服务 (AD LDS) 和 Machine SAM (MSAM)。

      详细资料:https://msdn.microsoft.com/zh-cn/library/System.DirectoryServices.AccountManagement

    System.DirectoryServices.Protocols.dll;

      System.DirectoryServices.Protocols 命名空间提供了标准轻型目录访问协议 (LDAP) 版本 3 (V3) 和目录服务标记语言 (DSML) 版本 2.0 (V2) 中定义的方法。

      详细资料:https://msdn.microsoft.com/zh-cn/library/System.DirectoryServices.Protocols

    测试连接域控服务器(AD DS)

    在我们讨论LDAP之前,先看下面这段代码:

     1 using System.DirectoryServices;
     2 namespace ADTest
     3 {
     4     class Program
     5     {
     6         static void Main(string[] args)
     7         {
     8             DirectoryEntry Entry = IsConnected(ADServerIp, ADUser, ADPasssWord);
     9             Console.Write(Entry.SchemaClassName);
    10             Console.ReadKey();
    11         }
    12         /// <summary>
    13         /// 域控服务器IP或域名
    14         /// </summary>
    15         private static string ADServerIp = "192.168.241.3";
    16         /// <summary>
    17         /// AD管理员帐号
    18         /// </summary>
    19         private static string ADUser = @"Domain";
    20         /// <summary>
    21         /// AD管理员密码
    22         /// </summary>
    23         private static string ADPasssWord = "p@ssw0rd";
    24         /// <summary>
    25         /// 测试连接域控服务器
    26         /// </summary>
    27         /// <param name="domainIP">域控服务器IP或域名</param>
    28         /// <param name="userName">账号</param>
    29         /// <param name="userPwd">密码</param>
    30         /// <returns></returns>
    31         public static DirectoryEntry IsConnected(string domainIP, string userName, string userPwd)
    32         {
    33             DirectoryEntry entry = null;
    34             try
    35             {
    36                 entry = new DirectoryEntry("LDAP://" + domainIP, userName, userPwd);
    37                 return entry;
    38             }
    39             catch (Exception ex)
    40             {
    41                 throw ex;
    42             }
    43         }
    44     }
    45 }

     断点调试,我们看看加载的DirectoryEntry对象的属性:

    这里主要说说这个非常关键的Path。从图片对比,DirectoryEntry的构造函数传入的Path参数与程序得到的DirectoryEntry的Path属性的值相等。我们看下官网对这个Path的定义。

    我个人的简单理解是:这里的path是一种需要符合LDAP协议的连接域控服务器的连接字符串。那LDAP协议到底是什么?

     

     

    LDAP协议详解

    LDAP协议,中文名:轻量级目录访问协议(Lightweight Directory Access Protocol),是为了实现目录服务的信息访问而构建的一种协议,构建与目录服务的协议上运行于TCP/IP协议栈上面的一层。

    用于连接域服务器的特定字符串格式,可以理解为MSSQL的连接字符串用于加载不同服务器中的不同的数据库,而LADP协议的服务器连接串,是加载不同服务器的,域对象、用户对象、组织单位对象等等。

    LADP协议由核心三部分组成:LDAP://DomainIP/DN

    DomainIP:是我们要连接的域控服务器的IP或域名

    DN :全称叫完全限定名(Distinguished Name),用于标识对象在活动目录中完整路径。RDN用来标识容器中的一个对象,是DN中最前面的一项(第一个逗号前).例如:

    那我们需要验证一下,使用如下代码得到的运行结果:

    1     static void Main(string[] args)
    2     {
    3         DirectoryEntry Entry = new DirectoryEntry(@"LDAP://192.168.241.3/CN=李四,OU=人事部,OU=徐汇区事业部,OU=上海分公司,DC=IFire47,DC=com", "Domain", "p@ssw0rd");
    4         Console.Write(Entry.SchemaClassName);
    5         Console.ReadKey();
    6     }

    验证通过。但是DN内具体的到底是怎么回事呢?坑还是要一步步填。

    DN(Distinguished Name)详细分析

    详细聊DN之前我们先要了解DN的数据结构:

    将图中的域对象distinguishedName属性按层次排列如下(不清,请右键查看原图URL):

    我们可以看到DN的数据规律为:从左向右(RDN+嵌套在最里层的OU向外到第一级别OU+Domain)。因为AD的数据是嵌套一级一级的存储,形成树状型管理结构,而DN的信息是也是按照树型结构组织的。所以在一个完整的LDAP协议中,我们可以根据DN从右至左推算出最终加载出来的对象的类型,及对象所在的具体位置(所以能明白DN是唯一的)。

    总结出如下规律:

    DN:Distinguished Name(完全限定名),主要包含如下三种:
    DC   (Domain     Component)       
    CN    (Common     Name)  
    OU (Organizational     Unit)

    LDAP 命名规则及其 Active Directory 对应属性规则

    DN Active Directory 

    cn=公用名

     

    cn=公用名

     

    ou=部门

     

    ou=部门

     

    dc=DNS域名

     

    dc=域组件

    DN中各命名的用法

    cn:主要用于 user 对象类,但它是通用名称,除了OU,DC需要特殊标识,其他容器全部使用CN作为标识。 

    ou:主要用于 organizational unit (OU) 对象类,只要组织单位是管理员手动创建,非系统默认容器,就需要使用OU做标识。

    dc :主要用于 domainDns 对象类,表示DNS域名。

    示例:

     OU=徐汇区事业部,OU=上海分公司,DC=IFire47,DC=com 
    解读:域(IFire47.com)里的(ou)上海分公司里的(ou)(徐汇区事业部)
     CN=张三,OU=销售部,OU=北京昌平区事业部,OU=北京分公司,DC=IFire47,DC=com
     解读:域(IFire47.com)里的(ou)北京分公司里的(ou)北京昌平区事业部里的(ou)销售部的(user)张三

     

     

    结语

    以上是本文的全部内容,主要从程序方面认识LDAP协议的用处,且掌握AD中域对象的distinguishedName属性的数据意义为后面的编程做铺垫。

    本文章最后修改时间:2017年4月16日02:36:37


    作者:IFire47 出处:http://www.cnblogs.com/IFire47/

     
    本文版权作者博客园共有,欢迎转载。未经作者同意下,必须在文章页面明显标出原文链接及作者,否则保留追究法律责任的权利。
     
    个人原创,若有错误或补充请联系修改。本文会根据作者的一步步成长做一定的更新和补充。
     
     
  • 相关阅读:
    UVA 465 Overflow (浮点数的优势)
    UVA 424 Integer Inquiry (大数相加问题)
    UVA 10494 If We Were a Child Again(大数与整型相除取整和取余)
    粘一个在UVA和ZOJ都能AC但POJ WR的代码
    UVA 340 MasterMind Hints
    UVA10815 Andy's First Dictionary
    MSComm写串口通信驱动步骤
    UVA 10106 Product (大数相乘问题)
    实现工具栏中添加的组合框接收回车消息
    UVA 10420 List of Conquests
  • 原文地址:https://www.cnblogs.com/IFire47/p/6677413.html
Copyright © 2020-2023  润新知