Как узнать, действительно ли мой 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.*
}
Надеюсь, это поможет вам