Active Directory 域服务中的更改通知

Active Directory 域服务可为客户端应用程序提供一种机制,以便向域控制器注册,从而接收更改通知。 为此,客户端在异步 LDAP 搜索操作中会指定 LDAP 更改通知控件。 客户端还会指定以下搜索参数。

参数 说明
范围
指定 LDAP_SCOPE_BASE 可仅监视对象,而指定 LDAP_SCOPE_ONELEVEL 则可监视对象的直接子项,但不包括对象自身。 请勿指定 LDAP_SCOPE_SUBTREE。 虽然当基对象为命名上下文的根时支持子树范围,但使用它可能会严重影响服务器性能,因为每次修改命名上下文中的对象时均会生成 LDAP 搜索结果消息。 无法为任意子树指定 LDAP_SCOPE_SUBTREE
筛选器
指定“(objectclass=*)”的搜索筛选器,这意味着你会收到对指定范围内任一对象的更改的相关通知。
属性
指定要在出现更改时返回的属性列表。 请注意,修改任一属性时均会收到通知,而不仅仅是指定的属性。

可对单个 LDAP 连接最多注册五个通知请求。 必须存在用于等待通知并快速处理通知的专用线程。 调用 ldap_search_ext 函数以注册通知请求时,该函数会返回用于标识该请求的消息标识符。 然后,使用 ldap_result 函数等待更改通知。 出现更改时,服务器会向你发送一条 LDAP 消息,其中包含生成该通知的通知请求的消息标识符。 它会导致 ldap_result 函数返回用于标识已更改对象的搜索结果。

客户端应用程序必须确定受监视对象的初始状态。 为此,必须先注册通知请求,然后再读取当前状态。

客户端应用程序还须确定此更改的原因。 对于基本级搜索,当任一属性更改或对象被删除或移动时,均会发送通知。 对于一级搜索,创建、删除、移动或修改子对象时均会发送通知。 请注意,移动或重命名目标对象上方层次结构中的对象不会发送通知,即使目标的可分辨名称因此而更改也是如此。 例如,如果在监视对容器中子对象的更改,则当容器自身已移动或重命名时,则不会收到通知。

当客户端处理搜索结果时,它可以使用 ldap_get_dn 函数来获取已更改对象的可分辨名称。 请勿依赖可分辨名称来标识所跟踪的对象,因为可分辨名称可能会更改。 相反,应在要检索的属性列表中包括 objectGUID 属性。 无论对象在企业林中移动到哪个位置,每个对象的 objectGUID 均保持不变。

如果删除搜索范围内的某一对象,客户端则会收到更改通知,同时会见将该对象的 isDeleted 属性设为 TRUE。 在此情况下,搜索结果会在其分区的“已删除对象”容器中报告该对象的新可分辨名称。 无需指定逻辑删除控件 (LDAP_SERVER_SHOW_DELETED_OID),即可获取对象删除通知。 有关详细信息,请参阅检索已删除的对象

当客户端已注册通知请求时,客户端会继续接收通知,直到连接中断或是客户端通过调用 ldap_abandon 函数来放弃此搜索。 例如,如果客户端或服务器断开连接,通知请求则会终止。 当客户端重新连接时,它必须再次注册通知,然后读取感兴趣对象的当前状态,以防客户端断开连接时曾有更改。

客户端可使用对象的 uSNChanged 属性的值来确定服务器上对象的当前状态是否反映了客户端已收到的最新更改。 移动或修改对象时,系统会增大此对象的 uSNChanged 属性。 例如,如果服务器失败且目录分区是从备份中还原的,则服务器的对象副本可能不会反映以前向客户端报告的更改,而在此情况下,服务器上的 uSNChanged 值会小于客户端存储的值。

有关详细信息以及在异步 LDAP 搜索操作中使用 LDAP 更改通知控件的代码示例,请参阅接收更改通知的示例代码

有关何时使用 LDAP 更改通知控件的详细信息,请参阅更改跟踪技术概述