2016-11-10 15 views
1

私の顧客は巨大なActive Directoryを持っています。たとえば、次のようにどのように私はプログラムでC#経由でActive Directoryフォレストのルートを取得できますか

ルート

company.com 
    de.company.com 
    us.company.com 
    in.company.com 
    xx.company.com 

私は、現在のユーザーを取得すると、私はdomainname\usernameを取得します。私はdomainnameをつかんで、世界中の他のユーザーのためにこのドメインを検索したいと思うので、ディレクトリ検索をするためにcompany.comを知る必要はありません。

私はDirectorySearcherまたは他のC#メソッドでADを照会する際に使用するルートオブジェクトをC#で取得する方法はありますか?

+0

識別名を使用しようとしましたか? – hofmeister

+0

卓越したnAme? – STORM

答えて

1

ルートフォレスト名でrootDSEパーティションからontainedすることができます。 rootDomainNamingContext属性を見てください。このwiilはあなたの森のルートドメインを返します。 1つのフォレストに2つのドメインツリーがある場合には機能しないため、ユーザーDNからフォレスト名を抽出することはお勧めしません。 2番目の方法は、現在のドメインのグローバルカタログ内のユーザーを検索することです。グローバルカタログには、フォレスト全体からのすべてのユーザーの部分レプリカが含まれています。

以下のコードは、グローバルカタログで検索します。私は2つのドメインを持っていますので、2人のユーザーを返します。あなたが複数の結果に対処する必要があること、注意してください返さ:このコードで

 var forest = Forest.GetCurrentForest(); 
     var globalCatalog = GlobalCatalog.FindOne(new DirectoryContext(DirectoryContextType.Forest, forest.Name)); 

     using (var connection = new LdapConnection(new LdapDirectoryIdentifier(globalCatalog.Name, 3268))) 
     { 
      var entries = new List<SearchResultEntry>(); 

      var searchRequest = new SearchRequest(string.Empty, "(samaccountname=administrator)", SearchScope.Subtree, null); 
      var searchOptionsControl = new SearchOptionsControl(System.DirectoryServices.Protocols.SearchOption.DomainScope); 

      searchRequest.Controls.Add(searchOptionsControl); 

      var pageResultRequestControl = new PageResultRequestControl(1000); 

      searchRequest.Controls.Add(pageResultRequestControl); 

      do 
      { 
       var response = (SearchResponse)connection.SendRequest(searchRequest); 

       if (response != null) 
       { 
        if (response.ResultCode != ResultCode.Success) 
        { 
         throw new ActiveDirectoryOperationException(response.ErrorMessage, (int) response.ResultCode); 
        } 

        foreach (var c in response.Controls.OfType<PageResultResponseControl>()) 
        { 
         pageResultRequestControl.Cookie = c.Cookie; 
         break; 
        } 

        entries.AddRange(response.Entries.Cast<SearchResultEntry>()); 
       } 
      } 
      while (pageResultRequestControl.Cookie != null && pageResultRequestControl.Cookie.Length > 0); 
     } 

いくつかの注意事項:コースの 1.このコードはそれではない生産1。より一般的なLdapSearcherを書くことができます。例えば、hereがあります。必要に応じてこのサーチャーの同期バージョンを作成できます。 2.エンタープライズ環境でDirectorySearcherを使用するとメモリリークなどが発生するため、サービスベースのアプリケーションではDirectorySearcherではなくLdapConnectionを使用することを強くお勧めします。issues

+0

ええ、私はそれをrootDomainNamingContextで試してみます。これはいいと思いますし、ネット上のサンプルは透明で分かりやすく、おそらく私が探しているものですが、グローバルカタログに関する情報をもう少し与えてください。 – STORM

+1

グローバルカタログは、すべてのフォレストオブジェクトの特定の属性を格納するドメインコントローラです。各属性に対して、Active Directoryスキーマは、その属性がグローバルカタログに格納されているかどうかを指定します。利用可能なすべてのグローバルカタログの情報を提供するSystem.DirectoryServices.ActiveDirectory.Forestクラスを見ることができます。このメソッドは、検索されたユーザーが属しているドメイン名がわからない場合に使用できます。グローバルカタログを照会するには、LDAP:// – oldovets

+0

の代わりにGC://を指定する必要があります。グローバルカタログに検索された属性が見つからない場合でも、フォレストクラスを作成し、このクラスからフォレストドメインリストを取得し、各ドメイン – oldovets

0

ユーザーのルートオブジェクトを取得するには、プロパティまたは属性distinguished nameを使用して、Active Direcotryで完全修飾パスを決定します。構造体を右から読み込み、ルート要素を抽出します。

E.g。 cn=John Doe, ou=People, dc=sun.com

enter image description here

+0

しかし、 'dc = de、dc = eu、dc = company、dc = com'(de.eu.company.com)のようなものがあり、' dc = company、dc = com' company.com)? – STORM

+0

@STORM現在のユーザの識別名を読み、 'RegEx'、' Split'または 'Substring'の値を読み込みます。 – hofmeister

関連する問題