更改 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 更改通知控件的详细信息,请参阅 更改跟踪技术概述