ADSI 架构模型
架构类似于字典,因为它保存目录服务已知的每种类型的对象的定义。 ADSI 客户端应用程序可以浏览架构,以发现任何给定 ADSI 实现的功能。 此外,ADSI 提供可用于与目录服务的基础架构通信的架构管理接口。
某些架构是可扩展的,ADSI 提供程序或第三方供应商可以选择为现有接口发布新接口或其他属性。 ADSI 客户端使用此数据来确定每个目录服务支持哪些功能。
有三种类型的架构对象:类、属性和语法,分别支持架构管理接口 IADsClass、IADsProperty,以及 IADsSyntax。
注意
类是重载术语。 有C++类、Java 类、COM 类和 ADSI 类。 在此文档中,除非另有限定,否则单词类是指架构对象的类别或类型。
ADSI 提取每个目录服务的架构,并将其放置在 命名空间 对象中的每个顶级根节点中。 若要确定目录服务在给定根节点上支持哪些类,请枚举架构对象并获取类对象、属性对象和语法对象的列表。 有关详细信息,请参阅 使用 ADSI 架构。
ADSI LDAP 提供程序架构缓存
ADSI 的 LDAP 提供程序尝试将架构数据缓存到本地计算机。 子schema 由存储在目录服务企业根(rootDSE)根目录中的 subSchemaSubEntry 属性中的可分辨名称标识。 除了提供子架构数据之外,LDAP v3 服务器还应公开一个 modifyTimeStamp 属性,该属性用于确定上次修改架构的时间。
当 ADSI 首次绑定到 LDAP 服务器时,它将使用 subSchemaSubEntry 属性检索子架构数据。 如果 ADSI 成功查找子对象,它将指针存储在连接到 LDAP 服务器的计算机上的注册表中的数据。 有关这些值存储在注册表中的确切位置的信息,请参阅 ADSI 和用户帐户控制。
然后,ADSI 尝试处理架构数据并读取 modifyTimeStamp 属性。 如果 modifyTimeStamp 属性存在并且 ADSI 成功处理架构,ADSI 会将子架构写入磁盘,并在密钥下创建以下两个注册表值。 如果子架构数据存在,但无法处理,则不会创建以下两个注册表值:
- Time 值,该值包含 modifyTimeStamp属性。 此值用于确保架构数据是最新的,并阻止架构数据的不断重载。
- 文件 值,该值包含 ADSI 在文件系统中存储架构数据的路径。 默认情况下,ADSI 使用与 LDAP 服务器名称对应的文件名缓存 <systemroot>\SchCache 目录中的子架构。
如果可以处理子架构数据,但没有 modifyTimeStamp 属性公开,架构数据将缓存在内存中,但不写入磁盘。 如果已通过本地计算机上的 ADSI 联系 LDAP v3 服务器,并且缓存的子架构不存在,则很可能是出于以下原因之一:
- 服务器未公开正确的属性。
- ADSI 无法处理架构。
- ADSI 无法将文件写入文件系统。