正文

ADSI简介(1)2009-07-16 01:07:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xman/45244.html

分享到:

一、ADSI简介

ADSI (Active Directory Services Interface)Microsoft提供的目录服务接口,它统一了许多底层服务的编程接口,程序员可以使用一致的对象技术来访问这些底层服务。ADSI把这些服务的公共部分提取出来,同时隔离出相异的部分,程序员可以用统一的接口访问底层服务的公共部分,并延伸到底层服务的专有部分。

为了说明ADSI的接口标准和用法,首先我们解释几个重要的概念:

目录(Directory):目录类似于一个数据库,它通常包含一些描述性的、基于属性的信息。

目录服务DirectoryService)既是一个信息管理工具,同时也是一个面向最终用户的工具。类似于网络硬件设施的集线器(hub)的概念,目录服务相当于软件集线器。

活动目录(Active Directory):活动目录是MicrosoftWindows 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 ObjectMicrosoft推出的一致数据访问接口)非常类似的技术,它通过一组双接口(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 2000ADSI的最终形式,但是在Windows NT 4.0版本基础上的一些应用系统,已经实现了ADSI标准,最为典型的是Microsoft Exchange Server,它充分体现了ADSI的基本概念。

下面列出目前已经实现的ADSI目录服务:

(1)  WinNTWindows NT域用户管理)

(2)  LDAP (Light Directory Access Protocol)

(3)  IISInternet Information Service

(4)  NDS(Novell NetWare Directory Services)

(5)  NWCOMPATNovell NetWare 3.x)

二、ADSI结构

ADSI编程接口包括两个方面,实现ADSI目录服务的提供者(provider)和使用ADSI的客户。每一个当前被支持的目录服务必须有一个提供者,ADSI提供者实现了ADSI对象以及与名字空间相关的对象;ADSI客户与普通的COM客户程序类似,它调用ADSI接口访问目录服务所提供的各种功能,包括查找目录、读取目录对象的属性,如果允许的话,还可以修改对象的属性。

ADSI提供了两种形式的编程接口,对于支持自动化的客户,它可以通过ADSI自动化接口调用目录服务提供者的属性和方法;对于性能要求比较高的客户,它可以通过vtable形式的COM接口访问目录服务提供者。ADSI这种双接口结构几乎总能满足客户程序的需要,关于双接口的原理以及用法请读者参阅有关自动化(Automation)方面的书籍,本文为简便起见,仅从自动化接口的角度讨论ADSI接口。

ADSI所定义的接口规范中,对应于目录服务的目录对象,我们也称为活动目录对象(Active Directory Object)。另一个重要的对象为包容器(Container) 对象,包容器对象与目录对象的关系跟我们在文件系统中使用的目录与文件的关系类似,一个包容器对象可以包含许多其它的目录对象或者包容器对象,而目录对象代表了一定的实体。对于每个ADSI提供者,它从基本的名字空间的根节点开始,通过包容器对象和目录对象,形成了一棵树。

ADSI的每个包容器对象或者目录对象都有一个与之相联系的类别对象,类别对象说明了对象的一些特征信息,比如,对象的属性、对象属于包容器还是目录对象,等等。类别对象也描述一些属性,这些属性是所有属于此类别的对象所共有的属性,在这些属性中,有的属性是强制必须要有的,而有的属性则是可选的。属性最重要的特征是它的语法,语法定义本身也是一个目录对象。类别、属性和语法都是某个包容器对象下面的目录对象,被称为表结构(schema)

ADSI定义的接口中,最基本的接口为IADs接口,它是一个从IDispatch接口派生出来的双接口,并且所有的目录对象都必须实现IADs接口。

另一个重要的接口是IADsContainer,它是所有包容器对象必须要实现的接口。

IADsIADsContainer接口分别代表了目录服务中的目录对象和包容器对象,为了对一个名字空间进行各种目录操作,我们必须从最基本的根出发,ADSI为我们提供了接口IADsNamespaces用以表达名字空间对象。IADsNamespaces接口比较简单,它只有一个属性“DefaultContainer”,此属性指定了客户程序访问的基本包容器对象的路径。

仅仅一个IADs接口还难以表达一个目录对象的全部特征,前面已经提到,ADSI用类别来定义目录对象的特征,并且类别对象本身也是目录对象,它除了实现IADs接口外,还实现了IADsClass接口。IADsClass接口从IADs派生

IADsClass接口只有一个方法Qualifiers,用来返回描述附加限制对象的集合对象。在IADsClass接口的属性中,PrimaryInterface属性可直接指示客户程序去请求对应的接口ID,以便访问该类别所指示的属性,比如,在目录服务中,“User”类指示用户对象实现了一个ADSI接口IADsUser,它包含属性“姓”、“名”、“职称”、“电话”等等。

从类别到对象,它可以指定属性,那么目录对象的属性如何被指定呢?ADSI通过接口IADsProperty进行描述。

最后一个重要接口为IADsSyntax,它只有一个属性,OleAutoDataType long 代表此语法的自动化数据类型。

ADSI定义了许多接口,上面介绍的只是ADSI的基本接口,从这些接口我们可以看到,ADSI用表结构的方式描述目录对象的属性,这种方式可扩展性很强。目录对象本身是个抽象概念,它可以包含许多与应用有关的属性,ADSI目录服务提供者可以利用表结构描述这些属性,以便客户程序可以对目录对象进行有效的访问。

ADSI还定义了一些常用的目录对象使用的接口,比如IADsUserIADsOIADsComputerIADsGroupIADsOUIADsDomainIADsService,它们分别代表了用户、组织、计算机、用户组、部门、域、系统服务。

除了使用以上介绍的ADSI接口访问ADSI目录服务之外,客户程序也可以使用ADO的标准接口访问目录服务,它可以利用ADO的记录集对象访问ADSI的包容器,对包容器对象进行枚举或者检索。 

阅读(3696) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册