如何知道我的DirectoryEntry是否真的连接到我的LDAP目录?

时间:2009-06-30 13:17:58

标签: c# active-directory ldap directoryentry

我正在使用C#连接到LDAP目录,所以我使用了DirectoryEntry类。

当您使用地址,登录名和密码执行“new DirectoryEntry”时,它应该连接到LDAP目录。

但是,即使连接不起作用,它也会毫无问题地返回,并且设置了directoryentry变量。

所以我知道我的连接真的开了吗?现在,我正在使用一个非常非常丑陋的黑客:我放了一个“if(mydirectory.SchemaEntry)”,如果没有建立连接会产生异常,因为DirectoryEntry的某些成员,例如SchemaEntry,不是如果连接失败,则设置。但是1:在丑陋的等级2上需要11/10:在失败之前需要花费很多时间。

那么这样做的好方法是什么?当然,微软必须提供一些东西(即使我使用的是LDAP目录而不是Active Directory)来了解我是否真的已经连接?

4 个答案:

答案 0 :(得分:12)

只需“新建”DirectoryEntry就可以创建与LDAP商店的连接。

只有在您开始使用其属性或显式访问.NativeObject属性时,您才会真正获得与LDAP存储的连接。

为了确保您已连接,只需在try ... catch子句中读出(DirectoryEntry).NativeObject - 如果它被炸出,则表示您有问题,否则您的连接现已启动并处于活动状态。

不幸的是,据我所知,没有任何属性或方法可以调用以确定您是否使用DirectoryEntry成功连接到LDAP。

马克

答案 1 :(得分:2)

您可以检查DirectoryEntry.Properties.Count。如果是> 0,它是一个有效的对象。 .Properties永远不会为空 - 即使您没有连接到有效的DirectoryEntry,您也能够读取计数,并且有效的DE将始终至少有一个属性。

不需要尝试/捕获或例外。

答案 2 :(得分:1)

好吧所以marc_s的解决方案与我正在做的大致相同(除了我正在寻找SchemaEntry而不是NativeObject)。但是超时延迟太长(运行查询以填充表单的自动完成值)。我想我其实更喜欢假装连接已打开并让查询运行。这样,我可以设置自己的,更小的超时延迟。

答案 3 :(得分:1)

您可以检查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.*
}       

希望这有助于你