如何检索Active Directory的所有用户?

时间:2013-12-24 09:11:08

标签: c# asp.net ldap

我使用以下代码检索活动目录的all个用户,但检索到not all users。我应该在Filter中加入其他内容吗?  这是简化的代码。

DirectoryEntry entry = new DirectoryEntry("LDAP://" + Bous.DomainName, Bous.UserName, Bous.Password);
DirectorySearcher mySearcher = new DirectorySearcher(entry);
mySearcher.Filter = ("(&(objectCategory=person)(objectClass=user))");

foreach (SearchResult result in mySearcher.FindAll())
{
     dr = dt.NewRow();
     ResultPropertyCollection myResultPropColl = result.Properties;
     dr[0] = myResultPropColl["samaccountname"][0].ToString() + "@" + Bous.DomainName;
     dt.Rows.Add(dr);
}        

3 个答案:

答案 0 :(得分:1)

试试这个:

DirectoryEntry entry = new DirectoryEntry("LDAP://" + Bous.DomainName, Bous.UserName, Bous.Password);
DirectorySearcher mySearcher = new DirectorySearcher(entry);
mySearcher.PageSize = 1000;   // <--- Important!
mySearcher.Filter = ("(&(objectCategory=person)(objectClass=user))");

foreach (SearchResult result in mySearcher.FindAll())
{
     dr = dt.NewRow();
     ResultPropertyCollection myResultPropColl = result.Properties;
     dr[0] = myResultPropColl["samaccountname"][0].ToString() + "@" + Bous.DomainName;
     dt.Rows.Add(dr);
}     

答案 1 :(得分:1)

如果您使用的是.NET 3.5或更高版本,则可以使用PrincipalSearcher和“按示例查询”主体进行搜索:

// create your domain context
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
   // define a "query-by-example" principal - here, we search for UserPrincipal (users)
   UserPrincipal qbeUser = new UserPrincipal(ctx);

   // create your principal searcher passing in the QBE principal    
   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.....          
   }
}

如果您还没有 - 绝对阅读MSDN文章Managing Directory Security Principals in the .NET Framework 3.5,该文章很好地展示了如何充分利用System.DirectoryServices.AccountManagement中的新功能。或者查看MSDN documentation on the System.DirectoryServices.AccountManagement命名空间。

答案 2 :(得分:0)

    using System.DirectoryServices;
    using System.DirectoryServices.AccountManagement;
    ...
    protected static UserPrincipal QueryFilterUsers(string FilterFullName, string FilterDescription, string FilterLogin, string FilterPhone, string FilterEmail)
    {
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain, _Domain);
        UserPrincipal _UserPrincipal = new UserPrincipal(ctx);

        _UserPrincipal.SamAccountName = "*" + ((!string.IsNullOrEmpty(FilterLogin)) ? FilterLogin.Trim() + "*" : "");
        if (!string.IsNullOrEmpty(FilterFullName)) _UserPrincipal.DisplayName = "*" + FilterFullName.Trim() + "*";
        if (!string.IsNullOrEmpty(FilterDescription)) _UserPrincipal.Description = "*" + FilterDescription.Trim() + "*";
        if (!string.IsNullOrEmpty(FilterPhone)) _UserPrincipal.VoiceTelephoneNumber = "*" + FilterPhone.Trim() + "*" ;
        if (!string.IsNullOrEmpty(FilterEmail)) _UserPrincipal.EmailAddress = "*" + FilterEmail.Trim() + "*";
        return _UserPrincipal;
    }

    //Получение списков
    public static List<Principal> GetUsersPrincipalList(string FilterFullName, string FilterDescription, string FilterLogin, string FilterPhone, string FilterEmail)
    {
        PrincipalSearcher _PrincipalSearcher = new PrincipalSearcher();
        _PrincipalSearcher.QueryFilter = QueryFilterUsers(FilterFullName, FilterDescription, FilterLogin, FilterPhone, FilterEmail);
        (_PrincipalSearcher.GetUnderlyingSearcher() as DirectorySearcher).PageSize = _PageSize;
        (_PrincipalSearcher.GetUnderlyingSearcher() as DirectorySearcher).SizeLimit = _SizeLimit;

        return _PrincipalSearcher.FindAll().ToList();
    }