title: How can I better query multiple domains in Active Directory using C#?
body: <p>I am attempting to expand a LDAP / AD search from only searching in the currently logged in domain to searching all domains in the AD. The method takes in the string with the query and returns and return an LDAPInformation object. </p>
  
  <p>While I am asking, is there any better way to search for the name than in this way? It is user unfriendly due to needing to use wildcards if looking for a person by last name (example: Doe*).</p>
  
  <pre><code>    public static LDAPInformation[] GetGlobalAddressListVIAName(string nameQuery)
      {
          var currentForest = Forest.GetCurrentForest();
          var globalCatalog = currentForest.FindGlobalCatalog();
  
          using (var searcher = globalCatalog.GetDirectorySearcher())
          {
              using (var entry = new DirectoryEntry(searcher.SearchRoot.Path))
              {
                  searcher.Filter = "(&amp;(mailnickname=*)(objectClass=user)(displayName=" + nameQuery + "))";
                  searcher.PropertyNamesOnly = true;
                  searcher.SearchScope = SearchScope.Subtree;
                  searcher.Sort.Direction = SortDirection.Ascending;
                  searcher.Sort.PropertyName = "displayName";
                  return searcher.FindAll().Cast&lt;SearchResult&gt;().Select(result =&gt; new LDAPInformation(result.GetDirectoryEntry())).ToArray();
              }
          }
      }
  </code></pre>
  
  <p>Here is the object:</p>
  
  <pre><code>    class LDAPInformation
  {
      internal LDAPInformation(DirectoryEntry entry)
      {
          //Section: HASH
          this.sAMAccountName = (string)entry.Properties["sAMAccountName"].Value;
  
          //Section: Email
          this.Mail = (string)entry.Properties["mail"].Value;
  
          //Section: Organziation
          this.Description = (string)entry.Properties["description"].Value;
          this.Company = (string)entry.Properties["company"].Value;
          this.Title = (string)entry.Properties["title"].Value;
          this.Department = (string)entry.Properties["department"].Value;
  
          //Section: Name
          this.DisplayName = (string)entry.Properties["displayName"].Value;
          this.FirstName = (string)entry.Properties["firstName"].Value;
          this.MiddleName = (string)entry.Properties["middleName"].Value;
          this.LastName = (string)entry.Properties["lastName"].Value;
  
          //Section: Address
          this.StreetAddress = (string)entry.Properties["streetAddress"].Value;
          this.City = (string)entry.Properties["city"].Value;
          this.State = (string)entry.Properties["state"].Value;
          this.PostalCode = (string)entry.Properties["postalCode"].Value;
          this.TelephoneNumber = (string)entry.Properties["telephoneNumber"].Value;
      }
  
      public string DisplayName
      {
          get;
          private set;
      }
  
      public string Mail
      {
          get;
          private set;
      }
  
      public string sAMAccountName
      {
          get;
          private set;
      }
  
      public string Description
      {
          get;
          private set;
      }
  
      public string Company
      {
          get;
          private set;
      }
  
      public string Title
      {
          get;
          private set;
      }
  
      public string Department
      {
          get;
          private set;
      }
  
      public string FirstName
      {
          get;
          private set;
      }
  
      public string MiddleName
      {
          get;
          private set;
      }
  
      public string LastName
      {
          get;
          private set;
      }
  
      public string StreetAddress
      {
          get;
          private set;
      }
  
      public string City
      {
          get;
          private set;
      }
  
      public string State
      {
          get;
          private set;
      }
  
      public string PostalCode
      {
          get;
          private set;
      }
  
      public string TelephoneNumber
      {
          get;
          private set;
      }
  }
  </code></pre>