2009-10-22 35 views
11

Im tự hỏi làm cách nào để có danh sách tất cả các máy tính/máy/máy tính từ thư mục hoạt động?Liệt kê tất cả các máy tính trong thư mục hoạt động

(Đang cố gắng để làm cho trang này một công cụ tìm kiếm mồi, sẽ trả lời bản thân mình. Nếu ai đó có một tốt hơn reply il chấp nhận điều đó)

Trả lời

23

Nếu bạn có một tên miền rất lớn, hoặc tên miền của bạn đã giới hạn cấu hình trên như thế nào như thế nào nhiều mục có thể được trả lại cho mỗi tìm kiếm, bạn có thể phải sử dụng phân trang.

using System.DirectoryServices; //add to references 

public static List<string> GetComputers() 
{ 
    List<string> ComputerNames = new List<string>(); 

    DirectoryEntry entry = new DirectoryEntry("LDAP://YourActiveDirectoryDomain.no"); 
    DirectorySearcher mySearcher = new DirectorySearcher(entry); 
    mySearcher.Filter = ("(objectClass=computer)"); 
    mySearcher.SizeLimit = int.MaxValue; 
    mySearcher.PageSize = int.MaxValue; 

    foreach(SearchResult resEnt in mySearcher.FindAll()) 
    { 
     //"CN=SGSVG007DC" 
     string ComputerName = resEnt.GetDirectoryEntry().Name; 
     if (ComputerName.StartsWith("CN=")) 
      ComputerName = ComputerName.Remove(0,"CN=".Length); 
     ComputerNames.Add(ComputerName); 
    } 

    mySearcher.Dispose(); 
    entry.Dispose(); 

    return ComputerNames; 
} 
1

Truy vấn LDAP như: (objectCategory = computer) nên thực hiện thủ thuật. -jim

5

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 DirectoryEntryDirectorySearcher đố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.

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