当前位置: 首页 > 知识库问答 >
问题:

Ldap按电子邮件值搜索找不到记录

花欣然
2023-03-14

我编写了一个Java应用程序,通过LDAP搜索Active directory以获取用户信息。我有一个传入的自定义Person类实例列表。在它我有DN或电子邮件定义。我正在相应地修改搜索条件。代码如下:

for (Person person : members) {
    boolean ready = false;
    String filter = getConfig().getUserSearchFilter();
// (&(|(objectclass=user)(objectclass=person)(objectclass=inetOrgPerson)(objectclass=organizationalPerson)))
    String base = person.getDistinguishedName();
    if (base != null && !base.isEmpty()) {
       ready = true;
    } else if (person.getEmail() != null) {
       base = getConfig().getMemberSearchBase();
// ou=Users,ou=Managed,dc=division,dc=company,dc=com
       String mail = person.getEmail();
       StringBuilder filterBuilder = new StringBuilder(filter);
       int pIdx = filterBuilder.lastIndexOf(")");
       filterBuilder.insert(pIdx, "(|(mail=" + mail + ")(x-personalmail=" + mail + "))");
       filter = filterBuilder.toString();
       LOG.debug("New value of a filter = {}", filter);
       ready = true;
    }
    if (ready) {
       try {
           NamingEnumeration<SearchResult> search = getContext().search(base, filter, searchControls);
           ...
       } catch (NamingException nex) {
                        throw new IOException(nex);
       }
   } else {
        LOG.error("Incorrect search criteria for user {} of group {}. Person skipped", person.getName(), this.group.getName());
   }
}

代码工作时没有错误,但当指定DN时,它确实找到了一个人,但当定义email时,它什么也找不到。但是,如果复制生成的筛选器字符串并将其以以下形式传递给ldapsearch命令:

ldapsearch-lll-x-h ldaps://my.ldap.server.com-d'svc-acct@corp-dev.company.com'-w-b“ou=users,ou=managed,dc=division,dc=company,dc=com”(&((ObjectClass=user)(ObjectClass=Person)(ObjectClass=inetorgPerson)(ObjectClass=inetorgPerson)(ObjectClass=organizationalPerson)((mail=Person@domain.com)(x-PersonalMail=Person

它确实完美地找到了这个人。有人面临过类似的问题吗?你看到我的代码有什么缺陷吗?拜托,一定要帮帮我。

共有1个答案

钱志
2023-03-14

我确实找到了我问题的原因。在搜索控件中,我将作用域定义为object_scope。当您指定DN时,它确实工作,但是对于每一个字段的搜索,它无法找到对象。我将作用域更改为SUBTREE_SCOPE,一切都按预期开始工作。

 类似资料:
  • 我写了一个示例代码,在给定的日期范围内带来Outlook电子邮件帐户的一个文件夹的电子邮件。我正在使用Java邮件API 1.5和Java7。 为了获取消息,我在下面写了自1970年1月1日至2013年10月30日之前搜索电子邮件的代码- 此代码返回的消息长度为零,即自1970年1月1日至2013年10月30日之前未找到任何消息,但我的文件夹包含204封介于此范围的电子邮件。 令人惊讶的是,相同的

  • 搜索的范围设置为子树。我以为子树作用域会导致LDAP在整个树中递归搜索,但事实似乎并非如此。但是,如果我像下面这样将完整的路径添加到搜索中,就会找到该条目。 有人能告诉我哪里出了问题吗?谢了。

  • 我想按姓名、姓氏或电子邮件搜索用户,但由于我没有上述级别的用户密钥,我不知道如何实现这一点。我正在执行和管理员会话,因此它无法访问用户密钥。 我尝试过: 但它会把所有用户都带到数据库上。有什么想法吗?

  • 我们使用谷歌应用程序进行工作,我们希望能够跟踪用户的gmail活动,比如他们收到多少封电子邮件,回复多少封电子邮件 我曾经使用Google Admin Reports API:Users Usage Report来获取统计数据,但结果不准确,并且它不会返回详细的消息列表。 谷歌管理控制台上的电子邮件日志搜索正是我想要的,但我不确定是否有电子邮件日志搜索API可用,以便我们可以循环搜索所有用户并检索

  • 问题内容: 我在J2SE下使用log4j。我已将其配置为对某种类型的日志事件使用邮件程序。当logger.error触发时,出现以下异常: 有人遇到过吗?我也包括所需的mail.jar库。 任何帮助表示赞赏。谢谢克里斯 问题答案: 我查看了的源代码,该错误基本上表示了它的意思。未设置名为“ java.home”的系统属性。根据for的javadoc ,该属性由JVM自动设置为java安装目录。 我

  • 问题内容: 我正在编写新闻稿脚本,并且需要在地址中实施搜索。我用FULLTEXT为该表编制了索引,但是当我执行以下查询时: 我得到奇怪的结果。它显示“ example.com”上的所有电子邮件以及用户名为“ name”的所有电子邮件。例如我得到: 我重新编写了查询,以使用LIKE“ %name@example.com%”,但是对于一个大表,它需要花费大量的时间才能完成。有解决方案吗?我想在搜索时仅