通过LDAP连接到Active Directory

时间:2013-02-11 13:55:27

标签: c# active-directory

我想用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等等是什么意思?

3 个答案:

答案 0 :(得分:78)

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();
}

答案 1 :(得分:2)

ldapConnection是服务器地址:ldap.example.com Ldap.Connection.Path是ADS中您希望以LDAP格式使用insert的路径。

  

OU = Your_OU,OU = other_ou,DC =例如,DC = COM

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

现在我想念一个要进行身份验证的参数,这与用户名

的路径相同
  

CN =用户名,OU =用户,DC =例如,DC = COM

Introduction to LDAP

答案 2 :(得分:1)

如果您的电子邮件地址是&m; 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 - >用户 - > ABCD

主要功能如下:

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