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.
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' đó? –
Đâ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
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? –