gì Eks đề xuất là đúng, nhưng được thực hiện một chút chậm.
Lý do là gọi đến GetDirectoryEntry()
trên mỗi kết quả. Điều này tạo ra một đối tượng DirectoryEntry
, chỉ cần thiết nếu bạn cần sửa đổi đối tượng Active Directory (AD). Đó là OK nếu truy vấn của bạn sẽ trả về một đối tượng duy nhất, nhưng khi liệt kê tất cả các đối tượng trong AD, điều này làm giảm đáng kể hiệu suất.
Nếu bạn chỉ cần truy vấn AD, tốt hơn là chỉ sử dụng bộ sưu tập Properties
của đối tượng kết quả. Điều này sẽ cải thiện hiệu suất của mã nhiều lần.
này được giải thích trong documentation for SearchResult
class:
Instances của lớp SearchResult
rất giống với trường hợp của DirectoryEntry
lớp. Sự khác biệt quan trọng là các lớp DirectoryEntry
lấy thông tin từ hệ thống phân cấp dịch vụ miền Active thư mục mỗi lần một đối tượng mới được truy cập, trong khi số liệu cho SearchResult
là đã có sẵn trong các SearchResultCollection
, nơi nó được trở về từ một truy vấn mà được thực hiện với lớp học DirectorySearcher
.
Dưới đây là một dụ về cách sử dụng các Properties
bộ sưu tập:
public static List<string> GetComputers()
{
List<string> computerNames = new List<string>();
using (DirectoryEntry entry = new DirectoryEntry("LDAP://YourActiveDirectoryDomain.no")) {
using (DirectorySearcher mySearcher = new DirectorySearcher(entry)) {
mySearcher.Filter = ("(objectClass=computer)");
// No size limit, reads all objects
mySearcher.SizeLimit = 0;
// Read data in pages of 250 objects. Make sure this value is below the limit configured in your AD domain (if there is a limit)
mySearcher.PageSize = 250;
// Let searcher know which properties are going to be used, and only load those
mySearcher.PropertiesToLoad.Add("name");
foreach(SearchResult resEnt in mySearcher.FindAll())
{
// Note: Properties can contain multiple values.
if (resEnt.Properties["name"].Count > 0)
{
string computerName = (string)resEnt.Properties["name"][0];
computerNames.Add(computerName);
}
}
}
}
return computerNames;
}
Documentation for SearchResult.Properties
Lưu ý rằng thuộc tính có thể có nhiều giá trị, đó là lý do tại sao chúng tôi sử dụng Properties["name"].Count
kiểm tra số giá trị.
Để cải thiện mọi thứ hơn nữa, hãy sử dụng bộ sưu tập PropertiesToLoad
để cho người tìm kiếm biết bạn sẽ sử dụng thuộc tính nào trước. Điều này cho phép người tìm kiếm chỉ đọc dữ liệu thực sự được sử dụng.
Lưu ý rằng DirectoryEntry
và DirectorySearcher
đối tượng nên được xử lý đúng cách để giải phóng mọi nguồn lực được sử dụng. Tốt nhất là được thực hiện với mệnh đề using
.