연결 수준에서 컨트롤을 사용하려면 System.DirectoryServices.Protocol을 사용하는 것이 좋습니다. 다른 LDAP 쿼리를 만들기 위해 LDAP 연결을 다시 사용할 수 있습니다. 그러나 프로그래밍 패러다임은 DirectoryEntry
과 매우 다릅니다. DirectoryEntry
을 사용해야하는 경우 사용자 이름과 암호를 어딘가에 저장 한 다음 모든 DirectoryEntry
개체에 전달해야합니다. 내가 할 방법은 GetDirectoryEntry(string dn)
메서드를 작성하고 올바른 사용자 이름과 암호로 나를 위해 DirectoryEntry
을 만드는 방법입니다. 이것은 우아 해 보이지 않지만 잘못된 것은 아닙니다. 암호가 일반 텍스트로 메모리에 저장되는 경우 암호를 저장하려면 SecureString을 사용하십시오.
DirectoryEntry
은 자체 LDAP 연결 풀을 유지 관리하므로 아무 문제가 없습니다. 동일한 사용자 이름과 암호를 사용하는 DirectoryEntry
이 여러 개있는 경우 LDAP 연결을 공유 할 수있을 정도로 스마트합니다. 기본적으로 단일 LDAP 연결을 보유하고 다른 LDAP 쿼리를 수행하는 것과 같습니다. DirectoryEntry
개체 각각에 대해 LDAP 서버로 다시 인증하지 않습니다.
DirectoryEntry
의 블랙 박스 기능을 사용하고 싶지 않은 경우 다음의 해결 방법을 사용하면 기분이 나아질 수 있습니다.
static DirectoryEntry GetObject(DirectoryEntry root, string dn)
{
using (DirectorySearcher searcher = new DirectorySearcher(root))
{
searcher.Filter = "(distinguishedName=" + dn + ")";
searcher.SearchScope = SearchScope.Subtree;
SearchResult result = searcher.FindOne();
if (result == null) return null;
return result.GetDirectoryEntry();
}
}
사용자 이름과 암호를 사용하여 루트 개체에 바인딩하면됩니다. 그런 다음 루트 객체를 정적 변수 또는 원하는대로 유지할 수 있습니다. 그런 다음 루트 개체로 설정된 SearchRoot
을 사용하여 LDAP 쿼리를 수행하여 다른 DirectoryEntry
개체를 얻습니다. 반환 된 DirectoryEntry
은 여전히 루트 사용자 이름과 암호를 사용합니다. 다시 말하지만, 단순히 사용자 이름과 암호를 DirectoryEntry
에 전달하는 것보다 더 좋은 방법은 아닙니다. 실제로 우리는 더 많은 LDAP 쿼리를 수행해야하기 때문에 성능이 현저히 떨어집니다. DirectoryEntry
방금 System.DirectoryServices.AccountManagement에 이와 같은 기능이 있다는 것을 알았습니다. Active Directory에서 임의의 필드에 액세스해야하기 때문에이 기능이 작동하지 않습니다. – Sleepless