グローバル カタログへのバインド
グローバル カタログは、フォレスト内のすべてのドメインのディレクトリ データを含む名前空間です。 グローバルカタログには、すべてのドメインディレクトリの部分レプリカが含まれています。 これには、エンタープライズ フォレスト内のすべてのオブジェクトのエントリが含まれますが、各オブジェクトのすべてのプロパティが含まれているわけではありません。 代わりに、グローバル カタログに含めるように指定されたプロパティのみが含まれます。
グローバルカタログは、企業全体の特定のサーバーに保存されます。 ドメイン コントローラだけがグローバル カタログ サーバーとして機能できます。 管理者は、特定のドメイン コントローラがグローバル カタログを保持しているかどうかを、Active Directory サイトとサービス マネージャを使用して示します。
ADSI を使用してグローバル カタログにバインドするには、"GC:" モニカーを使用します。
グローバル カタログにバインドしてフォレストで検索を実行するには、次の 2 つの方法があります。
- エンタープライズ ルート オブジェクトにバインドして、フォレスト内のすべてのドメインを検索します。
- 特定のオブジェクトにバインドして、そのオブジェクトとその子を検索します。 たとえば、フォレスト内のドメイン ツリーでその下に 2 つのドメインがあるドメインにバインドする場合、これら 3 つのドメインを検索できます。 バインド先のオブジェクトの識別名は、"LDAP:" 名前空間へのバインドに使用される識別名とまったく同じであることに注意してください。 "LDAP:" は 1 つのドメインの完全なレプリカであり、"GC:" はフォレスト内のすべてのドメインの部分的なレプリカであることを思い出してください。
"LDAP:" モニカーと同様に、サーバーレス バインドを使用することも、特定のグローバル カタログ サーバーにバインドすることもできます。 現在のフォレストで検索する場合は、サーバーレス バインドを使用します。 ただし、別のフォレストで検索する場合は、次の例に示すように、バインド先のドメイン名またはグローバル カタログ サーバーを指定します。
ドメイン名を使用してバインドします:
GC://fabrikam.com
サーバー名を使用してバインドします:
GC://servername
また、グローバル カタログ内の特定のオブジェクトにバインドすることもできます。 fabrikam ドメイン内の sales オブジェクトにバインドするには、次の形式を使用します。
GC://fabrikam.com/DC=sales,DC=fabrikam,DC=com
または、サーバー上の sales オブジェクトにバインドするには、次の形式を使用します。
GC://servername.fabrikam.com/DC=sales,DC=fabrikam,DC=com
フォレスト全体を検索するには
- グローバル カタログ名前空間のルートにバインドします。
- グローバル カタログ コンテナーを列挙します。 グローバル カタログ コンテナには、フォレスト全体の検索に使用できる 1 つのオブジェクトが含まれています。
- コンテナ内のオブジェクトを使用して検索を実行します。 C/C++ では、QueryInterface を呼び出してオブジェクトの IDirectorySearch ポインターを取得し、IDirectorySearch インターフェイスを使用して検索を実行できるようにします。 Visual Basic では、ADO クエリの列挙体から返されたオブジェクトを使用します。
サイト内のグローバル カタログ サーバーを列挙するには、次のフィルタ文字列を使用して、"cn=<yoursite>,cn=sites,<DN of the configurationNamingContext>" の LDAP サブツリー検索を実行します。
(&(objectCategory=nTDSDSA)(options:1.2.840.113556.1.4.803:=1))
このフィルターは、LDAP_MATCHING_RULE_BIT_AND一致ルール演算子 (1.2.840.113556.1.4.803) を使用して、options 属性のビットマスクに下位ビットが設定されている nTDSDSA オブジェクトを検索します。 Ntdsapi.h で定義されているNTDSDSA_OPT_IS_GC定数に対応する下位ビットは、グローバル カタログ サーバーの nTDSDSA オブジェクトを識別します。 一致ルールの詳細については、検索フィルターの構文を参照してください。
nTDSDSA オブジェクトの親はサーバー オブジェクトであり、サーバー オブジェクトの dNSHostName プロパティはグローバル カタログ サーバーの DNS 名です。
NTDSDSA_OPT_IS_GC や LDAP_MATCHING_RULE_BIT_AND などの #define 定数を検索フィルター文字列で直接使用することはできません。 ただし、これらの定数を 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
フォレスト全体を検索する方法の詳細とコード例については、フォレストを検索するためのコード例を参照してください。