[英]How to know if my DirectoryEntry is really connected to my LDAP directory?
我正在连接到C#中的LDAP目录,所以我使用了DirectoryEntry类。
当您使用地址,登录名和密码执行“new DirectoryEntry”时,它应该连接到LDAP目录。
但是,即使连接不起作用,它也会返回没有问题,并且设置了directoryentry变量。
所以我知道我的连接真的开了吗? 现在,我正在使用一个非常非常丑陋的黑客:我放了一个“if(mydirectory.SchemaEntry)”,如果没有建立连接会产生异常,因为DirectoryEntry的某些成员,例如SchemaEntry,不是如果连接失败,则设置。 但是1:在丑陋的等级2上必须是11/10:在失败之前需要花费很多时间。
那么这样做的好方法是什么? 当然,微软必须提供一些东西(即使我使用的是LDAP目录而不是Active Directory)来了解我是否真的已经连接了?
只需“新建”DirectoryEntry就不会创建与LDAP存储的连接。
只有在您开始使用其属性或显式访问.NativeObject
属性时,您才会实际获得与LDAP存储的连接。
为了确保你已经连接,只需在try ... catch子句中读出(DirectoryEntry).NativeObject
- 如果它被炸弹,你就会遇到问题,否则你的连接现在已经启动并处于活动状态。
不幸的是,据我所知,没有任何属性或方法可以调用以确定您是否已使用DirectoryEntry成功连接到LDAP。
渣
您可以检查DirectoryEntry.Properties.Count。 如果它> 0,则它是一个有效的对象。 .Properties永远不会为null - 即使您没有连接到有效的DirectoryEntry,您也可以读取计数,并且有效的DE将始终至少有一个属性。
没有必要的尝试/捕获或例外。
好吧,所以marc_s的解决方案大致是我正在做的事情(除了我正在寻找SchemaEntry而不是NativeObject)。 但是超时延迟太长(运行查询以填充表单的自动完成值)。 我想我其实更喜欢假装连接已打开并让查询运行。 这样,我可以设置自己的,更小的超时延迟。
您可以检查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.*
}
希望这对你有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.