2009-06-30 4 views
8

C#의 LDAP 디렉토리에 연결 중이므로 DirectoryEntry 클래스를 사용했습니다.내 DirectoryEntry가 실제로 내 LDAP 디렉토리에 연결되어 있는지 확인하는 방법?

주소, 로그인 및 암호로 "새 DirectoryEntry"를 수행하면 LDAP 디렉토리에 연결해야합니다.

그러나 연결이 작동하지 않더라도 아무 문제없이 반환되며 directoryentry 변수가 설정됩니다.

그래서 내 연결이 실제로 열려 있는지 압니까? 지금 당장은 아주 못생긴 해킹을 사용하고 있습니다. SchemaEntry와 같은 DirectoryEntry 멤버 중 일부가 작동하지 않기 때문에 연결이 끊어지지 않으면 예외를 생성하는 "if (mydirectory.SchemaEntry)"를 넣습니다. 연결이 실패하면 설정하지 마십시오. 하지만 1 : 추한 척도로 11/10이되어야합니다. 2 : 실패하기 전에 많은 시간이 걸립니다.

그래서 이것을 수행하는 좋은 방법은 무엇입니까? 물론, Microsoft는 내가 실제로 연결되어 있는지를 알기 위해 뭔가를 제공해야합니다 (예 : Active Directory가 아닌 LDAP 디렉토리를 사용하는 경우에도).

답변

1

. 그러나 시간 초과 지연은 너무 길다 (쿼리는 폼의 자동 완성 값을 채우기 위해 실행된다). 실제로 연결이 열려있는 것처럼 가장하여 쿼리를 실행하는 것을 선호한다고 생각합니다. 그렇게하면, 나 자신의 작은, 시간 초과 지연을 설정할 수 있습니다.

11

DirectoryEntry를 "새로 작성"하면 가 아닌은 LDAP 저장소에 대한 연결을 만듭니다.

일단 속성을 사용하기 시작하거나 명시 적으로 .NativeObject 속성에 액세스하면 LDAP 저장소에 실제로 연결됩니다.

연결되어 있는지 확인하려면 try ... catch 절에서 (DirectoryEntry).NativeObject을 읽어보십시오. 폭탄이 터지면 문제가 발생합니다. 그렇지 않으면 연결이 활성화되어 활성화됩니다.

아쉽게도 내 지식으로는 DirectoryEntry를 사용하여 LDAP에 성공적으로 연결했는지 여부를 파악할 수있는 속성이나 메서드가 없습니다.

마크 marc_s의 솔루션은 (내가 SchemaEntry하지 NativeObject 찾고있는 것을 제외하고) 내가하고 있던 약 것이었다 좋아 있도록

+0

일을하는 데 도움이

try { entry = new DirectoryEntry("priorityLDAPServer", sUserName, sPassword, AuthenticationTypes.None); if(entry.Properties.Count > 0) { object o = entry.NativeObject; ' next need to check user record in application database' } } catch (System.Runtime.InteropServices.COMException comex) { //throws you the error if LDAP server is down or wrong "Server is invalid " // you can further do a nested try catch within this block if you to try a optional LDAP server.* } 

희망을 사용하여 잡을 수는 properties.Instead의 그것을 식별 할 수 없습니다. 감사. – Ksempac

+0

깨끗한 설명 – Roshe

2

DirectoryEntry.Properties.Count를 확인할 수 있습니다. 0보다 크면 유효한 객체입니다. .Properties는 결코 null이 아닙니다. 유효한 DirectoryEntry에 연결되어 있지 않아도 카운트를 읽을 수 있으며 유효한 DE에는 항상 적어도 하나의 속성이 있습니다.

시도/캐치 또는 예외가 필요하지 않습니다.

+0

불행히도 사실이 아닙니다 (2015 년 .NET 4에서 테스트 됨). 나는 예외적이지 않은 테스트를 찾고 있기 때문에 나에게는 수치 스럽다. DirectoryEntry.Properties 자체는 null이 아니며 Count에 액세스하려고해도 평가가 발생하며 오류가 발생하여 시간이 초과됩니다 (예 : 연결이 끊어진 경우 "The Server is not operational"). – JonBrave

1

DirectoryEntry.Properties.Count를 확인할 수 있습니다. 0보다 크면 유효한 객체입니다. 그러나 여전히 LDAP 서버가 다운되었다고 가정합시다. 당신은 시도의 catch 블록이이 정밀 당신에게