ADSI 架构模型

架构类似于字典,因为它保存有目录服务已知每种类型的对象的定义。 ADSI 客户端应用程序可浏览整个架构,以发现任一给定 ADSI 实现的功能。 此外,ADSI 提供可用于与目录服务的基础架构进行通信的架构管理接口。

某些架构可进行扩展,而 ADSI 提供程序或第三方供应商可选择为现有接口发布新的接口或其他属性。 ADSI 客户端使用此数据来确定每个目录服务所支持的功能。

共有三种架构对象:类、属性和语法,而它们分别支持架构管理接口 IADsClassIADsPropertyIADsSyntax

注意

类属于重载词。 具体则有 C++ 类、Java 类、COM 类和 ADSI 类。 在此文档中,除非另行限定,否则字类均指架构对象的类别或类型。

 

ADSI 会提取每个目录服务的架构,并将其置于命名空间对象中的每个顶级根节点内。 若要确定目录服务在给定根节点上支持哪些类,请枚举架构对象并获取类对象、属性对象和语法对象的列表。 有关详细信息,请参阅使用 ADSI 架构

ADSI LDAP 提供程序架构缓存

ADSI 的 LDAP 提供程序会尝试将架构数据缓存到本地计算机。 子架构将由存储在 subSchemaSubEntry 属性中的可分辨名称(位于目录服务企业根 (rootDSE) 中)进行标识。 除提供子架构数据外,LDAP v3 服务器还应公开一个 modifyTimeStamp 属性,而该属性可用于确定上次修改架构的时间。

当 ADSI 首次绑定到 LDAP 服务器时,它将使用 subSchemaSubEntry 属性检索子架构数据。 如果 ADSI 成功找到子架构对象,它便会存储一个指针,而该指针会指向连接到 LDAP 服务器的计算机上的注册表中的数据。 有关这些值在注册表中确切存储位置的信息,请参阅 ADSI 和用户帐户控制

然后,ADSI 会尝试处理该架构数据并读取 modifyTimeStamp 属性。 如果 modifyTimeStamp 属性存在且 ADSI 已成功处理架构,ADSI 则会将子架构写入磁盘,并在此键下创建以下两个注册表值。 如果子架构数据存在但无法进行处理,则不会创建以下两个注册表值:

  • Time 值,其中包含 modifyTimeStamp 属性。 此值可用于确保该架构数据为最新,并阻止不断重载该架构数据。
  • File 值,其中包含 ADSI 在文件系统中存储该架构数据的路径。 默认情况下,ADSI 会使用对应于 LDAP 服务器名称的文件名来缓存 <systemroot>\SchCache 目录中的子架构。

如果可处理该子架构数据,但未公开 modifyTimeStamp 属性,则会将该架构数据缓存在内存中,但不写入磁盘。 如果已通过本地计算机上的 ADSI 访问 LDAP v3 服务器,但不存在已缓存的子架构,则很可能源于以下原因之一:

  • 服务器未公开正确的属性。
  • ADSI 无法处理此架构。
  • ADSI 无法将此文件写入文件系统。