2011-07-17 22 views
8

tôi sử dụng mã này:Nếu OU có 3000 người dùng, cách sử dụng DirectorySearcher để tìm tất cả chúng?

DirectoryEntry objEntry; 
DirectorySearcher objSearchEntry; 
SearchResultCollection objSearchResult; 
string strFilter = "(&(objectCategory=User))"; 
objEntry = new DirectoryEntry(conOUPath, conUser, conPwd, AuthenticationTypes.Secure); 
objEntry.RefreshCache(); 
objSearchEntry = new DirectorySearcher(objEntry); 
objSearchEntry.Filter=strFilter; 
objSearchEntry.SearchScope=SearchScope.Subtree; 
objSearchEntry.CacheResults=false; 
objSearchResult=objSearchEntry.FindAll(); 

Mỗi lần, nó chỉ trả lại 1000 người sử dụng, nhưng có 3000 người dùng trong OU.

Tôi làm cách nào để tìm tất cả chúng?

Trả lời

9

Nếu bạn đang ở trên NET 3.5 hoặc mới hơn, bạn nên kiểm tra PrincipalSearcher và một "truy vấn theo ví dụ" chủ yếu để làm tìm kiếm của bạn:

// 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.....   
} 

Nếu bạn chưa - hoàn toàn đọc bài viết MSDN Managing Directory Security Principals in the .NET Framework 3.5 trong đó cho thấy độc đáo làm thế nào để tận dụng tốt nhất của tính năng mới trong System.DirectoryServices.AccountManagement

Cập nhật:

Tất nhiên, tùy thuộc vào nhu cầu của bạn, bạn có thể muốn xác định các tài sản khác trên rằng "truy vấn theo ví dụ" người dùng chính bạn tạo ra:

  • Surname (hoặc cuối cùng tên)
  • DisplayName (thường: tên đầu tiên + không gian + tên cuối cùng)
  • SAM Account Name -/AD tên tài khoản Windows của bạn
  • User Principal Name - "[email protected]" tên phong cách của bạn

Bạn có thể chỉ định bất kỳ thuộc tính trên UserPrincipal và sử dụng những người như "truy vấn-by-dụ" cho PrincipalSearcher của bạn.

Cập nhật # 2: Nếu bạn muốn tìm kiếm ngay bên trong một OU nhất định, bạn có thể xác định OU đó trong hàm tạo của PrincipalContext.

+0

nhưng tôi muốn lọc theo OU, và có được một kết quả của tất cả các loại là người dùng trong OU đó, ở đây là không có từ khóa để tìm kiếm – cciikk

+0

Đó là mát mẻ, cảm ơn bạn! – cciikk

+0

@cciikk: xem cập nhật của tôi - bạn có thể giới hạn tìm kiếm của bạn vào một container cụ thể bằng cách định nghĩa rằng trong constructor của 'PrincipalContext' –

6

Bạn cần đặt DirectorySearcher.PageSize property để có thể trả lại tất cả kết quả. Ví dụ:

objSearchEntry.PageSize = 500; 

Nếu không, số lượng mục được trả về sẽ bị giới hạn bởi giới hạn ở phía máy chủ, theo mặc định là 1000. Ngoài ra còn có một cái gì đó gọi là SizeLimit, mà bạn có thể thiết lập nếu bạn muốn giới hạn một cách rõ ràng số lượng các mặt hàng trả về. Nếu cả hai SizeLimit và PageSize là 0 (giá trị mặc định) thì nó sẽ sử dụng SizeLimit mặc định phía máy chủ. Một chút phản trực giác theo ý kiến ​​của tôi.

Nếu bạn muốn quay trở lại tất cả kết quả, cách duy nhất là để thiết lập PageSize đến một giá trị khác không và SizeLimit để 0.

+0

nó trả về tất cả người dùng trong AD, nó có thể lọc theo objectGUID của OU không? – cciikk

+0

Sau đó, bạn cần phải ràng buộc DirectorySearcher với DirectoryEntry là OU bạn muốn. tức là objEntry phải là OU mà bạn muốn tìm kiếm người dùng theo. –

Các vấn đề liên quan