如何在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
相关产品推荐
相关产品推荐

