连接到LDAP服务器会抛出NullReferenceException

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连接到LDAP服务器会抛出NullReferenceException相关的知识,希望对你有一定的参考价值。

我正在尝试使用here连接到指定System.DirectoryServices.AccountManagement的在线测试LDAP服务器,如下所示:

try
{
    using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "ldap.forumsys.com:389", "dc=example,dc=com", "cn=read-only-admin,dc=example,dc=com", "password"))
    {
         using (var searcher = new PrincipalSearcher(new UserPrincipal(ctx )))
         {
              foreach (var result in searcher.FindAll().Take(usersCount))
              {
                 DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
              }
        }
    }
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
}

但它抛出以下异常:

你调用的对象是空的。

您能否告诉我的代码有什么问题以及如何连接到该LDAP服务器?

PS:我可以使用Apache Directory Studio连接到该服务器

堆栈跟踪 :

System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName,ServerProperties&properties)在System.DirectoryServices.AccountManagement.PrincipalContext.DoServerVerifyAndPropRetrieval()处于System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType,String name,String container, System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType,String name,String container,String userName,String password)中的ContextOptions选项,String userName,String password)位于C:中的ConsoleApp1.Program.GetGroups(String userName) Users Simple Code source repos ConsoleApp1 ConsoleApp1 Program.cs:第48行

答案

正如所说的here,问题可能是您尝试使用不支持此OpenLDAP的类PrincipalContext连接到Apache Directory Studio,

所以一种方法是使用DirectoryEntry

另一答案

使用DirectoryEntry它对我有用,如下所示:

using (var searcher = new DirectorySearcher(new DirectoryEntry("LDAP://ldap.forumsys.com:389/dc=example,dc=com", "", "", AuthenticationTypes.None)))
{
    searcher.Filter = "((objectClass=person))";
    searcher.PropertiesToLoad.Add("mail");//email
    searcher.PropertiesToLoad.Add("givenName");//first name
    searcher.PropertiesToLoad.Add("sn"); //last name
    searcher.PropertiesToLoad.Add("telephoneNumber");
    searcher.PropertiesToLoad.Add("description");
    searcher.PropertiesToLoad.Add("memberOf"); // groups

    var activeDirectoryStaffs = searcher.FindAll();
    if (activeDirectoryStaffs != null)
    {
        for (int i = 0; i < activeDirectoryStaffs.Count; i++)
        {
            SearchResult result = activeDirectoryStaffs[i];
            var Email = result.Properties.Contains("mail") ? (string)result.Properties["mail"][0]:null;
            var Mobile = result.Properties.Contains("telephoneNumber") ? (string)result.Properties["telephoneNumber"][0] : null;
            var FirstName = result.Properties.Contains("givenName") ? (string)result.Properties["givenName"][0] : null;
            var LastName = result.Properties.Contains("sn") ? (string)result.Properties["sn"][0] : null;
            var Description = result.Properties.Contains("description") ? (string)result.Properties["description"][0] : null;

        }
    }
}

以上是关于连接到LDAP服务器会抛出NullReferenceException的主要内容,如果未能解决你的问题,请参考以下文章

在Linux上的备用连接上抛出SunCertPathBuilderException的LDAP连接

使用 Shell 连接到 API 工作,但带有 Python 请求库会抛出 400 Client Error: Bad Request for url

连接到 LDAP 服务器会引发 NullReferenceException

LDAP抛出Error Code 3 - Timelimit Exceeded 异常,导致CAS连接报错

无论如何,NodeJS 都会抛出 `UNABLE_TO_VERIFY_LEAF_SIGNATURE`

Ldap连接抛出对象引用未设置为对象错误的实例