从类别到对象,它可以指定属性,那么目录对象的属性如何被指定呢?ADSI通过接口IADsProperty进行描述,IADsProperty接口的属性和方法如表6所示。
表6 IADsProperty接口的属性
属性名
类型
说明
OID
BSTR
唯一的对象标识符
Syntax
BSTR
语法路径
MaxRange
long
对于多值属性,最大属性数
MinRange
Long
对于多值属性,最小属性数
MultiValued
VARIANT_BOOL
多值属性标志
最后一个重要接口为IADsSyntax,它只有一个属性,如表7所示。
表7 IADsSyntax接口的属性
属性名
类型
说明
OleAutoDataType
long
代表此语法的自动化数据类型
ADSI定义了许多接口,上面介绍的只是ADSI的基本接口,从这些接口我们可以看到,ADSI用表结构的方式描述目录对象的属性,这种方式可扩展性很强。目录对象本身是个抽象概念,它可以包含许多与应用有关的属性,ADSI目录服务提供者可以利用表结构描述这些属性,以便客户程序可以对目录对象进行有效的访问。
ADSI还定义了一些常用的目录对象使用的接口,比如IADsUser、IADsO、IADsComputer、IADsGroup、IADsOU、IADsDomain、IADsService,它们分别代表了用户、组织、计算机、用户组、部门、域、系统服务。
除了使用以上介绍的ADSI接口访问ADSI目录服务之外,客户程序也可以使用ADO的标准接口访问目录服务,它可以利用ADO的记录集对象访问ADSI的包容器,对包容器对象进行枚举或者检索。ADO与ADSI的关系如图3所示。
图3 客户程序访问ADSI目录服务的两种方法
三、ADSI编程模型
了解了ADSI的基本结构之后,现在我们再讨论ADSI的编程模型。首先,我们介绍目录对象的路径表示法,通常我们使用URL路径表示法,如下:
<Namespace>:
或者 <Namespace>://<Provider-specific stuff>
如果我们不知道名字空间的符号表示,可以从ADSI的最基础的根“ADS:”开始,比如,我们在NT 4.0下对“ADS:”进行枚举可以得到以下5个名字空间:
IIS
LDAP:
NDS:
NWCOMPAT:
WinNT:
如果我们要用ADSI访问NT用户信息,可以使用下面格式的路径:
WinNT://<domain_name>/<User_Name>
如果我们要用ADSI访问Microsoft Exchange Server的用户信息,可以使用下面格式的路径:
LDAP://<Server_Name>/cn=<User_Name>,cn=Recipients,ou=<Site_Name>,o=<Organization_Name>
这表示在<Organization_Name>组织下的<Site_Name>站点中的帐户<User_Name>,<Server_Name>为此站点的一个服务器,它提供LDAP服务。
下面我们讨论几个基本的编程问题:
(1) 绑定到路径指定的对象。
客户程序可以利用以下的方法绑定到路径所指定的对象:
□ C或者C++程序可以使用ADsGetObject或者ADsOpenObject获得指定对象的接口指针,如果我们不能确定对象支持哪个接口,我们可以在函数中指定接口IADs,因为所有的ADSI目录对象都支持此接口,函数返回之后,再调用QueryInterface成员请求其它的接口指针。
□ 对于VB或者VBScript应用程序,可以调用GetObject函数得到指定的目录对象。