通过 LDAP 连接到 Active Directory

Posted

技术标签:

【中文标题】通过 LDAP 连接到 Active Directory【英文标题】:Connect to Active Directory via LDAP 【发布时间】:2013-01-26 15:10:13 【问题描述】:

我想用 C# 连接到我们的本地 Active Directory。

我找到了this good documentation。

但我真的不知道如何通过 LDAP 进行连接。

有人能解释一下如何使用询问的参数吗?

示例代码:

  static DirectoryEntry createDirectoryEntry()  
    
     // create and return new LDAP connection with desired settings  

     DirectoryEntry ldapConnection     = new DirectoryEntry("rizzo.leeds-art.ac.uk");  
     ldapConnection.Path               = "LDAP://OU=staffusers,DC=leeds-art,DC=ac,DC=uk";  
     ldapConnection.AuthenticationType = AuthenticationTypes.Secure;  
     return ldapConnection;  
    

我只有 Active Directory 服务器的主机名和 IP 地址。 DC=xxx,DC=xx等是什么意思?

【问题讨论】:

ou = 组织单位,dc = 域组件 【参考方案1】:

DC 是您的域。如果您想连接到域 example.com,那么您的 dc 是:DC=example,DC=com

您实际上不需要域控制器的任何主机名或 IP 地址(可能有很多)。

想象一下,您正在连接到域本身。因此,要连接到域 example.com,您可以简单地编写

DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://example.com");

你就完成了。

您还可以指定用于连接的用户和密码:

DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://example.com", "username", "password");

还要确保始终以大写形式编写 LDAP。我遇到了一些麻烦和奇怪的异常,直到我在某个地方读到我应该尝试用大写字母写它并解决了我的问题。

directoryEntry.Path 属性可让您深入了解您的域。因此,如果您想在特定 OU(组织单位)中搜索用户,您可以在此处进行设置。

DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://example.com");
directoryEntry.Path = "LDAP://OU=Specific Users,OU=All Users,OU=Users,DC=example,DC=com";

这将匹配以下 AD 层次结构:

com 示例 用户 所有用户 特定用户

只需从最深到最高编写层次结构。

Now you can do plenty of things

例如通过账户名搜索用户并获取用户的姓氏:

DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://example.com");
DirectorySearcher searcher = new DirectorySearcher(directoryEntry) 
    PageSize = int.MaxValue,
    Filter = "(&(objectCategory=person)(objectClass=user)(sAMAccountName=AnAccountName))"
;

searcher.PropertiesToLoad.Add("sn");

var result = searcher.FindOne();

if (result == null) 
    return; // Or whatever you need to do in this case


string surname;

if (result.Properties.Contains("sn")) 
    surname = result.Properties["sn"][0].ToString();

【讨论】:

这是一个答案!感谢您的帮助。 我有 IpAddress 和 FQN;哪个更快? 1 个 IpAddress 中是否还会引用 1 个以上的域? 我遇到了各种异常,直到我将过滤器简化为:"(cn=roland)"。从一个工作系统可以使过滤器逐渐“更好”(=更复杂) 如何连接到特定的域控制器? 将“LDAP://example.com”替换为“LDAP://myDomainController.example.com”。应该可以工作并连接到指定的域控制器。【参考方案2】:

ldapConnection 是服务器地址:ldap.example.com Ldap.Connection.Path 是您喜欢在 LDAP 格式中插入的 ADS 中的路径。

OU=Your_OU,OU=other_ou,dc=example,dc=com

您从最深的 OU 开始,回到 AD 的根目录,然后为每个域部分添加 dc=X,直到您拥有包括***域在内的所有内容

现在我错过了一个用于身份验证的参数,这与用户名的路径相同

CN=username,OU=users,DC=example,DC=com

Introduction to LDAP

【讨论】:

【参考方案3】:

如果您的电子邮件地址是“myname@mydomain.com”,请尝试如下更改 createDirectoryEntry()。

如果XYZ存在于mydomain目录中,则为可选参数

static DirectoryEntry createDirectoryEntry()

    // create and return new LDAP connection with desired settings
    DirectoryEntry ldapConnection = new DirectoryEntry("myname.mydomain.com");
    ldapConnection.Path = "LDAP://OU=Users, OU=XYZ,DC=mydomain,DC=com";
    ldapConnection.AuthenticationType = AuthenticationTypes.Secure;
    return ldapConnection;

这基本上会检查 com -> mydomain -> XYZ -> Users -> abcd

主要功能如下:

try

    username = "Firstname LastName"
    DirectoryEntry myLdapConnection = createDirectoryEntry();
    DirectorySearcher search = new DirectorySearcher(myLdapConnection);
    search.Filter = "(cn=" + username + ")";
    ....    

【讨论】:

以上是关于通过 LDAP 连接到 Active Directory的主要内容,如果未能解决你的问题,请参考以下文章

具有多个 Active Directory 服务器的 Grails Spring Security LDAP 插件

Android:如何检查设备是不是通过 WiFi - Direct 连接到另一台设备?

PHP 通过 SSH 隧道连接到其他网络中的 LDAP

我无法通过 WIFI 连接到 WI-FI DIRECT 制作的接入点

通过 Direct Query 连接到 Azure 专用 SQL 池的 Power BI 报表性能缓慢

wifi-direct端连接到Android上的对等点?