代码之家  ›  专栏  ›  技术社区  ›  Ksempac

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

  •  8
  • Ksempac  · 技术社区  · 15 年前

    我正在连接到c_中的LDAP目录,所以我使用了DirectoryEntry类。

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

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

    我知道我的连接真的打开了吗?现在,我正在使用一个非常丑陋的黑客:我放了一个“if(mydirectory.schemateEntry)”,如果连接未重新发布,它会生成一个异常,因为如果连接失败,DirectoryEntry的一些成员(如schemateEntry)将不会被设置。但是1:那必须是11/10的丑陋等级2:那需要很多时间才能失败。

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

    4 回复  |  直到 9 年前
        1
  •  11
  •   marc_s    15 年前

    只是“更新”一个导演 不是 创建到LDAP存储的连接。

    只有当您开始使用其属性时,或者当您访问 .NativeObject 属性显式地,您将实际获得到LDAP存储的连接。

    为了确保连接,只需读出 (DirectoryEntry).NativeObject 在一个try…catch子句中-如果它爆炸了,你就有问题了,否则你的连接现在已经启动并激活了。

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

    马克

        2
  •  2
  •   ScottBai    14 年前

    您可以检查directoryEntry.properties.count。如果是>0,则它是有效对象。.properties从不为空-即使未连接到有效的directoryEntry,也可以读取计数,并且有效的de将始终至少具有一个属性。

    不需要Try/Catch或异常。

        3
  •  1
  •   Ksempac    15 年前

    好的,所以Marc_的解决方案大致上就是我正在做的(除了我在寻找SchemaEntry而不是NativeObject)。但是超时延迟太长(运行查询来填充表单的自动完成值)。我想我更喜欢假装连接是开放的,让查询运行。这样,我就可以设置自己的、较小的超时延迟。

        4
  •  1
  •   zohar Seeni Abirami    9 年前

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

    希望这对你有帮助