绑定到全局目录

全局目录是一个命名空间,其中包含林中所有域的目录数据。 全局目录包含每个域目录的部分副本 (replica)。 它包含企业林中每个对象的条目,但不包含每个对象的所有属性。 而是仅包含为包含在全局目录中而指定的属性。

全局目录存储在整个企业中的特定服务器上。 只有域控制器才能充当全局目录服务器。 管理员istrators 指示给定域控制器是否使用 Active Directory 站点和服务管理器保存全局目录。

若要使用 ADSI 绑定到全局目录,请使用“GC:”名字对象。

有两种方法可以绑定到全局目录以在林中执行搜索:

  • 绑定到企业根对象,以跨林中的所有域进行搜索。
  • 绑定到特定对象以搜索该对象及其子对象。 例如,如果绑定到林中的域树下有两个域的域,则可以跨这三个域进行搜索。 请注意,要绑定到的对象的可分辨名称与用于绑定到“LDAP:”命名空间的可分辨名称完全相同。 回想一下,“LDAP:”是单个域的完整副本 (replica),“GC:”是林中所有域的部分副本 (replica)。

与“LDAP:”名字对象一样,可以使用无服务器绑定或绑定到特定的全局目录服务器。 如果在当前林中搜索,请使用无服务器绑定。 但是,如果在另一个林中搜索,请指定要绑定到的域名或全局编录服务器,如以下示例所示。

使用域名进行绑定:

GC://fabrikam.com

使用服务器名称进行绑定:

GC://servername

还可以绑定到全局编录中的特定对象。 若要绑定到 fabrikam 域中的销售对象,请使用以下格式。

GC://fabrikam.com/DC=sales,DC=fabrikam,DC=com

或者,若要绑定到服务器上的销售对象,请使用以下格式。

GC://servername.fabrikam.com/DC=sales,DC=fabrikam,DC=com

搜索整个林

  1. 绑定到全局目录命名空间的根目录。
  2. 枚举全局目录容器。 全局目录容器包含一个可用于搜索整个林的对象。
  3. 使用容器中的对象执行搜索。 在 C/C++ 中,调用 QueryInterface 以获取对象上的 IDirectorySearch 指针,以便可以使用 IDirectorySearch 接口执行搜索。 在 Visual Basic 中,使用从 ADO 查询中的枚举返回的对象。

若要枚举站点中的全局目录服务器,请使用以下筛选器字符串执行 LDAP 子树搜索“cn=<yoursite,cn>=sites,configurationNamingContext<> 的 DN”。

(&(objectCategory=nTDSDSA)(options:1.2.840.113556.1.4.803:=1))

此筛选器使用 LDAP_MATCHING_RULE_BIT_AND匹配的规则运算符(1.2.840.113556.1.4.803)查找在选项属性的位掩码中设置了低序位的 nTDSDSA 对象。 与 Ntdsapi.h 中定义的NTDSDSA_OPT_IS_GC常量相对应的低序位标识全局编录服务器的 nTDSDSA 对象。 有关匹配规则的详细信息,请参阅 搜索筛选器语法

nTDSDSA 对象的父对象是服务器对象,服务器对象的 dNSHostName 属性是全局编录服务器的 DNS 名称。

不能直接在搜索筛选器字符串中使用 #define 常量,例如 NTDSDSA_OPT_IS_GCLDAP_MATCHING_RULE_BIT_AND 。 但是,可以将这些常量用作函数的参数,例如 swprintf_s 将常量值插入筛选器字符串。

全局目录不表示整个林树结构。 例如,你可能期望以下代码示例枚举林中的所有域以及每个域的所有子对象。 实际上,它实际执行的操作是枚举林中的所有域,但枚举的域对象均不包含任何子级。 这是全局目录的限制。

Dim oGC As IADs
Dim oDomain As IADs
Dim oChild As IADs

Set oGC = GetObject("GC:")
For Each oDomain In oGC
    ' Print the name of the domain.
    Debug.Print oDomain.Name
    
    ' Enumerate the child objects of the domain.
    For Each oChild In oDomain
        Debug.Print oChild.Name
    Next
Next

若要更正此问题,必须绑定到每个域对象,然后枚举每个域的子对象。 下面的代码示例演示了适当的技术。

Dim oGC As IADs
Dim oDomainEnum As IADs
Dim oDomainBind As IADs
Dim oChild As IADs

Set oGC = GetObject("GC:")
For Each oDomainEnum In oGC
    ' Print the name of the domain.
    Debug.Print oDomainEnum.Name
    
    ' Bind to the domain.
    Set oDomainBind = GetObject("LDAP://" + oDomainEnum.Name)
    
    ' Enumerate the child objects of the domain.
    For Each oChild In oDomainBind
        Debug.Print oChild.Name
    Next
Next

有关演示如何搜索整个林的详细信息和代码示例,请参阅 搜索林的示例代码。