前言

光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之前,先看下面这段代码:

 using System.DirectoryServices;
namespace ADTest
{
class Program
{
static void Main(string[] args)
{
DirectoryEntry Entry = IsConnected(ADServerIp, ADUser, ADPasssWord);
Console.Write(Entry.SchemaClassName);
Console.ReadKey();
}
/// <summary>
/// 域控服务器IP或域名
/// </summary>
private static string ADServerIp = "192.168.241.3";
/// <summary>
/// AD管理员帐号
/// </summary>
private static string ADUser = @"Domain";
/// <summary>
/// AD管理员密码
/// </summary>
private static string ADPasssWord = "p@ssw0rd";
/// <summary>
/// 测试连接域控服务器
/// </summary>
/// <param name="domainIP">域控服务器IP或域名</param>
/// <param name="userName">账号</param>
/// <param name="userPwd">密码</param>
/// <returns></returns>
public static DirectoryEntry IsConnected(string domainIP, string userName, string userPwd)
{
DirectoryEntry entry = null;
try
{
entry = new DirectoryEntry("LDAP://" + domainIP, userName, userPwd);
return entry;
}
catch (Exception ex)
{
throw ex;
}
}
}
}

断点调试,我们看看加载的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中最前面的一项(第一个逗号前).例如:

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

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

验证通过。但是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/

 
本文版权作者博客园共有,欢迎转载。未经作者同意下,必须在文章页面明显标出原文链接及作者,否则保留追究法律责任的权利。
 
个人原创,若有错误或补充请联系修改。本文会根据作者的一步步成长做一定的更新和补充。
 

 

Active Directory的LDAP协议与DN(Distinguished Name)详解的更多相关文章

  1. HTTP协议头部与Keep-Alive模式详解

    HTTP协议头部与Keep-Alive模式详解 .什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器 ...

  2. 搞懂分布式技术4:ZAB协议概述与选主流程详解

    搞懂分布式技术4:ZAB协议概述与选主流程详解 ZAB协议 ZAB(Zookeeper Atomic Broadcast)协议是专门为zookeeper实现分布式协调功能而设计.zookeeper主要 ...

  3. Microsoft Active Directory(LDAP)连接常见错误代码

    接下来显示的认证错误类似于这样: "The exception is [ LDAP: error code 49 - 80090308: LdapErr: DSID-0Cxxxxxx, co ...

  4. SPI总线协议及SPI时序图详解

    SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚 ...

  5. SPI总线协议及SPI时序图详解【转】

    转自:https://www.cnblogs.com/adylee/p/5399742.html SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接 ...

  6. SNMP协议以及著名的MIB详解

    SNMP协议介绍  简单网络管理协议(SNMP:Simple Network Management Protocol)是由互联网工程任务组(IETF:Internet Engineering Task ...

  7. TCP/IP协议学习(六) 链路层详解

    学习知识很简单,但坚持不懈却又是如此的困难,即使一直对自己说"努力,不能停下"的我也慢慢懈怠了... 闲话不多说,本篇将讲述TCP/IP协议栈的链路层.在本系列第一篇我讲到,TCP ...

  8. 标准Http协议的六种请求方法详解

    标准Http协议支持六种请求方法,即: 1.GET 2.POST 3.PUT 4.Delete 5.HEAD 6.Options 但其实我们大部分情况下只用到了GET和POST.如果想设计一个符合RE ...

  9. 《java入门第一季》之UDP协议下的网络编程详解

    首先看一下UDP协议的图解: 可以看到,分为发送端和接收端程序. 直接上代码: 发送端程序: import java.io.IOException; import java.net.DatagramP ...

随机推荐

  1. HUST——1106xor的难题之二(异或树状数组单点修改和区间查询)

    1106: xor的难题之二 时间限制: 2 Sec  内存限制: 128 MB 提交: 8  解决: 3 题目描述 上次Alex学长的问题xor难题很简单吧,现在hkhv学长有个问题想问你们. 他现 ...

  2. luogu 3708 koishi的数学题 递推 线性筛

    题目链接 题意 输入一个整数\(n\)\((n\leq 1e6)\),设\(f(x)=\sum_{i=1}^n x\mod i\),你需要输出\(f(1),f(2)...,f(n)\). 输入输出格式 ...

  3. 35深入理解C指针之---结构体基础

    一.结构体基础 1.定义:结构体大大加强了C的数据聚合能力,可以使得不同类型的数据进行结合 2.特征: 1).结构体可以使得不同类型的数据进行结合 2).结构体可以使用内置的数据类型,包括指针 3). ...

  4. Ubuntu16 编译源码出错 unsupported reloc 43

    错误如下 prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6//x86_64-linux/include/c++/4.6/bits/basi ...

  5. 转载:Flappy Bird源代码 win32 console版

    #include"StdAfx.h" #include<stdio.h> #include<stdlib.h> #include<conio.h> ...

  6. Codeforces 149D Coloring Brackets(树型DP)

    题目链接 Coloring Brackets 考虑树型DP.(我参考了Q巨的代码还是略不理解……) 首先在序列的最外面加一对括号.预处理出DFS树. 每个点有9中状态.假设0位不涂色,1为涂红色,2为 ...

  7. 通过房价预测入门Kaggle

    今天看了个新闻,说是中国社会科学院城市发展与环境研究所及社会科学文献出版社共同发布<房地产蓝皮书:中国房地产发展报告No.16(2019)>指出房价上涨7.6%,看得我都坐不住了,这房价上 ...

  8. codevs——1008 选数

    1008 选数 2002年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 已知 n ...

  9. 转载:P2P技术原理及应用(1)

    转帖allen303allen的空间 作 者:金海 廖小飞 摘要:对等网络(P2P)有3种主要的组织结构:分布式哈希表(DHT)结构.树形结构.网状结构.P2P技术已 经延伸到几乎所有的网络应用领域, ...

  10. UVA - 10615 Rooks

    建一下模,把行和列看成二分图的点,把车看成是二分图中的边,这样就变成了上一个博客的问题. 我们每次新加一条边,就把它加入一条 这条边两端点最小没有出现的颜色  交替出现的路径中去. #include& ...