Search code examples
c#ldapdirectoryentry

Convert list of samaccount names to distinguished names


I have a list of account names (thousands) that I need to add as members of a group, so I need to look up the distinguished names of those accounts so I can add them as members of a group.

There are 21000 user accounts. It takes hours to look up the distinguished names, is there a faster way?

DirectoryEntry deDomain = new DirectoryEntry();
deDomain.Path = "LDAP://DC=my,DC=ca;
deDomain.Username = "me";
deDomain.Password =  "mypassword";

DirectorySearcher dsSearch = new DirectorySearcher(deDomain);
dsSearch.CacheResults = false;
dsSearch.PropertiesToLoad.Add("distinguishedname");

foreach (string sam in lstSamAccountNames)
{
    dsSearch.Filter = $"(&(objectCategory=person)(objectClass=user)(SAMAccountName={ReplaceSpecialCharacters(sSamAccountName)}))";
    SearchResult srPerson = dsSearch.FindOne();

    yield return  srPerson.Properties["distinguishedname"][0].ToString();
}

Solution

  • I don't have an AD domain handy that I can do performance testing with at the moment, but have you tried the AccountManagement library instead of using DirectorySearcher?

    using System.DirectoryServices.AccountManagement;
    
    // ...
    
    var domainName = "MyDomainName";
    
    using (var context = new PrincipalContext(ContextType.Domain, domainName))
    {
        foreach (var sam in lstSamAccountNames)
        {
            var userName = ReplaceSpecialCharacters(sam);
    
            using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, $@"{domainName}\{userName}"))
            {
                yield return user.DistinguishedName;
            }
        }    
    }