【问题标题】:How to know if my DirectoryEntry is really connected to my LDAP directory?如何知道我的 DirectoryEntry 是否真的连接到我的 LDAP 目录?
【发布时间】:2009-06-30 13:17:58
【问题描述】:

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

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

但是,即使连接失败,它也可以毫无问题地返回,并且设置了 directoryentry 变量。

所以我知道我的连接真的打开了吗?现在,我正在使用一个非常丑陋的 hack:我放了一个“if(mydirectory.SchemaEntry)”,如果连接没有建立,它会生成一个异常,因为 DirectoryEntry 的一些成员,例如 SchemaEntry,是'如果连接失败则不设置。但是 1:那必须是丑陋等级的 11/10 2:这需要很长时间才能失败。

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

【问题讨论】:

    标签: c# active-directory ldap directoryentry


    【解决方案1】:

    只是“新建”一个 DirectoryEntry不会创建到 LDAP 存储的连接。

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

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

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

    马克

    【讨论】:

      【解决方案2】:

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

      无需尝试/捕获或异常。

      【讨论】:

      • 很遗憾不是真的(在 .NET 4 下测试,2015 年);这对我来说很遗憾,因为我正在寻找非异常测试。虽然 DirectoryEntry.Properties 本身不为空,但即使尝试访问其 Count 也会导致评估,并且会因错误而超时(例如,如果断开连接,“服务器无法运行”)。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 2012-03-23
          • 1970-01-01
          • 1970-01-01
          • 2012-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多