Как узнать, действительно ли мой DirectoryEntry подключен к моему каталогу LDAP?

Я подключаюсь к каталогу LDAP на C #, поэтому я использовал класс DirectoryEntry.

Когда вы выполняете «новый DirectoryEntry» с адресом, логином и паролем, он должен подключиться к каталогу LDAP.

Однако, даже если соединение не работает, оно возвращается без проблем, и переменная directoryentry установлена.

Так я знаю, что мое соединение действительно открыто? Прямо сейчас я использую очень-очень уродливый прием: я помещаю «if (mydirectory.SchemaEntry)», который генерирует исключение, если соединение не было установлено, потому что некоторые члены DirectoryEntry, такие как SchemaEntry, не не устанавливается, если соединение не удалось. Но 1: это должно быть 11/10 по шкале уродства 2: это займет много времени, прежде чем потерпеть неудачу.

Так как же лучше всего это сделать? Конечно, Microsoft должна была предоставить что-то (даже если я использую каталог LDAP, а не Active Directory), чтобы узнать, действительно ли я подключен?


person Ksempac    schedule 30.06.2009    source источник


Ответы (4)


Простое «создание» DirectoryEntry НЕ создает соединение с хранилищем LDAP.

Только после того, как вы начнете использовать его свойства или явным образом обращаетесь к свойству .NativeObject, вы фактически получите соединение с хранилищем LDAP.

Чтобы убедиться, что вы подключены, просто прочтите (DirectoryEntry).NativeObject в предложении try ... catch - если он выйдет из строя, у вас возникла проблема, в противном случае ваше соединение теперь установлено и активно.

К сожалению, насколько мне известно, не существует свойства или метода, который можно было бы вызвать, чтобы выяснить, успешно ли вы подключились к LDAP с помощью DirectoryEntry.

Марк

person marc_s    schedule 30.06.2009

Вы можете проверить DirectoryEntry.Properties.Count. Если он> 0, это действительный объект. .Properties никогда не имеет значения null - вы сможете прочитать счетчик, даже если вы не подключены к действительному DirectoryEntry, а действительный DE всегда будет иметь хотя бы одно свойство.

Никаких попыток / уловок или исключений не требуется.

person ScottBai    schedule 05.10.2010
comment
К сожалению, это не так (проверено под .NET 4 в 2015 году); что для меня позор, так как я ищу тест без исключения. Хотя DirectoryEntry.Properties сам по себе не равен нулю, даже попытка доступа к его счетчику вызывает оценку, и время ожидания истекает с ошибкой (например, сервер не работает, если отключен). - person JonBrave; 03.03.2015

Хорошо, поэтому решение marc_s было примерно тем, что я делал (за исключением того, что я искал SchemaEntry, а не NativeObject). Но задержка тайм-аута слишком велика (запрос выполняется для заполнения значений автозаполнения для формы). Я думаю, что на самом деле предпочитаю притвориться, что соединение открыто, и позволить выполнению запроса. Таким образом, я могу установить собственную, меньшую задержку тайм-аута.

person Ksempac    schedule 01.07.2009

Вы можете проверить DirectoryEntry.Properties.Count. Если это> 0, для действительного объекта. Но все же допустим, что ваш сервер LDAP не работает. вы не можете идентифицировать его ни с одним из его свойств. Вместо этого вы можете поймать его с помощью блока try catch

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.*
}       

Надеюсь, это поможет тебе

person Seeni Abirami    schedule 06.07.2015