620A5p高程 下载 图21-3存放模式的容器对象 这个对象包含了描述模式的所有对象。从目录树栏的滚动条的长度可以看出,有数目庞 大的对象,这是由于AD有很多属性和类。往下滚动一点并选择描述计算机的模式项,将会看 到图21-4所示的屏幕截图。 u 图21-4描述计算机的模式 CN= Computer对象说明 Computer类的所有实例在目录里应是什么样,这也是它自己的类 标识为 classschema(类模式)的原因,它为一个特定的类定义模式!树控件中的其它大多数对 象是 attribute Schema(属性模式),这意味着它提供了有关某具属性的信息,如它的值的数据类 型和是否是多值的 设置 Properties列表框来看看 mustContain/属性。这是一个多值的属性,列出了计算机类所 有必选的属性的名字。另一属性 may Contain列出了计算机所有的可选属性。 奇怪的是,图21-4中的错误消息E_ADS_ PROPERTY NOTFOUND说明 mustcontain并不 包含任何内容。而在我安装的AD里,对这个 class schema对象, may Contain也给出相同的错误 消息。这有点奇怪,因为我们已经看到计算机拥有很多属性。这个表面上的矛盾引出了类的 个重要概念:继承( inheritance 21.3.5继承 目录里的类可相互派生( derive) 如果对COM有一定的使用经验,那么你也许已经知道一个接口可从另一个派生。如果接 A从接口B派生,那么A拥有B的所有属性和方法和A自己附加的属性和方法。所有COM接 口都显露三个方法: QueryInterface、 AddRef和 Release,因为它们都由 IUnknown派生。 如果你曾经用C艹+或Java编过面向对象的程序,也许已经接触过类的继承,这与刚才讲到
图21-3 存放模式的容器对象 这个对象包含了描述模式的所有对象。从目录树栏的滚动条的长度可以看出,有数目庞 大的对象,这是由于 A D有很多属性和类。往下滚动一点并选择描述计算机的模式项,将会看 到图2 1 - 4所示的屏幕截图。 图21-4 描述计算机的模式 CN = Computer对象说明C o m p u t e r类的所有实例在目录里应是什么样,这也是它自己的类 标识为c l a s s S c h e m a (类模式)的原因,它为一个特定的类定义模式!树控件中的其它大多数对 象是a t t r i b u t e S c h e m a (属性模式),这意味着它提供了有关某具属性的信息,如它的值的数据类 型和是否是多值的。 设置P r o p e r t i e s列表框来看看m u s t C o n t a i n属性。这是一个多值的属性,列出了计算机类所 有必选的属性的名字。另一属性 m a y C o n t a i n列出了计算机所有的可选属性。 奇怪的是,图2 1 - 4中的错误消息E _ A D S _ P R O P E RT Y _ N O T F O U N D说明m u s t C o n t a i n并不 包含任何内容。而在我安装的 A D里,对这个c l a s s S c h e m a对象,m a y C o n t a i n也给出相同的错误 消息。这有点奇怪,因为我们已经看到计算机拥有很多属性。这个表面上的矛盾引出了类的 一个重要概念:继承( i n h e r i t a n c e )。 21.3.5 继承 目录里的类可相互派生( d e r i v e )。 如果对C O M有一定的使用经验,那么你也许已经知道一个接口可从另一个派生。如果接 口A从接口B派生,那么A拥有B的所有属性和方法和 A自己附加的属性和方法。所有 C O M接 口都显露三个方法:Q u e r y I n t e r f a c e、A d d R e f和R e l e a s e,因为它们都由I U n k n o w n派生。 如果你曾经用C + +或J a v a编过面向对象的程序,也许已经接触过类的继承,这与刚才讲到 620计计ASP 3 高级编程 下载
Binapub.com 第1)1D和AD621 下载 的是一回事。如果类A从类B派生,则类A实现类B的所有成员函数和成员变量并有属于它自 己的成员函数和成员变量。 上述原则同样适用于目录的类,如果类A是B的继承类,那么实例A可以具有实例B的 class schema对象中所定义的必选和可选属性(注意,这里用了“可以”这个词,但对于必选属 性,用“必须”或许更恰当),还有A自己的 class Schema对象中的那些属性。 可以通过已有的类来生成新类。在C++里,甚至允许有抽象类( abstract),这些类是专门为 派生而定义的。实际上抽象类是不能真正创建它的对象的。C++程序员将看到目录中的抽象 类与C++里的抽象类作用相同 这解释了 adsyw. exe屏幕右边上方标记为 Derived from的行。这 行给出了当前被查看的对象的类的父类的名字。观察图21-4,会发 现类 classschema和dMD(包含所有模式项的对象的类)都是从一个名 person 叫top的类派生的。 Computer类是从User类派生的(听起来有奇怪, 但这是有意义的,因为 Computer类需要实现User类的几乎所有的属 organisationalPerson 性),而user是从包含了针对一般人的更广义的信息的 organizationalPerson类派生的 事实上,就AD而言,可以更深入一些。在AD(就这问题而言 可以是任何符合LDAP的目录)里的所有对象都有一个名叫 objectClass的属性。它是多值的,它的值是继承树中通往这个类的 所有(祖先)类的类名。对于一个 Computer类,其类链如图21-5所示 compute 如果在AD浏览器里的 Properties列表框中选择 objectClass项, 将看到这一点,如图21-6所示 图21-5目录中的类链 图21-6在目录浏览器中显示的类链 top类在AD里起着重要的作用。这是一个通用的类,有数目庞大的必选和可选的属性 Microsoft认为它对AD中的所有对象都有用。任何符合LDAP的目录中的所有对象归根结底都 是从top类派生的 到目前为止,你已经获得了关于目录结构的很多信息,这些信息将来我们都需要。现在 再进一步讲一下目录,以避免不明白图中列出的其它部分是干什么的。 CLSID是一个唯一的 GUID(用来标识对象的类)。标识为 Primary Interface的行是与ADSI有关的,与AD无关。使用 ADSI时,你会发现需要创建COM组件来访问目录对象,一个COM组件对应目录里的一个对 象。因为正在讲述ASP,所以仅使用ASP里的 IDispatch接口与COM对象通信。 Primary Interface是COM对象的“真正的”接口的ID,也就是当用VB或C++编程时可能直接使用的接
的是一回事。如果类 A从类B派生,则类A实现类B的所有成员函数和成员变量并有属于它自 己的成员函数和成员变量。 上述原则同样适用于目录的类,如果类 A是B的继承类,那么实例 A可以具有实例 B的 c l a s s S c h e m a对象中所定义的必选和可选属性 (注意,这里用了“可以”这个词,但对于必选属 性,用“必须”或许更恰当 ),还有A自己的c l a s s S c h e m a对象中的那些属性。 可以通过已有的类来生成新类。在 C + +里,甚至允许有抽象类( a b s t r a c t ),这些类是专门为 派生而定义的。实际上抽象类是不能真正创建它的对象的。 C + +程序员将看到目录中的抽象 类与C + +里的抽象类作用相同。 这解释了a d s v w. e x e屏幕右边上方标记为Derived From的行。这 行给出了当前被查看的对象的类的父类的名字。观察图 2 1 - 4,会发 现类c l a s s S c h e m a和d M D (包含所有模式项的对象的类 )都是从一个名 叫t o p的类派生的。 C o m p u t e r类是从U s e r类派生的 (听起来有奇怪, 但这是有意义的,因为 C o m p u t e r类需要实现U s e r类的几乎所有的属 性 ) , 而 u s e r 是 从 包 含 了 针 对 一 般 人 的 更 广 义 的 信 息 的 o rg a n i z a t i o n a l P e r s o n类派生的。 事实上,就A D而言,可以更深入一些。在 A D (就这问题而言, 可以是任何符合 L D A P 的目录 ) 里的所有对象都有一个名叫 o b j e c t C l a s s的属性。它是多值的,它的值是继承树中通往这个类的 所有(祖先)类的类名。对于一个C o m p u t e r类,其类链如图2 1 - 5所示。 如果在 A D浏览器里的 P r o p e r t i e s列表框中选择 o b j e c t C l a s s项, 将看到这一点,如图2 1 - 6所示。 图21-6 在目录浏览器中显示的类链 t o p类在A D里起着重要的作用。这是一个通用的类,有数目庞大的必选和可选的属性。 M i c r o s o f t认为它对A D中的所有对象都有用。任何符合 L D A P的目录中的所有对象归根结底都 是从t o p类派生的。 到目前为止,你已经获得了关于目录结构的很多信息,这些信息将来我们都需要。现在 再进一步讲一下目录,以避免不明白图中列出的其它部分是干什么的。 C L S I D是一个唯一的 G U I D (用来标识对象的类)。标识为Primary Interface的行是与A D S I有关的,与A D无关。使用 A D S I时,你会发现需要创建 C O M组件来访问目录对象,一个 C O M组件对应目录里的一个对 象。因为正在讲述 A S P,所以仅使用 A S P里的 I D i s p a t c h接口与 C O M对象通信。 P r i m a r y I n t e r f a c e是C O M对象的“真正的”接口的 I I D,也就是当用V B或C + +编程时可能直接使用的接 第2 1章 A D S I和A D介绍计计621 下载 图21-5 目录中的类链
622 SP3高级编程 Chia°deoM 下载 口,用ⅤB或C++编程时避免使用 IDispath 帮助文件名和环境提供了类对象的帮助信息。OID(对象标识符)是另一个唯一标识符,不 仅标识类,还标识其他信息,如定义这个类的组织的名字。我们并不需要关心对象标识符 214目录的特征 对AD的结构我们已有一些概念。前面所讲的有的部分是AD特有的,有的部分不是AD特 有的,而是所有符合LDAP标准的目录所具有的。对于前面所讲的一切,一般来讲,如果不是 实现细节,则大多数目录都满足 到目前为止,我们已经知道目录是一个分层的信息库,而且知道它包含着对象,对象包 含着很多属性 还有其他一些大多数目录的典型特征。 21.4.1优化查找 目录的主要目的是当需要时可以到它里面去查信息。因此,通常是按读操作的最优化实 现的。这基于经常地读目录而不是写目录的假设。AD正是这样优化 2142查找功能 前面所有的屏幕截图演示的都是浏览操作,也就是看看目录中不同的容器里有什么内容。 更经常的情况是进行查找。查找就是根据一个对象的一个或多个属性找出它在目录中的位置 例如,可能需要找出所有的两个月没有注册的用户帐号以禁用它们。尽管从屏幕截图中已经 看到,所有的用户帐号恰好全部存在于AD的同一个容器里,但要知道,实际不总是这种情况 通常要执行一下查找操作以确定已找到了所有的用户帐号。 目录一般支持非常复杂的查找请求。找出所有的两个月没有注册的用户帐号只是一个很 简单的请求。一个更复杂的请求可能是:显示注册名以“a”开头、两个月没有注册的除域管 理者以外的所有用户帐号。所有符合LDAP标准的目录,包括AD,都支持这种复杂级别的请 求,这使查找成为一个非常强大的概念。 214.3开放性 这意味着目录可以通过某一标准协议集进行访问。最常用的是LDAP协议。通过开放的标 准协议使目录具有可访问性,这使得编写与它通讯的客户端应用程序十分容易,可以不需要 去学习那些厂家专有的API AD符合LDAP标准,并且随着学习AD的不断深入,你会发现如何构造和访问数据是非常 重要的。AD有很多的特性,这些特性都是LDAP需要的 2144事务处理 很多商业数据库有相当完善的支持事务和当操作失败时回滚事务的功能。 SQL Server属 于这个范畴。ADO包括支持事务的方法,前提是数据源实现事务。在这里提到这个问题的原 因是事务处理在目录里通常并不是至关紧要的
口,用V B或C + +编程时避免使用I D i s p a t h。 帮助文件名和环境提供了类对象的帮助信息。 O I D (对象标识符)是另一个唯一标识符,不 仅标识类,还标识其他信息,如定义这个类的组织的名字。我们并不需要关心对象标识符。 21.4 目录的特征 对A D的结构我们已有一些概念。前面所讲的有的部分是 A D特有的,有的部分不是 A D特 有的,而是所有符合L D A P标准的目录所具有的。对于前面所讲的一切,一般来讲,如果不是 实现细节,则大多数目录都满足。 到目前为止,我们已经知道目录是一个分层的信息库,而且知道它包含着对象,对象包 含着很多属性。 还有其他一些大多数目录的典型特征。 21.4.1 优化查找 目录的主要目的是当需要时可以到它里面去查信息。因此,通常是按读操作的最优化实 现的。这基于经常地读目录而不是写目录的假设。 A D正是这样优化的。 21.4.2 查找功能 前面所有的屏幕截图演示的都是浏览操作,也就是看看目录中不同的容器里有什么内容。 更经常的情况是进行查找。查找就是根据一个对象的一个或多个属性找出它在目录中的位置。 例如,可能需要找出所有的两个月没有注册的用户帐号以禁用它们。尽管从屏幕截图中已经 看到,所有的用户帐号恰好全部存在于 A D的同一个容器里,但要知道,实际不总是这种情况, 通常要执行一下查找操作以确定已找到了所有的用户帐号。 目录一般支持非常复杂的查找请求。找出所有的两个月没有注册的用户帐号只是一个很 简单的请求。一个更复杂的请求可能是:显示注册名以“ a”开头、两个月没有注册的除域管 理者以外的所有用户帐号。所有符合 L D A P标准的目录,包括 A D,都支持这种复杂级别的请 求,这使查找成为一个非常强大的概念。 21.4.3 开放性 这意味着目录可以通过某一标准协议集进行访问。最常用的是 L D A P协议。通过开放的标 准协议使目录具有可访问性,这使得编写与它通讯的客户端应用程序十分容易,可以不需要 去学习那些厂家专有的A P I。 A D符合L D A P标准,并且随着学习 A D的不断深入,你会发现如何构造和访问数据是非常 重要的。A D有很多的特性,这些特性都是 L D A P需要的。 21.4.4 事务处理 很多商业数据库有相当完善的支持事务和当操作失败时回滚事务的功能。 SQL Server属 于这个范畴。A D O包括支持事务的方法,前提是数据源实现事务。在这里提到这个问题的原 因是事务处理在目录里通常并不是至关紧要的。 622计计ASP 3 高级编程 下载
第1)A0和D623 下载 214.5复制 检査一个软件是否有用的通常方法是看能否在企业环境具有可扩展性,目录也是如此 很多目录(包括AD)支持可扩展性的方法之一是允许它们自己被复制。换句话说,可以将目录 贝到多台机器上。对于AD,任何一个是域控制器的计算机都将存储一份AD的拷贝 有一个问题摆在我们面前:怎样确保不同拷贝里的内容是一致的。这问题也将潜在地引 发大量的网络数据流,因为每个拷贝都试图使自己保持与其他拷贝一样。的确,如果不小心 由这个问题产生的网络数据流可能会很容易将复制的初衷(可扩展性)破坏掉。 为解决这个问题,可借助于目录的另一个特性。前面已提到,完善的事务处理并不是目 录最优先考虑的。现在需要增加一点,当目录里同步不同的拷贝时,只要更新最终被执行了 就可以了。设计时AD就是这个观念。一份拷贝中允许有过时信息,但将在一段时间后与最新 的版本同步。AD执行一些完善的算法来确保这一点 215常见目录 以上讲了AD是什么和能做什么。下面介绍通常使用的可由ADSI访问的其他目录 2151 Netscape目录服务器 这是个可从 Netscape公司得到的通用的LDAP目录。这里的“通用”,意思是可以存储任 何内容。它是按具有高度可扩展性、分层数据存储、按读操作优化的原则设计的,而且有一 个只有少量限制(为维护与LDAP的兼容)的模式,你完全可以自己定义。 2152s元数据库 这是互联网信息服务器(IS)的配置数据的数据库。可通过ADSI访问它和Web站点上所 虚拟目录的细节。然而,元数据库( metabase)却不遵从LDAP标准 21.53 Exchange Server目录和站点服务器成员目录 所以把这二者放在一起是因为它们很快将与AD合并,将不再把它们作为分离的目录。 它们都是符合LDAP标准的。 Exchange Server目录提供如地址和分布列表等信息给 Exchange 而站点服务器成员目录存储了标识访问过该站点的用户的数据,用于产生为这些用户 定制的网页并提供专门的安全性支持。 2154 Netware目录服务 这是AD在 Novell网里的等价物,像AD一样存储了用户帐号、网络资源和安全权限等信息。 但是,它不遵从LDAP标准 215.5 WinNT 我把它放在最后,严格说来它根本就不应该在这个列表里。 WinNt是一个虚构的目录, 是作为ADSI提供者注册的COM组件集。换句话说,它允许通过ADSI存取目录。这些组件搜 集网络中用户和计算机帐号的信息以及在不同机器上运行的服务。这些信息被汇集起来并发
21.4.5 复制 检查一个软件是否有用的通常方法是看能否在企业环境具有可扩展性,目录也是如此。 很多目录(包括A D )支持可扩展性的方法之一是允许它们自己被复制。换句话说,可以将目录 拷贝到多台机器上。对于A D,任何一个是域控制器的计算机都将存储一份 A D的拷贝。 有一个问题摆在我们面前:怎样确保不同拷贝里的内容是一致的。这问题也将潜在地引 发大量的网络数据流,因为每个拷贝都试图使自己保持与其他拷贝一样。的确,如果不小心, 由这个问题产生的网络数据流可能会很容易将复制的初衷 (可扩展性)破坏掉。 为解决这个问题,可借助于目录的另一个特性。前面已提到,完善的事务处理并不是目 录最优先考虑的。现在需要增加一点,当目录里同步不同的拷贝时,只要更新最终被执行了 就可以了。设计时 A D就是这个观念。一份拷贝中允许有过时信息,但将在一段时间后与最新 的版本同步。A D执行一些完善的算法来确保这一点。 21.5 常见目录 以上讲了A D是什么和能做什么。下面介绍通常使用的可由 A D S I访问的其他目录。 21.5.1 Netscape目录服务器 这是个可从N e t s c a p e公司得到的通用的 L D A P目录。这里的“通用”,意思是可以存储任 何内容。它是按具有高度可扩展性、分层数据存储、按读操作优化的原则设计的,而且有一 个只有少量限制(为维护与L D A P的兼容)的模式,你完全可以自己定义。 21.5.2 IIS元数据库 这是互联网信息服务器 ( I I S )的配置数据的数据库。可通过 A D S I访问它和We b站点上所有 虚拟目录的细节。然而,元数据库 ( m e t a b a s e )却不遵从L D A P标准。 21.5.3 Exchange Server目录和站点服务器成员目录 之所以把这二者放在一起是因为它们很快将与 A D合并,将不再把它们作为分离的目录。 它们都是符合 L D A P标准的。Exchange Server目录提供如地址和分布列表等信息给 E x c h a n g e S e r v e r,而站点服务器成员目录存储了标识访问过该站点的用户的数据,用于产生为这些用户 定制的网页并提供专门的安全性支持。 21.5.4 Netware 目录服务 这是A D在N o v e l l网里的等价物,像A D一样存储了用户帐号、网络资源和安全权限等信息。 但是,它不遵从L D A P标准。 21.5.5 Wi n N T 我把它放在最后,严格说来它根本就不应该在这个列表里。 Wi n N T是一个虚构的目录, 是作为A D S I提供者注册的C O M组件集。换句话说,它允许通过 A D S I存取目录。这些组件搜 集网络中用户和计算机帐号的信息以及在不同机器上运行的服务。这些信息被汇集起来并发 第2 1章 A D S I和A D介绍计计623 下载
624Ap高程 Chia°pde 下载 送给客户端,好像它是一个单独的目录 这有两个理由。首先,考虑到很多网络用的还是NT40域控制器,而且其中很多在一定 时间内还不能升级到 Windows2000发布ADS和 Windows2000之间有着12个月的间隔)。很显 然,如果这些系统里的用户使用脚本语言和自动化COM组件,他们不能访问AD提供的用于访 问域信息的任何功能,这将是很糟糕的事。 WinNt提供者满足了这种要求 另外, WinNt允许访问属于各个机器的一些信息,例如运行NT服务。缺省情况下,这些 信息并不存储在以域为中心的AD里 216ADS的适用范围 图21-7表示了一个客户程序(典型的ASP页面)用ADS访问目录时,各种各样的软件联系在 起的方式 冈络:机器间 的边界 活动目录 ADSI LDAP LDAP 提供者 协议 目录 ASP页面 ADSI WinN 其他LDAP (客户) 提供者 目录 ADSI IIS 提供者 关于网络中计算机的信息 元数据库 冈络:机器间 的边界 图21-7客户程序与目录和其他软件之间的联系 图21-7表明ADSI介于目录和客户程序之间。可把它想像成一套能翻译客户所使用的API 的组件,这些API用于对目录的访问。ADSI是标准的基于COM的AP,ADSI是客户程序唯一 需要了解的API。从这种程度上,ADSI和ADO的工作方式相差不多。 注意图21-7中标出了客户程序通过网络的可能点,即实线与虚线相交的点。ADSI提供者 是进程内的组件,因此被放在运行ASP页面的机器上。另一方面,目录服务程序可能被放在 另一台机器上。在IS里,因为是在IS下运行ASP页面,所以IS肯定在ASP页所在的同一台机 器上!然而当在ⅤB或C++里用ADSI时不一定是这样,这也是为什么在网络中列出了IS元数 据库的原因 ADSI,和ADO一样,使用了一系列的提供者。一个ADSI提供者是一个能访问目录集或 某个特定目录的COM组件集。安装ADSI时,会发现它附带一些 Microsoft写的标准提供者(称
送给客户端,好像它是一个单独的目录。 这有两个理由。首先,考虑到很多网络用的还是 NT 4.0域控制器,而且其中很多在一定 时间内还不能升级到Windows 2000(发布A D S I和Windows 2000之间有着1 2个月的间隔)。很显 然,如果这些系统里的用户使用脚本语言和自动化 C O M组件,他们不能访问A D提供的用于访 问域信息的任何功能,这将是很糟糕的事。 Wi n N T提供者满足了这种要求。 另外,Wi n N T允许访问属于各个机器的一些信息,例如运行 N T服务。缺省情况下,这些 信息并不存储在以域为中心的 A D里。 21.6 ADSI的适用范围 图2 1 - 7表示了一个客户程序(典型的A S P页面)用A D S I访问目录时,各种各样的软件联系在 一起的方式。 图21-7 客户程序与目录和其他软件之间的联系 图2 1 - 7表明A D S I介于目录和客户程序之间。可把它想像成一套能翻译客户所使用的 A P I 的组件,这些A P I用于对目录的访问。 A D S I是标准的基于C O M的A P I,A D S I是客户程序唯一 需要了解的A P I。从这种程度上,A D S I和A D O的工作方式相差不多。 注意图2 1 - 7中标出了客户程序通过网络的可能点,即实线与虚线相交的点。 A D S I提供者 是进程内的组件,因此被放在运行 A S P页面的机器上。另一方面,目录服务程序可能被放在 另一台机器上。在I I S里,因为是在I I S下运行A S P页面,所以I I S肯定在A S P页所在的同一台机 器上!然而当在 V B或C + +里用A D S I时不一定是这样,这也是为什么在网络中列出了 I I S元数 据库的原因。 A D S I,和A D O一样,使用了一系列的提供者。一个 A D S I提供者是一个能访问目录集或 某个特定目录的 C O M组件集。安装A D S I时,会发现它附带一些 M i c r o s o f t写的标准提供者 (称 624计计ASP 3 高级编程 下载 网络:机器间 的边界 网络:机器间 的边界 ASP 页面 (客户) ADSI LDAP 提供者 LDAP 协议 活动目录 目录 其他LDAP 目录 关于网络中计算机的信息 元数据库 ADSI WinNT 提供者 ADSI IIS 提供者