2013-07-23 53 views
7

Đây là mã tôi đang sử dụng để kết nối với LDAPCác máy chủ không hoạt động

using (DirEntry = new DirectoryEntry(string.Format("LDAP://{0}/{1}", this.Host, ServerName))) 
     { 
      DirEntry.RefreshCache(); 
      if (!string.IsNullOrEmpty(UserName)) 
      { 
       DirEntry.Username = UserName; 
       DirEntry.Password = PassWord; 
      } 
      if (DirEntry.Properties.Contains("objectGUID")) 
      { 
       byte[] guiddatet = (byte[])DirEntry.Properties["objectGUID"].Value; 
       return new Guid(guiddatet); 
      } 

tôi nhận được "Máy chủ không phải là hoạt động" thông báo lỗi khi tôi chạy mã.

Ai đó có thể vui lòng cho tôi biết nơi tôi đang làm sai. Và có cách nào khác để thay thế mã trên bằng truy vấn LDAP trực tiếp.

+0

Bạn có các giá trị ** nào trong 'this.Host' và' ServerName' ?? Chuỗi LDAP hoàn chỉnh của bạn trông như thế nào mà bạn sử dụng để tạo 'DirectoryEntry' đó? –

+0

Đây là cách chuỗi LDAP của tôi trông giống như sau: LDAP: //xyz.sdomain.com/CN=xyz,CN=Servers,CN=Default-First-Site,CN=Sites,CN=Configuration,DC=sdomain,DC= com – user2327795

+0

Và trên ** dòng chính xác ** hiện lỗi này xảy ra khi bạn gỡ lỗi thông qua? –

Trả lời

2

Bạn nên cố gắng chia phần này thành các phần riêng biệt, vì vậy việc quản lý logic dễ dàng hơn và dễ dàng xác định vị trí xảy ra lỗi của bạn hơn. Tôi thường đi với cách tiếp cận sau trong tình huống này:

  • Tạo một đối tượng LdapConnection, do đó bạn có thể thiết lập các tùy chọn bạn cần
  • Thiết lập một ví dụ NetworkCredential với tên người dùng quản trị và mật khẩu
  • Bind vào thư mục với người sử dụng, do đó bạn có thể phát hành một truy vấn LDAP trực tiếp
  • Return một SearchResultEntry để bạn có thể xử lý các thuộc tính

bạn có một vài lựa chọn để giúp bạn thực hiện điều này, nhưng tôi muốn thử một cái gì đó như thế này:

//Delcare your Network Credential with the administrative Username, Password, and your active directory domain 
var credentials = new NetworkCredential(userName, password, domain); 

//Create a directory identifier and connection, 
var ldapidentifier = new LdapDirectoryIdentifier(serverName, port, false, false); 
var ldapconn = new LdapConnection(ldapidentifier, credentials); 

Tiếp theo, hãy chắc chắn rằng bạn đang đặt quyền AuthType ví dụ cụ thể của bạn. Vì bạn đang kết nối qua cổng 389, chỉ cần sử dụng AuthType.Basic.

ldapconn.AuthType = AuthType.Basic; 

Như bạn đã hỏi, có một cách rất dễ dàng để thiết lập truy vấn LDAP trực tiếp bằng cách tiếp cận này. Tôi giả sử bạn đang tìm kiếm theo sAMAccountName, nhưng bạn có thể sửa đổi này là cần thiết:

string ldapFilter = "(&(objectCategory=person)(objectClass=user)(&(sAMAccountName={{UserYouAreTryingToFind}})))"; 

Bây giờ chúng ta chỉ cần phải thiết lập các yêu cầu tìm kiếm, và gửi nó cho phù hợp:

//Send the search request with our delimited attribute list 
var getUserRequest = new SearchRequest(domain, ldapFilter, SearchScope.Subtree, AttributeList) 
            {SizeLimit = 1}; 

//Suppress any refferal creation from happening during the search 
var SearchControl = new SearchOptionsControl(SearchOption.DomainScope); 
getUserRequest.Controls.Add(SearchControl); 
var userResponse = (SearchResponse)ldapconn.SendRequest(getUserRequest); 

//This is where I load up the entry I've located, 
SearchResultEntry ResultEntry = userResponse.Entries[0]; 

Đó nên trả lại người dùng mà bạn đã truy vấn, cùng với bất kỳ thuộc tính nào bạn đã đặt vào AttributeList. Trong ngữ cảnh này, AttributeList chỉ là một mảng chuỗi (string[]) của tên thuộc tính - trong trường hợp của bạn, bạn sẽ muốn thêm một tên gọi là "objectGUID".

Đối với đọc các thuộc tính trên SearchResultEntry, bạn có thể thực hiện chính xác những gì bạn đã có ban đầu:

if(ResultEntry.Attributes.Contains("objectGUID")) 
{ 
    // do some stuff here 
} 

Điều đó sẽ giúp bạn đi đúng hướng.

Ngoài ra, nếu bạn chưa có bản sao wireshark, tôi đặc biệt khuyên bạn nên tải xuống - sẽ vô giá khi chẩn đoán sự cố kết nối với thư mục hoạt động.

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