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

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

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

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

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

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

4 ответа

Решение

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

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

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

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

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

Марк

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

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

Вы можете проверить 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.*
}       

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

Другие вопросы по тегам