为什么我的LDAP查询失败?

时间:2013-10-09 16:42:44

标签: c# active-directory ldap

在我的开发机器上,我有一系列VM。其中一个是域控制器。域控制器确实正在工作,因为我无法在没有对其进行身份验证的情况下登录到其他VM。

我正在尝试针对此DC测试LDAP查询并且它一直失败

我的域控制器树看起来像:

  • DC机器名称= ESDEV-DC01
  • Active Directory名称= ESDEV.COM
  • 目标节点的规范名称= ESDEV.COM/Users

我的潜力目标看起来像:

  • 属性名称= objectCategory
  • 属性值= CN = Person,CN = Schema,CN = Configuration,DC = ESDEV,DC = COM

我的参数是:

  • DirectoryPath = "LDAP://OU=Users, DC=ESDEV-DC01,DC=ESDEV,DC=Com"
  • SearchFilter = "(&(objectCategory=Person))"

问题:

我一直在“服务器上没有这样的对象”。

  1. 这是否意味着找到了服务器目录?
  2. 为什么查询失败?
  3. LDAP查询是否区分大小写?
  4. MY CONSOLE APP代码看起来像:

    我认为我的问题可以在没有这篇文章的情况下得到解答,但对于那些关心我用来测试查询的代码的人来说......

    namespace LDAPQueryTester
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    string directoryPath = ConfigurationManager.AppSettings["DirectoryPath"];
                    string searchFilter = ConfigurationManager.AppSettings["SearchFilter"];
    
                    DirectoryEntry rootEntry = new DirectoryEntry(directoryPath);
                    DirectorySearcher srch = new DirectorySearcher(rootEntry);
    
                    srch.SearchScope = SearchScope.Subtree;
    
                    if (searchFilter.Length > 0)
                    {
                        srch.Filter = searchFilter;
                    }
    
                    SearchResultCollection res = srch.FindAll();
    
                    if (res.Count <= 0)
                    {
                        Console.WriteLine("Your query did NOT return results");
                    }
                    else
                    {
                        Console.WriteLine("Your query returned results");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine(ex.StackTrace);
                }
    
                Console.ReadLine();
            }
        }
    }
    

1 个答案:

答案 0 :(得分:2)

据我记忆,Users是一个通用容器 - 而不是OU - 所以你应该尝试这个LDAP路径:

LDAP://CN=Users,DC=ESDEV-DC01,DC=ESDEV,DC=Com

注意:CN=Users而不是OU=Users

LDAP前缀必须全部为大写

但如果您使用的是.NET 3.5或更高版本,我建议您查看新的System.DirectoryServices.AccountManagement命名空间,它可以使很多东西更容易使用!

您可以使用PrincipalSearcher和“按示例查询”主体进行搜索:

// create your domain context
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "ESDEV.COM", "CN=Users, DC=ESDEV-DC01,DC=ESDEV,DC=Com"))
{
   // define a "query-by-example" principal - here, we search for a UserPrincipal 
   UserPrincipal qbeUser = new UserPrincipal(ctx);

   // create your principal searcher passing in the QBE principal    
   PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

   // find all matches
   foreach(var found in srch.FindAll())
   {
       // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....          
   }
}

如果您还没有 - 绝对阅读MSDN文章Managing Directory Security Principals in the .NET Framework 3.5,该文章很好地展示了如何充分利用System.DirectoryServices.AccountManagement中的新功能。或者查看MSDN documentation on the System.DirectoryServices.AccountManagement命名空间。