15

我正在尝试连接到运行 LDAP 的 edirectory 8.8 服务器。我将如何在 .Net 中执行此操作?我仍然可以使用 System.DirectoryService 中的类,例如 DirectoryEntry 和 DirectorySearcher 还是它们是特定于 AD 的?我是否需要以不同的方式指定“连接字符串”?

我正在尝试类似下面的代码,但它似乎不起作用......

DirectoryEntry de = new DirectoryEntry ("LDAP://novellBox.sample.com","admin","password",AuthenticationTypes.None);
DirectorySearcher ds = new DirectorySearcher(de);
var test = ds.FindAll();

有任何想法吗?

4

6 回答 6

14

好吧,我认为您的连接字符串丢失了一点-仅指定服务器名称还不够好-您还需要为搜索指定一个“起点”。

在 AD 中,这通常类似于您域中的“用户”容器,您可以在 LDAP 用语中这样指定:

LDAP://novellBox.sample.com/cn=Users,dc=YourCompany,dc=com

不确定 eDirectory 的较新版本如何与 LDAP 兼容——但这应该可以工作,因为从理论上讲,它是标准 LDAP,无论实现如何 :-)

但话又说回来:只有理论上,理论和实践没有区别......

还有一个System.DirectoryServices.Protocols直接提供低级 LDAP 调用的命名空间——这绝对与 AD 无关,但它确实非常低级......

还有一个Novell C# LDAP 库,但我从未尝试过,也不能说它有多完整或有多强大。不过,它可能会给你一些线索!

另请参阅有关 Novell、LDAP 和 C# 的其他Stackoverflow 问题- 它可能会为您提供更多信息。

于 2009-09-17T07:55:16.393 回答
6

我很难弄清楚这一点,但是您可以使用以下内容,这对我来说很有效:

Domain domain = Domain.GetDomain(new DirectoryContext(DirectoryContextType.Domain, "novellBox.sample.com");
DirectorySearcher ds = new DirectorySearcher(domain.GetDirectoryEntry(), searchQuery);
using (SearchResultCollection src = ds.FindAll())
{....}
于 2009-09-17T07:41:04.480 回答
4

我认为您需要对主机使用 LDAP 语法。

确保您不要忘记释放连接using- 如果您不处理目录条目,它们将永远挂在池中,直到池用完并且您的应用程序中断。

using (DirectoryEntry de = new DirectoryEntry ("LDAP://CN=server,DC=domain,DC=com","admin","password",AuthenticationTypes.Secure))
{
    ...
}
于 2009-09-17T07:39:26.433 回答
3

根据目录服务器配置,您实际上可能需要使用 System.DirectoryServices.Protocols 命名空间。我写了一篇关于使用它连接到 OpenLDAP 的帖子。

http://mikemstech.blogspot.com/2013/03/searching-non-microsoft-ldap.html

于 2013-03-07T18:35:11.767 回答
1

我正在尝试连接到运行 LDAP 的 edirectory 8.8 服务器。我将如何在 .Net 中执行此操作?我仍然可以使用 System.DirectoryService 中的类,例如 DirectoryEntry 和 DirectorySearcher 还是它们是特定于 AD 的?

我们将 System.DirectoryServices 用于 Microsoft Active Directory、在 Linux 上运行的 OpenLDAP 和 eDirectiry,没有任何问题。所以答案是肯定的,您可以使用这些类来访问 eDir。

我是否需要以不同的方式指定“连接字符串”?

是的,你是。向 DirectoryEntry 传递以“LDAP://”开头的字符串时,您需要遵守与 URI 语法非常不同的 LDAP 语法。

我建议您使用 LDAP 浏览器(谷歌它,有很多免费下载)以获得根对象的正确路径,否则您将花时间尝试找出正确的对象类型。

于 2010-06-22T19:44:34.463 回答
1

如果外部 LDAP 需要使用 DN 进行身份验证,请尝试以下操作:首先检索用户的 DN,然后尝试使用 DN 和用户凭据进行身份验证。我已经在 Domino LDAP 上对其进行了测试。

// Autheticate in external LDAP
string ldapserver = "10.1.1.1:389";
string ldapbasedn = "o=mycompany";
string ldapuser = "cn=Administrator,o=mycompany";
string ldappassword = "adminpassword";
string ldapfilter = "(&(objectclass=person)(cn={0}))";

string user = "usertest";
string password = "userpassword";
try
{
    string DN = "";
    using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + ldapserver + "/" + ldapbasedn, ldapuser, ldappassword, AuthenticationTypes.None))
    {
        DirectorySearcher ds = new DirectorySearcher(entry);
        ds.SearchScope = SearchScope.Subtree;
        ds.Filter = string.Format(ldapfilter, user);
        SearchResult result = ds.FindOne();
        if (result != null )
        {
            DN = result.Path.Replace("LDAP://" + ldapserver + "/" , "");
        }
    }
    // try logon   
    using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + ldapserver + "/" + ldapbasedn, DN, password, AuthenticationTypes.None))
    {
        DirectorySearcher ds = new DirectorySearcher(entry);
        ds.SearchScope = SearchScope.Subtree;
        SearchResult result = ds.FindOne();
    }
} catch (Exception) { }
于 2013-06-13T11:00:29.853 回答