第21章 ADSI和AD介绍
本章讨论活动目录服务接口(Active Directory Service Interface,ADSI)和活动目录(Active Directory,AD),以及怎样用ASP访问目录服务器和使用它们所包含的信息。这里的目录服务实际上是指一种特定的数据库,该数据库能够有效的查找网络资源目录的一类信息。AD是一种网络资源目录,而ADSI是能够访问任何目录的Microsoft技术。其他公司也有类似的的技术,例如Sun公司的JNDI,但因本书的是针对Windows的,所以在此只讨论ADSI。
不要混淆ADSI和AD,它们是两种截然不同的技术。尽管如此,因为这两种技术确实是密切的相互作用,我们还是将他们放在同一章里讨论。AD是随着Windows 2000诞生的大而新的目录,包含了所有的安全性和管理本地的网域所需要的其他信息。另一方面,ADSI是一套Microsoft作为访问任何目录的方法而推出的COM接口,这意味着ADSI也是访问AD的通常方法。尽管AD只存在于Windows 2000 Server和Windows 2000 Advanced Server中,ADSI却适用于所有的32位操作系统:Windows 2000 Professional、NT 4.0和Windows 9x。
本章的目的是使读者掌握怎样使用ASP语言简单而又容易的访问目录,因此本章的重点是ADSI,但由于AD的重要性,本章也接触到AD的一些相关功能。
21.1 ADSI的用途
这里有两个相关的问题。前面讲过ADO,在技术上ADO符合Microsoft的UDA规范,本书第二部分里已深入讨论过。ADO能访问任何有OLE DB提供者的数据源。目录是另一种类型的数据源,为了使用目录,必须使用一种不同的技术——ADSI。为了理解为什么要使用ADSI,需要理解是什么使目录不同于一般的数据源,以及ADSI能做哪些ADO不能做的事。
ADO的确是一种通用的技术。原理上,Microsoft的目录是让ADO可以访问任何数据源,而不管这种数据源的内部结构。但又在本质上重视关系型的数据源。这没什么错,但着也确实意味着如果想访问分层结构的数据源,ADO可能不总是最有效的办法。因此引入ADSI,因为ADSI正是专门分层结构数据源而设计的。精心设计的ADSI使用户在浏览树状结构时感到比较容易,而ADO就没那么轻松。
上面提到的分层结构的数据源和目录,它们是一回事么?它们相似,但不完全相同。下面先讨论相同点,即它们都是树状结构,再讨论目录区别于数据库和数据源的特征。
分层结构的数据源是按树状结构组织起来的,对象包含着其他对象,与Windows的文件系统中的文件夹包含文件和文件夹一样,而多数目录也是这样的结构。
事实上,体会这一点最简单的方法是快速浏览AD的结构。图21-1是从adscw.exe中截取的, adscw.exe是一个通用目录浏览器,可用于任何基于ADSI的目录(包括AD)。adscw.exe是由ADSI某种原因SDK提供的。
图21-1中有很多我们将研究的内容,我们在后面在回来讲述,如果现在不能全看懂也不必担心。请注意左边点击树状结构,它是一个标准的树控件,清楚的显示了AD中数据的分层排列。以CN=Simon Robinson为例,这是作者在局域网上的帐号,它的父级CN=User。在目录用语里,父子关系称为包含关系。CN=User称为一个容器,包含了CN=Simon Robinson对象。在这个AD中,CN=User实际上包含了此域中所有的用户帐号,不过实际情况不总是这种。
同样,用户容器也被代表域的对象DC=TopOfThePops包含这。DC=TopOfThePops容易让人误解,因为域的全名是DC=TopOfThePops,DC=Frame,DC=com,对应于一个虚拟的URL:TopOfThePops.Fame.com(Windows 2000支持这样的域名,而任何NT4.0的机器只能识别第一部分的TopOfThePops)。不要为这些名字的格式而担心,这是AD专用的,你很快就会适应,CN代表普通名(Common Name),而DC代表域组件(Domain Component)。
最后,树中的域节点被LDAP对象包含。LDAP代表轻量目录访问协议(Lightweight Directory Access Protocol),这是一个访问目录的工业标准协议,该协议的引入表明了AD是与LDAP相联系的。后面将进一步讨论LDAP。
迄今为止,所做的工作指出我们正在存储大量的对象信息,并正在以分层方式管理这些信息。顺便提一下,这里所说的对象是通常意思下的,不是技术上的,在这里不指COM对象。AD提供了一个非常好的例子,展示了ADSI所能访问的目录的结构。下面将探讨AD的细节,并演示目录的典型结构。然后就可以学习如何用ADSI去得到和修改目录中的信息。
但首先,来看一下如何获得所需软件。
21.2 必需的软件
在这一节中,由于ADSI和AD需要的软件不同,我们将分别讨论它们。
Windows 2000集成了AD。如果你的计算机运行在Windows 2000下,并将其作为域控制器,则已经安装了AD,反之则不会。关键在于是否把Windows 2000作为域控制器。如果在一个域内的Windows 2000工作站,由一个NT4.0的主域控制器控制,也不会有AD。
ADSI也是Windows 2000操作系统中的一部分,但能够从Microsoft的Web站点上下载用于NT4。0和Windows 9x的ADSI。另外,可能需要ADSI SDK 来开发软件。无论正在用什么操作系统。都需要下载这个SDK。它包含了各种各样的头文件很文档。尽管编写ASP程序时,它不如用VB或C++编程时那么必须,但它包含了图21-1中使用的adsvw.exe实用程序。
下面将使用adsvw.exe进一步研究AD。adsvw.exe也叫做活动目录浏览器,这名字有些误导作用。这是一个通用的目录浏览器,可以检测任何ADSI兼容的目录,而不止是AD。活动目录浏览器是一个好工具,因为其本身使用ADSI搜集信息,并显示给我们。因此,我们看到的信息的格式恰恰就是用ADSI编程时所需要的。
正如前面提到的,adsvw.exe是ADSI SDK的一部分,可以从微软的WEB站点上下载。如果没有的话,我们建议下载一个拷贝,你会发现对于研究目录,它是非常有用的。
21.3 AD的内部结构
AD包含了一个域控制器管理一个域所需的全部信息。从这个意义上讲,它与NT4。0服务器中的域目录(domain directory)是一样的。所不同的是它符合LDAP标准。因为LDAP是工业标准,所以很容易编写用标准的API函数(包括ADSI)来访问AD的客户程序。相比之下,NT4。0上相应的数据库却是微软专用的,通过Windows API函数只能得到少得可怜的信息。实际上,根本不能把该数据库用作集中管理网络资源的目录,但AD可以。
另外,AD远比原有的NT4。0域目录强大。它连同WINDOWS 2000一起,支持下列概念:把域本身排列成域树(domain tree),或允许很多独立的树共享配置数据,形成一个域林(domain forest)。还允许把个人信息象操作系统使用的资料一样存储进去。
就AD中存储的信息而言,实际上有两个部分。缺省情况下,AD包含了管理一个域所需要的全部信息,如:计算机、用户和工作组帐号,以及相应的安全权限。另一方面,AD被设计成通用的目录,这意味着任何其他系统管理员认为有用的内容都可以存入AD。所以像用户帐号这样的信息也可能出现在薪金明细和公司组织结构下面。AD还有一套非常完善点击安全系统,由管理员分配细致的等级,决定谁具有对各式各样信息的读或写的权利。
但是,令我们感兴趣的还是AD的整体结构,我们将给出一个一般的目录例子。
21.3.1 目录里的对象和属性
需要理解的第一件事是:关系型数据库把数据存储在表的行和列里,而在目录里一个很重要的概念是对象,对象含有需要存放的信息。在图21-1的屏幕截图中,我们就选了一个用户帐号的对象。AD中的其他对象包括计算机、域和工作组等。稍后,当我们讨论WINNT决定ADSI提供者时将要碰到其他目录里面的对象,如服务对象和打印队列对象等。
不要把目录中的对象与COM对象(组件)相混淆,目录里的对象与COM毫不相干。它们有属性,但通常不具有方法。
实际上目录中通常除了对象没有别的,对象被排成层状。对象可以被认为是由许多属性组成的。
注意在这里我们不是在讨论COM自动