If an OU contains 3000 users, how to use DirectorySearcher to find all of them?

前端 未结 2 1341
情书的邮戳
情书的邮戳 2020-12-31 19:16

I use this code:

DirectoryEntry objEntry;
DirectorySearcher objSearchEntry;
SearchResultCollection objSearchResult;
string strFilter = \"(&(objectCategor         


        
相关标签:
2条回答
  • 2020-12-31 19:43

    If you're on .NET 3.5 or newer, you should check out the PrincipalSearcher and a "query-by-example" principal to do your searching:

    // create your domain context
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN", "OU=SomeOU,DC=YourCompany,DC=com");
    
    // define a "query-by-example" principal - here, we search for a UserPrincipal 
    // and with the first name (GivenName) of "Bruce"
    UserPrincipal qbeUser = new UserPrincipal(ctx);
    qbeUser.GivenName = "Bruce";
    
    // create your principal searcher passing in the QBE principal    
    PrincipalSearcher srch = new PrincipalSearcher(qbeUser);
    
    // set the PageSize on the underlying DirectorySearcher to get all 3000 entries
    ((DirectorySearcher)srch.GetUnderlyingSearcher()).PageSize = 500;
    
    // 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

    Update:

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

    • Surname (or last name)
    • DisplayName (typically: first name + space + last name)
    • SAM Account Name - your Windows/AD account name
    • User Principal Name - your "username@yourcompany.com" style name

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

    Update #2: If you want to search just inside a given OU, you can define that OU in the constructor of the PrincipalContext.

    0 讨论(0)
  • 2020-12-31 19:54

    You need to set the DirectorySearcher.PageSize property to be able to return all the results. For example:

    objSearchEntry.PageSize = 500;
    

    Otherwise the number of items returned will be limited by the limit on the server side, which is 1000 by default. There is also something called SizeLimit, which you can set if you want to explicitly limit the number of returned items. If both SizeLimit and PageSize are 0 (default values) then it will use the server side default SizeLimit. A bit counter-intuitive in my opinion.

    If you want to return all the results, the only way is to set PageSize to a non-zero value and SizeLimit to 0.

    0 讨论(0)
提交回复
热议问题