AD & ADSI入门[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 mittermeyer 的 blog

ad简介
active directory(以下简称ad)可以认为是一个大的层次结构数据库,集中存储的内容必须遵循ad当前所定义的schema。我觉得ad中最重要的内容就是schema,然后是adsi。
 
schema定义了数据存储的格式。包括类(classschema),分为抽象类(abstract)、附属类(auxiliary)
和结构类(structure)三种;属性(attributeschema),分为单值和多值属性;以及类和属性之间的关系,分为可选属性和必要属性。ad中的schema相当于全局的catalog,在整个ad的forest中是全局唯一的,任何的修改都会被同步。所以有关schema的修改需要有schema administrators的权限。而且schema的内容只能增加,不能删除,过程是不可逆的,最多只能禁止一些属性或者类,而且还有诸多限制,详见文档。
 
在ad中存储的数据被当作一个一个的对象,每一个对象是一个classschema的实例。都有一个唯一的路径访问。ad中对象的路径由所支持的provider决定,windows 2000默认的provider有四个,安装iis的话会增加一个iis的provider,对iis进行管理。通常使用比较多的是ldap,可以通过这个provider针对域用户以及其他扩展信息进行访问和管理。winnt是针对nt4的帐号管理,估计是向下兼容。另外两个是对netware的dn的访问,对我们而言不太会用到,不赘述了。
 
adsi(active directory service interface)是用来对ad中存储数据的访问接口,我认为他是一个架空的框架,与具体的数据访问无关,只是给上层应用提供一个统一的接口。实际工作的就是provider,应当是provider访问数据,然后包装成adsi要求的形式,这些工作对用用户来说完全透明。
另一个比较爽的地方是adsi提供了比较好的扩展的方式,你能够非常容易的增加新的类,或者给已有的类增添新的方法。
需要解释一下,虽然adsi和ad经常一起出现,但是ad和adsi是两码事,adsi不仅仅能访问ad,还可以访问iis以及netware所存储的数据。你只要按照要求提供相应的provider,adsi可以干任何事情。
 
 
ad编程
ad的编程到目前来看涵盖的内容非常多,从最粗糙的使用adsi对ad中已有的数据访问,到比较高级的扩展ad。我认为扩展ad才是这部分编程中比较重要的内容,因为针对任何具体的应用多绘有自己特定的信息,而应用ad主要是为了利用ms提供的安全性以及分布式存储,如果将这两方面结合起来,就需要为了自身的应用对ad进行扩展。
如果需要为已有的类(接口类)添加方法,那么需要编写adsextension类;如果需要在ad中存储扩展信息,就需要修改schema,增加新的类(classschema)或者属性(attributeschema);更进一步的话,完全可以自己实现一个provider,实现自己的查询和数据存储的方式,这一部分内容已经不仅仅局限于ad了。
  • 通过adsi访问ad
    通过adsi访问ad比较简单,实际上是应用winnt和ldap这两个provider。除了通用接口iads、iadscontainer、iadsdirectorysearch等以外,windows默认提供了一些接口类如iadsuser、iadsgroup,当安装了一些基于ad的服务之后,又会增加一些专有接口,如安装exchange 2000之后,会出现person,同时扩展了user。
    在使用ad的过程中比较重要的一个问题是访问者的权限,如果使用getobject的方式操作,那么应用程序是以当前登录用户的权限访问ad,很多的写操作是被拒绝的。使用iadsopendsobject->opendsobject可以指定操作对象的用户,当然这就需要实现得到指定用户的口令。
    第二个需要注意的地方就是ad的path,有两个最常用的前缀(姑且这么叫吧):cn(common name)和dc(domain controller)。另外对于ldap从左到右范围增大,而winnt从左到右范围是减小,比如访问我的帐号,路径分别为ldap://cn=mittermeyer,cn=users,dc=cn,dc=corp,dc=company,dc=com,winnt://cn.corp.company.com/users/mittermeyer。另外据说ad是区别大小写的,我看下来他有一种数据类型是区别大小写的字符串,但是路径这里好像无所谓,cn=和cn=都行。
    第三个需要注意的地方就是查询语法。查询的话,一共提供了两种方式,一个是iadssearchdirectory接口,iadsdirectorysearch完成查询过程和处理查询结果的全部工作,我个人认为这种方式不太适合vb的程序;另一种方式是使用ado。ad针对ado有一个provider(adsdsoobject),使用这种方式返回一个ado.recordset,处理结果和关系型数据库的查询完全一致,这种方式vb比较容易上手。ado的方式查询可以使用sql的语法,也可以使用ldap的语法;而iadsdirectorysearch只能使用到的是ldap的语法。
 
    这一部分比较有趣的是扩展接口,就是写一个接口作为已经存在的接口类的扩展。扩展接口本身只是继承idispatch就可以了,但是如果需要支持后期绑定,那么还需要实现iadsextension所要求的一系列方法,看上去是模板,就是一个套路,所以这部分工作还是比较简单的。
    关键是把自己编写的接口和已经存在的接口类关联,嘿嘿!也很简单,只要在注册表里加一项就可以了。(ms想到的方法总是比较容易理解,不过在整体框架那里还是花了很多心思的,所以架子有了扩展就容易了。)例如:以及下就是exchange加的对user地扩展,它表明exchange针对user有一个扩展的coclass--mailbox,其中包含了两个接口imailrecipient和imailboxstore。
[hkey_local_machine\software\microsoft\ads\providers\ldap\extensions\user]
[hkey_local_machine\software\microsoft\ads\providers\ldap\extensions\user\{25150f21-5734-11d2-a593-00c04f990d8a}]

本文关键:AD,ADSI,VB
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top