You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Notes中通过LDAP获取Exchange用户的Distinguished Name(DN)

获取Exchange用户Distinguished Name(DN)的解决方案

我来帮你搞定这个问题——要获取Exchange用户的DN,不管是手动查询还是通过你的Notes代码自动获取,都有可行的办法,下面一步步说明:

一、直接获取Exchange用户DN的两种快捷方式

如果你只是需要手动获取单个用户的DN,这两种方法最直接:

1. 通过Exchange管理中心(EAC)

  • 登录Exchange管理中心,进入收件人 > 邮箱
  • 找到目标用户并双击打开属性面板,切换到属性编辑器标签(如果看不到这个标签,点击右上角的"查看",勾选"属性编辑器"即可显示)
  • 在属性列表里找到distinguishedName,对应的就是你要的DN值

2. 使用PowerShell命令

在Exchange服务器或者安装了Exchange管理工具的机器上,打开PowerShell运行:

# 针对AD用户
Get-ADUser -Identity "你的用户名" -Properties distinguishedName | Select-Object distinguishedName

# 或者直接针对Exchange邮箱用户
Get-Mailbox "你的用户名" | Select-Object DistinguishedName

二、修改你的Notes Lookup代码来自动获取DN

看了你提供的Java代码,问题在于你当前只请求了FullName和Mail字段,并没有获取DN相关属性。我帮你调整了代码,让它能正确返回用户的DN:

修改后的完整代码

public String lookup(String searchedName) throws NotesException {
    String result = null;
    try {
        Session sess = DominoUtils.getCurrentSession();
        Directory dir = sess.getDirectory();
        dir.setSearchAllDirectories(true);
        
        // 新增DistinguishedName到要抓取的属性列表
        Vector<String> itemsToFetch = new Vector<String>();
        itemsToFetch.add("FullName");
        itemsToFetch.add("Mail");
        itemsToFetch.add("DistinguishedName"); // 关键:添加DN字段
        
        Vector<String> namesToLookup = new Vector<String>();
        namesToLookup.add(searchedName);
        
        DirectoryNavigator dirnav = dir.lookupNames("($Users)", namesToLookup, itemsToFetch, true);
        
        while (dirnav.isNameLocated()) {
            while (dirnav.isMatchLocated()) {
                // getNthItemValue的参数是从1开始计数的,所以第三个字段用3
                Vector<String> dnValue = dirnav.getNthItemValue(3); 
                if (dnValue != null && !dnValue.isEmpty()) {
                    result = dnValue.get(0);
                    break; // 找到第一个匹配项就返回,避免多余遍历
                }
                dirnav.findNextMatch();
            }
            dirnav.findNextName();
        }
        
        // 回收资源,注意不要回收当前Session!
        dirnav.recycle();
        dir.recycle();
        // sess.recycle(); 这一行必须注释,否则会破坏当前会话
        
    } catch (Exception e) {
        System.err.println("Error in lookup function (DirectoryDelegatesPickerEws): " + e.getMessage());
        e.printStackTrace();
    }
    return result;
}

代码修改要点说明

  • 新增DN字段请求:把DistinguishedName加入itemsToFetch,这样LDAP查询会返回该属性值
  • 修正索引位置:getNthItemValue是从1开始计数的,所以第三个字段(DistinguishedName)用参数3
  • 移除Session回收:DominoUtils.getCurrentSession()返回的是当前正在使用的会话,回收它会导致后续Notes操作出错,必须注释掉这行
  • 优化错误输出:用System.err打印错误,同时输出异常消息和堆栈,方便调试

最后还要确认一下:你的Notes目录配置已经正确连接到Exchange的LDAP服务器,并且有读取用户distinguishedName属性的权限。如果还是获取不到,可以先用LDAP客户端(比如Windows自带的LDP.exe)测试查询,确认Exchange LDAP服务器确实返回该属性,排除服务器端的权限或配置问题。

内容的提问来源于stack exchange,提问作者akaushik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:18:32