ASP.NET Active Directory Search

Jinal Shah picture Jinal Shah · Feb 21, 2013 · Viewed 8.9k times · Source

I'm trying to create an intranet Website on ASP.NET MVC 4 using Windows Login. I have successfully done the windows login. The only thing I am stuck up with is searching the active directory with partial username. I tried searching the web and stackoverflow website but still couldn't find the answer.

   DirectoryEntry directory = new DirectoryEntry("LDAP://DC=NUAXIS");
   string filter = "(&(cn=jinal*))";
   string[] strCats = { "cn" };
   List<string> items = new List<string>();
   DirectorySearcher dirComp = new DirectorySearcher(directory, filter, strCats,     SearchScope.Subtree);
   SearchResultCollection results = dirComp.FindAll();

Answer

marc_s picture marc_s · Feb 21, 2013

You can use a PrincipalSearcher and a "query-by-example" principal to do your searching:

// create your domain context
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
   // define a "query-by-example" principal - here, we search for a UserPrincipal 
   // and with the first name (GivenName) of "Jinal*" 
   UserPrincipal qbeUser = new UserPrincipal(ctx);
   qbeUser.GivenName = "Jinal*";

   // create your principal searcher passing in the QBE principal    
   using (PrincipalSearcher srch = new PrincipalSearcher(qbeUser))
   { 
      // find all matches
      foreach(var found in srch.FindAll())
      {
         // do whatever here - "found" is of type "Principal" - 
         // it could be user, group, computer.....          
      }
   }
}

If you haven't already - absolutely read the MSDN article Managing Directory Security Principals in the .NET Framework 3.5 which shows nicely how to make the best use of the new features in System.DirectoryServices.AccountManagement. Or see the MSDN documentation on the System.DirectoryServices.AccountManagement namespace.

Of course, depending on your need, you might want to specify other properties on that "query-by-example" user principal you create:

  • DisplayName (typically: first name + space + last name)
  • SAM Account Name - your Windows/AD account name
  • User Principal Name - your "[email protected]" style name

You can specify any of the properties on the UserPrincipal and use those as "query-by-example" for your PrincipalSearcher.