如何在给定多个用户名的情况下查询Active Directory?

时间:2013-11-06 14:13:58

标签: c# active-directory directoryservices

我使用System.DirectoryServices.AccountManagement在Active Directory中查询单个用户信息

public UserInfo FindOne(string samUserName)
{
    using (var ctx = new PrincipalContext(ContextType.Domain, "domain.com", "Bob", "pwd"))
    {
        using (UserPrincipal user = UserPrincipal.FindByIdentity(ctx, samUserName))
        {
            if (user != null)
            {
                // get info about Alice into userInfo
                return userInfo;
            }
        }   
    }

    return null;
}

因此,如果我使用var aliceInfo = search.FindOne("alice");,我会从目录中获取信息。现在我需要在给定多个用户登录名的情况下搜索目录(1000多个用户),例如

var userInfos = search.FindMany(/* list of names: alice, jay, harry*/);

如何实施以下方法?

public List<UserInfo> FindMany(List<string> samUserNames)
{
    ...
}

2 个答案:

答案 0 :(得分:2)

试试这个:

string query = "dc=com,dc=domainController,ou=Users"; //this is just an example query, change it to suit your needs

// create your domain context and define the OU container to search in
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "yourDomain", query);

// define a "query-by-example" principal - here, we search for a UserPrincipal (user)
UserPrincipal qbeUser = new UserPrincipal(ctx);

// create your principal searcher passing in the QBE principal    
PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

return srch.FindAll().Select(p => p as UserPrincipal);

这样,您可以从AD返回所有用户,然后过滤掉您不需要的用户。 UserPrincipal有一些与用户相关的属性,如Surname和Sid,但是如果你需要获得UserPrincipal没有的值,你可以创建一个扩展方法并访问任何LDAP属性:

    public static String GetProperty(this Principal principal, String property)
    {
        DirectoryEntry directoryEntry = principal.GetUnderlyingObject() as DirectoryEntry;
        if (directoryEntry.Properties.Contains(property))
            return directoryEntry.Properties[property].Value.ToString() ?? "";
        else
            return String.Empty;
    }

以下是LDAP属性列表:https://fsuid.fsu.edu/admin/lib/WinADLDAPAttributes.html

答案 1 :(得分:1)

如果您的列表相对较小,最灵活的解决方案可能是循环并逐个查找用户。

替代方案是:

  • 在LDAP查询中提供过滤器。由于您没有要过滤的公共属性,因此您需要创建一个包含所有用户名的“OR”LDAP过滤器。对于大量用户而言,这并不比循环更好。

  • 迭代目录中的所有用户,过滤搜索结果以提取与您的列表匹配的用户。这不适用于大型AD,它不利用samAccountName是索引属性的事实。