原文地址:http://blog.joycode.com/liuhuimiao/articles/29964.aspx
- 为什么要有活动目录,什么是活动目录,它有什么用:活动目录主要用在分布式的环境中。在分布式环境中,要求有各种信息可以被各种应用很方便地访问读取。活动目录正式为分布式环境中的信息提供一种访问途径。它提供了一个公共的区域来保存分布式环境中的各种信息,并且对这些信息进行定位。从开发人员角度看活动目录,可以理解活动目录是一种存放了应用程序所需要的特定资源信息的“数据库”。活动目录还对这些资源信息的读取和查询进行了优化。
- 容器和非容器:活动目录中的资源信息被组织成一个层次结构。这个层次结构中的每一个实体都被简称为对象。换句话说,活动目录中创建对象时,是把它们创建在一个层次结构中的。该结构由两种类型的对象组成:Container(容器)和非Container(非容器)。容器可容纳非容器或下一级的容器。而非容器则不再包含其他对象,因此也常被成为叶或叶子对象。在安装完活动目录后,操作系统已经默认自动创建了很多的Container,如Users, Builtin等。
- ADsPath、DN、RDN:在活动目录中层次结构的路径被称为ADsPath,可用来唯一标志一个对象(另外唯一标志对象的方法是使用GUID)。ADsPath常用的表示为:LDAP://DC=microsoft,DC=com。例如,有域被命名为mydomain.local,则它的ADsPath表示为:LDAP://DC=mydomain,DC=local。其中DC是Domain Component(域组件)的缩写,它只用于表示域的根。DN是Distinguished Name(唯一标识)的缩写,RDN是Relative Distinguished Name(相对唯一标识)的缩写。DN用来在一个完整的目录信息树中唯一表示一个对象的名称,而RDN是指在该对象的父容器中唯一表示它的名称。下面看个示例:在mydomain.local域中用户容器中超级管理员帐号的ADsPath为:LDAP://CN=Administrator,CN=Users,DC=mydomain,DC=local,其DN为(注意没有了LDAP:// 这个前缀):CN=Administrator,CN=Users,DC=mydomain,DC=local,其RDN为(即在Users容器中的名称):CN=Administrator。其中CN是Common Name(公用名称)的缩写。
- OU:OU是Organizational Unit(组织单元)的缩写。OU是容器对象,它主要从逻辑的角度来管理和组织活动目录域。例如,当你公司内部打算让销售部经理有权限管理自己整个销售部门资源信息时,一种方法就是为销售部门单独创建一个名为Sales的OU,然后让销售部经理在受限条件下实现其部门资源信息的“自治”。
- 更多基础概念,可以参考这里?。
- 关于LDAP及其语法,可以参考《理解LDAP》(上,下)。
- Naming Context:活动目录被分成许多部分,称之为分区或者Naming Context,简称NC。其中主要有三个部分:Domain NC,Configuration NC,Schema NC。这也就是你打开ADSIEDIT.msc时首先看到的已经加载的三个活动目录分区。Domain NC用于保存用户、组和组织单元的相关信息。Configuration NC用于保存整个域森林中的配置数据信息。而Schema NC负责保存与在活动目录中能够创建的所有的对象和属性集相关的数据。例如,在mydomain.local域中,Domain NC的ADsPath为:LDAP://DC=mydomain,DC=local。Configuration NC的ADsPath为:LDAP://CN=Configuration,DC=mydomain,DC=local。Schema NC的ADsPath为:LDAP://CN=Schema,CN=Configuration,DC=mydomain,DC=local。
- AD/ADAM程序访问接口示意图:
- System.DirectoryServices:System.DirecotryServices命名空间下有两个主要的类:DirectoryEntry和DirectorySearcher。其中DirectoryEntry类用于表示活动目录中任何一个对象。你可以通过DirectoryEntry对活动目录里的对象进行修改其属性、移动、重命名、列举其内部子对象、创建子对象、删除子对象、获取起父对象等等操作。例如:
using System.DirectoryServices;
DirectoryEntry entry = new DirectoryEntry(ADsPath);
Console.WriteLine(entry.Path);
Console.WriteLine(entry.Name);
Console.WriteLine(entry.GUID);
对于活动目录对象的绑定路径ADsPath,你可以用 LDAP://ServerName/DN 来绑定指定服务器和DN的活动目录对象。另外,DirectoryEntry还可以进一步指定用户名和密码,或者用户名和密码外加安全验证方式进行对象绑定。 - DirectoryEntry的属性示意图:
活动目录对象的属性分为单值属性和多值属性两类。例如上图中,CN就是单值属性,而memberOf则为多值属性。对于多值属性,可以用循环语句for或foreach进行列举。 - DirectorySearcher目录查询:DirectorySearcher实例有两个主要方法:FindAll()和FindOne()。FindAll()是获取该对象的所有子对象集合;而FindOne()则获取查询到的第一个子对象。对于DirectorySearcher实例,其也有SearchRoot、SearchScope、Filter三个主要属性。其中,SearchRoot表示在AD层次结构中要开始搜索的节点;SearchScope表示搜索范围;而Filter则表示LDAP查询语句的过滤命令字符串,例如 (&(objectCategory=person)(objectClass=user)) 表示列举所有用户对象中的人员对象。而对于搜索范围SearchScope,则又分为 Base、OneLevel、Subtree三种。其中,Base表示要那个搜索的根节点;OneLevel表示在同一个层次中搜索;Subtree则表示在包括根节点的所有节点的搜索。其示意图如下:
- 使用SQLServer查询分析器查询活动目录数据的实现方法:为AD创建一个链接服务器(你可以在企业管理器的具体SQLServer服务器里的“安全性”里看到该项)。在查询分析器中执行下面命令即可:
sp_addlinkedserver 'ADSI', 'Active Directory Service Interfaces', 'ADSDSOObject', 'adsdatasource'
现在你就可以在查询分析器中查询AD数据了。例如下面查询语句:
SELECT * FROM OpenQuery(ADSI, 'SELECT title, displayName, sAMAccountName, givenName, telephoneNumber, facsimileTelephoneNumber, sn FROM ''LDAP://DC=mydomain,DC=local'' where objectClass = ''User''') - ADAM--活动目录应用程序模式:ADAM,全称为Active Directory Application Mode,它是一个可运行在WinXP Professional和Win2k3上的目录服务,可简单的看作是AD的一个简化版本。但是,ADAM和AD是无法比较的,因为它们的侧重点和应用领域是不同的:AD是主要侧重网络基础构造,它是以系统服务运行,并需要配以DNS。而ADAM则主要是为应用程序服务的,它是以用户服务运行,且不需要DNS。同一台计算机上可以运行多个ADAM实例,例如可以为每个应用程序配置一个ADAM实例。你可以在 这里 下载到ADAM。