潘爱民
北京大学计算机科学技术研究所 (100871)
【摘要】本文介绍了Microsoft提出的活动目录服务接口(ADSI)技术。文章首先讲述了ADSI的结构,然后介绍了ADSI的程序设计方法,最后通过例子简单说明了ADSI的用法。
一、ADSI简介
ADSI (Active Directory Services Interface)是Microsoft新推出的一项技术,它统一了许多底层服务的编程接口,程序员可以使用一致的对象技术来访问这些底层服务。ADSI把这些服务的公共部分提取出来,同时隔离出相异的部分,程序员可以用统一的接口访问底层服务的公共部分,并延伸到底层服务的专有部分。
为了说明ADSI的接口标准和用法,首先我们解释几个重要的概念:
目录(Directory):目录类似于一个数据库,它通常包含一些描述性的、基于属性的信息。由于目录中的信息被读访问的频率比写访问的频率要高得多,所以,目录并不象数据库那样必须实现复杂的事务或者回滚机制。在许可的条件下,目录的更新操作通常是简单的更改操作。对于大量的信息查找或者信息检索要求,目录应该快速给出应答。为了提高性能和可靠性,并降低应答时间,分布式的目录信息可能需要在广阔的网络范围内进行复制操作。因为引入了复制机制,所以在复制点之间,暂时的不一致是难以避免的,只要最终能够同步即可。
目录服务(Directory Service):目录服务所表达的含义与目录紧密相关,它是指目录信息源与针对这些信息源的服务结合起来使得这些信息可被用户使用。
一个典型的目录服务具有以下几个特性:
□ 安全特性。管理员可以对目录强制使用安全特性,以便保护目录信息不被非法获取。
□ 分布特性。一个目录可以跨越机器边界,也即目录信息可以在网络上的不同机器上。
□ 复制特性。目录信息应尽量让更广阔范围的用户所利用。
目录服务既是一个信息管理工具,同时也是一个面向最终用户的工具。在网络上各种各样的对象数量迅速增长的今天,目录服务非常有意义。类似于网络硬件设施的集线器(hub)的概念,目录服务相当于软件集线器。
活动目录(Active Directory):活动目录是Microsoft在Windows 2000中实现的目录服务,它不仅实现了作为一般目录服务的特性,包括安全特性、分布特性以及复制特性等。它同时也扩充了一些新的特性,以便使得目录信息更加易于管理和搜索。活动目录在实现目录服务的同时,充分考虑了目录信息的可伸缩性,从包含上百个对象的单服务器结构到成千上百服务器的百万以上的对象信息,它都可以正常工作。
目录服务是一个抽象的概念,从用户使用的角度来看,通常最为关心的是目录的名字空间以及相关的访问协议。名字空间限定了目录服务的描述能力,而访问协议必须要标准化,以便支持分布式特性。访问协议的标准为LDAP(Light-weight Directory Access Protocol)协议,它是建立在TCP/IP基础上的目录服务协议,它的信息模型包括了数据和名字空间。与其它Internet协议不同的是,LDAP还提供了一组API以便简化LDAP应用的编写工作。
LDAP也遵守客户-服务器模型,包含目录数据的一个或多个LDAP服务器建立起一个LDAP目录树,LDAP客户通过网络连接到服务器,向服务器发出请求或者执行一些操作。LDAP服务器响应客户的请求,或者把客户的请求指引到其它包含客户指定信息的另外的LDAP服务器上。不管客户连接到哪个LDAP服务器上,他所看到的目录树视图应该是一样的。
Microsoft提供了ADSI用于开发客户方的目录服务应用系统。ADSI是一组COM接口标准,它通过LDAP协议访问目录服务。ADSI实现了目录服务的客户模型,利用ADSI,我们可以在Windows平台上开发目录服务客户应用。如果不使用ADSI,那么用到目录服务的应用必须编写代码处理每个它所用到的名字空间结构,当有新的名字空间加入时,必须修改代码以适应变化,而且,在访问目录服务时,可能要调用到底层与网络有关的API函数。
从技术角度来看,ADSI用到了与ADO(Active Data Object,Microsoft推出的一致数据访问接口)非常类似的技术,它通过一组双接口(dual interface,既可以通过vtable也可以通过自动化接口IDispatch访问属性和方法的自动化对象)提供了目录服务功能。客户程序可以根据性能要求或者开发语言的特点选择不同的编程模型。
由于ADSI使用了COM和自动化对象技术,所以ADSI的编程用法比较简单,但要真正掌握ADSI,首先必须理解ADSI接口标准中用到的一些基本概念,下面列出如下:
(1) 名字空间(Namespace)。名字空间是LDAP的基本概念,也是ADSI的基本概念。名字空间是一个有界区域,每一个给定的名字都必须在特定的名字空间中被解析,解析的过程是把名字翻译成某个对象或者名字所代表的信息。比如,电话簿形成了一个名字空间,每一个电话订户的名字被解析成电话号码;NTFS文件系统也构成了一个名字空间,每个文件名可被解析成文件对象。活动目录也形成了一个名字空间,目录中的每个对象可被解析到对象本身。
(2) 对象(Object)或目录对象(Directory Object)。对象是指一组属性的集合,它往往代表了有形的实体,比如用户、文件等。对象通过属性描述它的基本特征,比如,用户的属性可能包括姓名、电话号码、电子邮件地址等。
(3) 包容器(Container)。包容器是名字空间的一部分,与目录对象一样,它也有属性,但与目录对象不同的是,它不代表有形的实体,而是其它目录对象或者包容器的容器。
(4) 目录树(Directory Tree)。在一个名字空间中,由包容器和对象构成了一个完整的树结构。在ADSI中,树是基本的结构,从每一个包容器对象作为起点,层层深入,都可以构成一棵子树。一个简单的目录可以构成一棵树,一个计算机网络或者一个NT域也可以构成一棵树。
(5) 标识名(Distinguished Name,简称为DN名)。活动目录中的每一个对象都有一个标识名,标识名包含对象在名字空间中的完整路径名,从基本的名字空间包容器开始,通过层层包容器对象,一直到达对象节点。不同的名字空间有不同的标识名命名规则,ADSI提供了一个命名框架,通过名字即可识别相应的目录服务和名字空间。
(6) 对象标识符(Object Identity)。对象除了其DN名之外,它还有一个128位的全局标识符(GUID)。在ADSI内部,对象是通过标识符来识别的,而不是名字。当对象被创建时,目录服务代理程序首先为对象分配一个标识符,客户可以通过对象的“objectGUID”属性获得标识符,这是一个只读属性,不管对象被移动或者改名,它的标识符都不会被改变。
(7) 命名环境(Naming Context)。命名环境是指任何一个目录子树,在ADSI中,一个服务器至少包含三个命名环境:表结构(schema)、配置(configuration)和用户命名环境。
(8) 域(Domain)。在ADSI中,域是Windows NT网络的安全性边界。ADSI由一个或多个域组成。在单独的计算机上,域即指计算机本身。当多个域通过信任关系连接起来之后,所有的域共享公共的表结构、配置、全局目录(global catalog),从而形成域树(domain tree),多个域树连接在一起形成域林(domain forest)。域林中的所有域共享公共的表结构、配置、全局目录(global catalog)。
(9) 站点(site)。站点是指一个或多个通过TCP/IP连接起来的子网。通常,站点内部的子网通过可靠的网络连接起来。
从编程技术来看,ADSI只是一些COM接口和COM组件的标准,但ADSI表达信息的方式是革命性的。名字空间的概念体现了ADSI表达信息的广泛性;域和站点的概念体现了ADSI的空间广阔性,从单机到局域网,再到广域网,都可以纳入ADSI的表达范围;命名环境的概念体现了ADSI对信息的自组织、自描述特性。对象、包容器、目录树的概念体现了ADSI表达信息的基本结构方式。对象标识名和标识符两种机制结合起来,使得目录对象既有直接面对最终用户的名字特性,又有内部唯一标识的可编程特性。
在ADSI出现之前,实际上,我们已经有了很多可按目录方式管理的应用系统,比如文件系统、用户管理、电子邮件应用等等。ADSI抽取了这些应用对象的共性,通过一组标准化的接口实现目录对象的管理。虽然,我们还不能看到Windows 2000中ADSI的最终形式,但是在Windows NT 4.0版本基础上的一些应用系统,已经实现了ADSI标准,最为典型的是Microsoft Exchange Server,它充分体现了ADSI的基本概念。