2009-10-22 14 views

答えて

23

を使用すると、非常に大きなドメインを持っている、またはあなたのドメインがどのようにどのように設定された制限を持っている場合は(自分を返信させていただきます。誰かがより良い返信ILがそれを受け入れている場合は、このページに検索エンジンの餌をしようとして)検索ごとに多くの項目を返すことができるため、ページングを使用する必要があります。

using System.DirectoryServices; //add to references 

public static List<string> GetComputers() 
{ 
    List<string> ComputerNames = new List<string>(); 

    DirectoryEntry entry = new DirectoryEntry("LDAP://YourActiveDirectoryDomain.no"); 
    DirectorySearcher mySearcher = new DirectorySearcher(entry); 
    mySearcher.Filter = ("(objectClass=computer)"); 
    mySearcher.SizeLimit = int.MaxValue; 
    mySearcher.PageSize = int.MaxValue; 

    foreach(SearchResult resEnt in mySearcher.FindAll()) 
    { 
     //"CN=SGSVG007DC" 
     string ComputerName = resEnt.GetDirectoryEntry().Name; 
     if (ComputerName.StartsWith("CN=")) 
      ComputerName = ComputerName.Remove(0,"CN=".Length); 
     ComputerNames.Add(ComputerName); 
    } 

    mySearcher.Dispose(); 
    entry.Dispose(); 

    return ComputerNames; 
} 
1

(objectCategory = computer)のようなLDAPクエリは、このトリックを行う必要があります。提案EKS何 -jim

5

正しいですが、少し遅いを行っています。

その理由は、それぞれの結果に対してGetDirectoryEntry()への呼び出しです。これによりDirectoryEntryオブジェクトが作成されます。このオブジェクトは、Active Directory(AD)オブジェクトを変更する必要がある場合にのみ必要です。クエリが単一のオブジェクトを返す場合は問題ありませんが、すべてのオブジェクトをADにリストすると、パフォーマンスが大幅に低下します。

ADだけをクエリする必要がある場合は、結果オブジェクトのPropertiesコレクションを使用するほうがよいでしょう。これにより、コードのパフォーマンスが何度も向上します。

これはdocumentation for SearchResult classで説明されています。SearchResultクラスの

インスタンスは DirectoryEntryクラスのインスタンスに非常に似ています。決定的な違いは、SearchResult用のデータは、すでにそれは、クエリから返される SearchResultCollection、で利用可能であるのに対し DirectoryEntryクラスは、アクティブ Directoryドメインサービス階層から新しいオブジェクトが がアクセスされるたびにその情報を取得することです は、DirectorySearcherクラスで実行されます。ここで

Propertiesコレクションの使用方法のです:プロパティは複数の値を持つことができること

public static List<string> GetComputers() 
{ 
    List<string> computerNames = new List<string>(); 

    using (DirectoryEntry entry = new DirectoryEntry("LDAP://YourActiveDirectoryDomain.no")) { 
     using (DirectorySearcher mySearcher = new DirectorySearcher(entry)) { 
      mySearcher.Filter = ("(objectClass=computer)"); 

      // No size limit, reads all objects 
      mySearcher.SizeLimit = 0; 

      // Read data in pages of 250 objects. Make sure this value is below the limit configured in your AD domain (if there is a limit) 
      mySearcher.PageSize = 250; 

      // Let searcher know which properties are going to be used, and only load those 
      mySearcher.PropertiesToLoad.Add("name"); 

      foreach(SearchResult resEnt in mySearcher.FindAll()) 
      { 
       // Note: Properties can contain multiple values. 
       if (resEnt.Properties["name"].Count > 0) 
       { 
        string computerName = (string)resEnt.Properties["name"][0]; 
        computerNames.Add(computerName); 
       } 
      } 
     } 
    } 

    return computerNames; 
} 

Documentation for SearchResult.Properties

注意を私たちは番号を確認するためにProperties["name"].Countを使用する理由、それはあります値の

さらに改善するには、PropertiesToLoadコレクションを使用して、事前に使用するプロパティを検索者に知らせます。これにより、検索者は実際に使用されるデータのみを読み取ることができます。

DirectoryEntryDirectorySearcherオブジェクトが 適切に使用されているすべてのリソースを解放するために配置されるべきであることに注意してください。その最高の using句で行われます。

関連する問題