49

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

我找到了这个很好的文档

但我真的不知道如何通过 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等等是什么意思?

4

3 回答 3

94

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
    • 例子
      • 用户
        • 所有用户
          • 特定用户

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

现在你可以做很多事情

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

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();
}
于 2013-02-11T14:48:56.433 回答
3

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

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

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

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

CN=用户名,OU=用户,DC=示例,DC=com

LDAP 简介

于 2013-02-11T14:04:38.347 回答
1

如果您的电子邮件地址是“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 + ")";
    ....    
于 2015-10-23T19:22:29.267 回答