ActiveDirectory的LDAP协议与DN(DistinguishedName)详解
前⾔
光copy⼏段代码的⽂章没什么意思,本章上最基础的代码,主要是为了从编程⽅⾯聊LDAP和DN,其它的后⾯聊,⼀步步慢慢来吧。
Active Directory编程须知
param name1.域控服务器:
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。
  详细资料:msdn.microsoft/zh-cn/library/system.directoryservices
System.DirectoryServices.AccountManagement.dll;
  System.DirectoryServices.AccountManagement 命名空间在多个主体存储提供统⼀访问和操作的⽤户、计算机和组的安全主体︰ Active Directory 域服务 (AD DS)、 Active Directory 轻型⽬录服务 (AD LDS) 和 Machine SAM (MSAM)。
  详细资料:msdn.microsoft/zh-cn/library/System.DirectoryServices.AccountManagement
System.DirectoryServices.Protocols.dll;
  System.DirectoryServices.Protocols 命名空间提供了标准轻型⽬录访问协议 (LDAP) 版本 3 (V3) 和⽬录服务标记语⾔ (DSML) 版本 2.0 (V2) 中定义的⽅法。
  详细资料:msdn.microsoft/zh-cn/library/System.DirectoryServices.Protocols
测试连接域控服务器(AD DS)
在我们讨论LDAP之前,先看下⾯这段代码:
1using System.DirectoryServices;
2namespace ADTest
3 {
4class Program
5    {
6static 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>
15private static string ADServerIp = "192.168.241.3";
16///<summary>
17/// AD管理员帐号
18///</summary>
19private static string ADUser = @"Domain";
20///<summary>
21/// AD管理员密码
22///</summary>
23private 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>
31public static DirectoryEntry IsConnected(string domainIP, string userName, string userPwd)
32        {
33            DirectoryEntry entry = null;
34try
35            {
36                entry = new DirectoryEntry("LDAP://" + domainIP, userName, userPwd);
37return entry;
38            }
39catch (Exception ex)
40            {
41throw 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中最前⾯的⼀项(第⼀个逗号前).例如:
那我们需要验证⼀下,使⽤如下代码得到的运⾏结果:
1static 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)⾥的(ou)上海分公司⾥的(ou)(徐汇区事业部)
CN=张三,OU=销售部,OU=北京昌平区事业部,OU=北京分公司,DC=IFire47,DC=com
解读:域(IFire47)⾥的(ou)北京分公司⾥的(ou)北京昌平区事业部⾥的(ou)销售部的(user)张
结语
以上是本⽂的全部内容,主要从程序⽅⾯认识LDAP协议的⽤处,且掌握AD中域对象的distinguishedName属性的数据意义为后⾯的编程做铺垫。本⽂章最后修改时间:2017年4⽉16⽇02:36:37
作者:出处:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。