第1)AD和AD625 下载 为系统提供者)。所能得到的提供者某种程度上依赖于所安装的软件,它们一般包括 ·LDAP提供者:能访问任何符合LDAP标准的目录。 WinNT提供者:能访问NT4控制的域中的机器上的信息。 ·IS提供者:能访问IS元数据库 NWCompat和NDS提供者:能访问 Novell I目录 你可能已注意到这正好与前面所看到的常见目录的列表相对应 请注意,尽管这些提供者被不同的组件实现,但它们一般提供相同的接口 本章将主要讨论LDAP和 WinNt提供者。用 WinNt提供者来浏览它显示出来的目录,用 LDAP提供者浏览AD 注意没有单独的“AD提供者”,因为AD完全符合LDAP兼容标准,LDAP提供者 完全能满足需要。这也是为什么AD里所有的 ADsPaths都以“LDAP:”开头的原因。 217LDAP的适用范围 前面已经说明,LDAP是一个访问目录的标准协议。从这方面讲与ADSI很相像,这可能 会让人感到奇怪:为什么有两个标准,为什么图21-7中先通过ADSI,再通过LDAP来访问AD 和其他LDAP目录 LDAP不是一个 Microsoft标准,是一个被承认了的工业标准。它不是为脚本语言而设计的 标准,相反被设计成能够提供一种普通的传输方式,使得在目录里的查询等操作能沿网络传 输。如果读一下LDAP自身的规范(RFC2252),将会发现它充满了信息格式等内容。其辅助规 范(RFC2253~2256),更是包含了几乎只与高级程序员有关的内容,如LDAP使用的CN= whatever格式(称为区别名, distinguished name)的定义 RFC是 Internet上建议使用的定义协议的文档。最终在给定的RFC里提出的建议 将被正式做为一个标准接受,这种情况下RFC提供了协议的最后定义,上面提到的 与LDAP相关的RFC就是这样。可在下面网址找到RFC的列表:http://www ietf org/rfc/a LDAP确实引入了一个API,这是一套C语言风格的函数。如果用C或C++编程,这当然很 好,如果用ASP编程,它恐怕不太好使用 相比之下,ADSI是 Microsoft定义的,并不是工业标准。ADSI的定义着重在最终客户端可 “看到”的接口。对于我们,客户是ASP页面,尽管客户程序也可用C++、VB和其它众所周知 的语言编程,但现在关注的是ASP页面的情况。ADSI的定义里没有任何关于怎样与目录服务 通信的内容,也没有任何关于网络信息传输协议的内容。从这个意义上,ADSI有时被看作客 户端的API:它用来定义客户程序使用的API。客户程序需要关心的只是能有一个ADS提供者 与需要的目录通信,而这个提供者如何与目录通信是实现的细节,这与客户程序无关。 从这段说明不难看出ADSI和LDAP是怎样结合在一起的。一方面,有了用于客户端脚本 程序的容易使用的AP的规范,另一方面,有了用于在网络上与目录服务通信的优良协议。如 果能编写一个使用这个协议的ADSI提供者,则就拥有了脚本程序用来访问响应这一协议的任 何目录服务的提供者。这就是所谓的 ADSI LDAP提供者。可以将其想像成在LDAP和ADSI之 间转换的组件。可用 ADSI LDAP提供者来访问任何遵循LDAP标准的目录,包括AD
为系统提供者)。所能得到的提供者某种程度上依赖于所安装的软件,它们一般包括: • LDAP提供者:能访问任何符合L D A P标准的目录。 • Wi n N T提供者:能访问N T 4控制的域中的机器上的信息。 • IIS 提供者:能访问I I S元数据库。 • NWCompat和N D S提供者:能访问N o v e l l目录。 你可能已注意到这正好与前面所看到的常见目录的列表相对应。 请注意,尽管这些提供者被不同的组件实现,但它们一般提供相同的接口。 本章将主要讨论 L D A P和Wi n N T提供者。用 Wi n N T提供者来浏览它显示出来的目录,用 L D A P提供者浏览A D。 注意没有单独的“A D提供者”,因为A D完全符合L D A P兼容标准,L D A P提供者 完全能满足需要。这也是为什么 A D里所有的A D s P a t h s都以“L D A P:”开头的原因。 21.7 LDAP的适用范围 前面已经说明, L D A P是一个访问目录的标准协议。从这方面讲与 A D S I很相像,这可能 会让人感到奇怪:为什么有两个标准,为什么图 2 1 - 7中先通过A D S I,再通过L D A P来访问A D 和其他L D A P目录。 L D A P不是一个M i c r o s o f t标准,是一个被承认了的工业标准。它不是为脚本语言而设计的 标准,相反被设计成能够提供一种普通的传输方式,使得在目录里的查询等操作能沿网络传 输。如果读一下L D A P自身的规范(RFC 2252),将会发现它充满了信息格式等内容。其辅助规 范( R F C 2 2 5 3 ~ 2 2 5 6 ),更是包含了几乎只与高级程序员有关的内容,如 L D A P使用的 CN = w h a t e v e r格式(称为区别名,distinguished name)的定义。 R F C是I n t e r n e t上建议使用的定义协议的文档。最终在给定的 R F C里提出的建议 将被正式做为一个标准接受,这种情况下 R F C提供了协议的最后定义,上面提到的 与L D A P相关的 R F C 就是这样。可在下面网址找到 R F C的列表: h t t p : / / w w w. i e t f . o rg / r f c /。 L D A P确实引入了一个A P I,这是一套C语言风格的函数。如果用 C或C + +编程,这当然很 好,如果用A S P编程,它恐怕不太好使用。 相比之下,A D S I是M i c r o s o f t定义的,并不是工业标准。 A D S I的定义着重在最终客户端可 “看到”的接口。对于我们,客户是 A S P页面,尽管客户程序也可用 C + +、V B和其它众所周知 的语言编程,但现在关注的是 A S P页面的情况。A D S I的定义里没有任何关于怎样与目录服务 通信的内容,也没有任何关于网络信息传输协议的内容。从这个意义上, A D S I有时被看作客 户端的A P I;它用来定义客户程序使用的 A P I。客户程序需要关心的只是能有一个 A D S I提供者 与需要的目录通信,而这个提供者如何与目录通信是实现的细节,这与客户程序无关。 从这段说明不难看出 A D S I和L D A P是怎样结合在一起的。一方面,有了用于客户端脚本 程序的容易使用的A P I的规范,另一方面,有了用于在网络上与目录服务通信的优良协议。如 果能编写一个使用这个协议的 A D S I提供者,则就拥有了脚本程序用来访问响应这一协议的任 何目录服务的提供者。这就是所谓的 ADSI LDAP提供者。可以将其想像成在 L D A P和A D S I之 间转换的组件。可用 ADSI LDAP 提供者来访问任何遵循 L D A P标准的目录,包括 A D、 第2 1章 A D S I和A D介绍计计625 下载
626Ap高程 Chia°deo 下载 Exchange Server目录和 Netscape目录服务器。这就是为什么图21-7中有几个目录可以通过 ADSI和LDAP链进行访问的原因。 21.8绑定到一个ADS对象 在这一节中将开始编一些程序。首先,使用 WinNT提供者,然后与AD进行比较。因为这 能确保即使在NT40环境下这些程序仍能运行,还因为 WinNT毕竟有更简单的目录结构,使 得对ADSI的介绍大大简化。等到有更多的编程经验时,再回到AD。 用 VBScript绑定到一个ADS对象很简单,只需向Ⅴ SCript里的 Getobject方法提供对象的 ADsPath,如下所示 Dim objDomain Set objDomain Getobject("WinNT: //TopofThePops) 运行了这一句后, objDomain将拥有一个 ADSI COM组件的引用,通过使用 Ads Path “ WinNt:/ TopOfThe Pops”访问这个对象。因为现在运行的是NT40中的 TopOfThe Pops域, 这个对象由 WinNT提供者提供,代表我们的域。 不论使用什么样的提供者,绑定到一个对象都是这样的步骤。例如,如果想用AD来看 下自己的用户帐号,可以这样 Dim objUser bject LDAP://CN=Simon Robinson, CN-Users, DC-TopofThePops, DC=Fame, DC-com' 在其他的例子里,直接使用了 A DsPath,这是因为我们对它及其结构非常熟悉 如果不能确定一个 ADsPath,一个好办法是利用 adsyw. exe来浏览一下整个目录。稍 后,讲到査找时,将不需要提供 ADSPath来定位对象,查找操作将找到它们。 注意到使用不同的提供者是多么容易了吗?不需要像在ADO里那样为设定一个连接字符 串而烦恼。每个对象的 ADsPath都是以提供者的名字打头,紧接着是“:∥",因此 Getobject仅 根据 ADsPath就能知道需要哪个提供者。当提供了正确的 ADsPath时将得到指向正确组件的引 用 ADsPath里“:∥”后的具体格式决定于具体的提供者,从前面的例子中会发现 Winnt以 “/”分隔组件,而LDAP以“,”(逗号)分隔。还有,从左至右, WinNt是下行目录,而LDAP 是上溯目录。还可看出开头的 Winnt或LDAP是大小写敏感的,但后面的字符串则不敏感 2181ADS对象和 Directory.对象 前面已经强调过不要把COM对象和目录对象混淆,然而可能会发现 Getobject给出的总是 对COM对象的引用。这怎么办?ADSI做得很聪明。你得到一个COM对象(即一个组件)的引用 这组件存在于本地的机器上,甚至是进程内的组件,除非由COM+进入运行用户的ASP页中的 这组件不是目录里的对象,但它装作是目录里的对象,可说它是目录里的对象的代理。尽管 有些情况下需要注意到他们之间的区别,但就一般应用程序而言,可把它看成目录对象自身。 所以在说明了要注意COM对象和目录对象之间的区别之后,在编写ASP页时,可把它们当做 同一回事。以下就是这样做的。 然而,仍需意识到这种区别,以便知道程序代码到底是怎样执行的,但在大多时间它并
Exchange Server目录和N e t s c a p e目录服务器。这就是为什么图 2 1 - 7中有几个目录可以通过 A D S I和L D A P链进行访问的原因。 21.8 绑定到一个A D S I对象 在这一节中将开始编一些程序。首先,使用 Wi n N T提供者,然后与A D进行比较。因为这 能确保即使在NT 4.0环境下这些程序仍能运行,还因为 Wi n N T毕竟有更简单的目录结构,使 得对A D S I的介绍大大简化。等到有更多的编程经验时,再回到 A D。 用V B S c r i p t绑定到一个A D S I对象很简单,只需向 V B S c r i p t里的G e t O b j e c t方法提供对象的 A D s P a t h,如下所示: 运行了这一句后, o b j D o m a i n将拥有一个 ADSI COM组件的引用,通过使用 A d s P a t h “Wi n N T: / / To p O f T h e P o p s”访问这个对象。因为现在运行的是 NT 4.0中的To p O f T h e P o p s域, 这个对象由Wi n N T提供者提供,代表我们的域。 不论使用什么样的提供者,绑定到一个对象都是这样的步骤。例如,如果想用 A D来看一 下自己的用户帐号,可以这样: 在其他的例子里,直接使用了 A D s P a t h,这是因为我们对它及其结构非常熟悉。 如果不能确定一个 A D s P a t h,一个好办法是利用 a d s v w. e x e来浏览一下整个目录。稍 后,讲到查找时,将不需要提供 A D s P a t h来定位对象,查找操作将找到它们。 注意到使用不同的提供者是多么容易了吗?不需要像在 A D O里那样为设定一个连接字符 串而烦恼。每个对象的 A D s P a t h都是以提供者的名字打头,紧接着是“ : / /”,因此G e t o b j e c t仅 根据A D s P a t h就能知道需要哪个提供者。当提供了正确的 A D s P a t h时将得到指向正确组件的引 用。 A D s P a t h里“: / /”后的具体格式决定于具体的提供者,从前面的例子中会发现 Wi n N T以 “/”分隔组件,而L D A P以“,”(逗号)分隔。还有,从左至右, Wi n N T是下行目录,而L D A P 是上溯目录。还可看出开头的 Wi n N T或L D A P是大小写敏感的,但后面的字符串则不敏感。 21.8.1 ADSI对象和D i r e c t o r y对象 前面已经强调过不要把 C O M对象和目录对象混淆,然而可能会发现 G e t O b j e c t给出的总是 对C O M对象的引用。这怎么办?A D S I做得很聪明。你得到一个C O M对象(即一个组件)的引用。 这组件存在于本地的机器上,甚至是进程内的组件,除非由C O M +进入运行用户的A S P页中的。 这组件不是目录里的对象,但它装作是目录里的对象,可说它是目录里的对象的代理。尽管 有些情况下需要注意到他们之间的区别,但就一般应用程序而言,可把它看成目录对象自身。 所以在说明了要注意 C O M对象和目录对象之间的区别之后,在编写 A S P页时,可把它们当做 同一回事。以下就是这样做的。 然而,仍需意识到这种区别,以便知道程序代码到底是怎样执行的,但在大多时间它并 626计计ASP 3 高级编程 下载