自动获取 LDAP 基准 DN 列表
问题描述
在使用 LDAP 协议从 Active Directory 等目录管理服务获取组织结构数据时,一般总是需要对目录的检索路径进行配置。但是由于实际使用中的目录组织结构通常会比较复杂,往往会出现有多个树(或者 AD 中的网域)的情况。如果配置人员对所需访问路径不熟悉,或者目录组织结构特别庞大的情况下,直接人工设置容易出现配置错误或是检索效率低下的问题。所以在设计相关的配置功能时,如果能够自动获取各目录树的根路径列表,可为配置 LDAP 连接带来较大的便利。
现有案例
在此方面,常见的 LDAP 管理工具 LDAP Administrator 就提供了一个很好的方案。在设置服务器信息时,提供了一个 Fetch Base DNs 的按钮(参见下图),以帮助用户从服务器获取基准 DN 信息,作为设置检索 RootDSE,也就是目录信息树的根。

实现原理
要获取目录树的基准 DN 其实并不复杂,首先注意到 RFC 2252 文档第 13 页中针对 LDAP 的 namingContexts 属性给出了如下说明:
5.2.1. namingContexts
—RFC 2252, LDAPv3: Attribute Syntax Definitions, Page 13
这段内容的最后一句就直接指出,该属性能够允许客户端在与服务器联系时选择用于检索信息的基准对象。基于文档中的表述,实际操作中,仅需要从服务器上通过查询对象的方式获得 namingContexts 属性值,即可整理出基准 DN 列表。
除此以外,通常在获取服务器 Base DN 的过程中,并不需要用户提供连接服务器的用户登录信息,一般都可以直接获取。在 LDAP Administrator 中也仅需提供服务器的访问地址、端口以及加密选项,便可直接抓取。
代码实现
获取 LDAP 基准 DN 列表的具体实现可参考下面的 Java 代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
Hashtable<String,String> env = new Hashtable<String,String>();env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");env.put(Context.REFERRAL, "follow");// 初始化 LDAP 上下文LdapContext context = new InitialLdapContext(env, null);String base = "";String filter = "(objectclass=*)";SearchControls controls = new SearchControls();controls.setSearchScope(SearchControls.OBJECT_SCOPE);// 通过获取 namingContexts 属性值得到基准 DNNamingEnumeration<SearchResult> results = context.search(base, filter, controls);List<String> namingContextsList = new ArrayList<String>();// 处理结果if(results.hasMore()) { Attributes attrs = results.next().getAttributes(); if (attrs != null) { Attribute namingContexts = attrs.get("namingContexts"); NamingEnumeration enumeration = namingContexts.getAll(); while(enumeration.hasMore()) { namingContextsList.add((String) enumeration.next()); } }}context.close();System.out.println(namingContextsList); |
自动获取 LDAP 基准 DN 列表的更多相关文章
- python编写的自动获取代理IP列表的爬虫-chinaboywg-ChinaUnix博客
python编写的自动获取代理IP列表的爬虫-chinaboywg-ChinaUnix博客 undefined Python多线程抓取代理服务器 | Linux运维笔记 undefined java如 ...
- ant design + react,自动获取上传音频的时长(react-audio-player)
在后台管理项目中,用户要求上传音频,并且自动获取音频时长. 第一步, import { Upload, Button, Icon } from 'antd'; 第二步,在表单中使用 Upload 组件 ...
- Laravel View Composer - 当 include 一个模板时,自动获取其所需的变量
网站中,许多页面的侧边栏是相同的.例如: 分类列表页,与文章详情页的侧边栏都包含 最新文章 最新评论 统计计数 这些相同的侧边栏数据也是动态的,并不是固定的. 在每个 controller 里都写一遍 ...
- 机房ping监控 smokeping+prometheus+grafana(续) 自动获取各省省会可用IP
一.前言 1.之前的文章中介绍了如何使用smokeping监控全国各省的网络情况:https://www.cnblogs.com/MrVolleyball/p/10062231.html 2.由于之前 ...
- 使用 shell 脚本自动获取发版指标数据
问题背景 大一点的公司都会建立一套规章流程来避免低级错误,例如合入代码前必需经过同行评审:上线前必需提测且通过 QA 验证:全量前必需经过 1%.5%.10%.20%.50% 的灰度过程.尤其是最后一 ...
- 转载-centos网络配置(手动设置,自动获取)的2种方法
转载地址:http://blog.51yip.com/linux/1120.html 重新启动网络配置 # service network restart 或 # /etc/init.d/networ ...
- 分享一个快速设置背景的js 自动获取背景图的长宽
我来分享一个快速设置背景的js (需要jq支持!) 快速切图铺页面用---就是不需要手动输入背景图的长宽 自动获取背景图的长宽 : <div class="wrap"> ...
- paip.enhes efis 自动获取文件的中文编码
paip.enhes efis 自动获取文件的中文编码 ##为什么需要自动获取文件的中文编码 提高开发效率,自动获取文件的中文编码 .不需要手动设置编码...轻松的.. ##cpdetector 可 ...
- 关于启明星系统移除apppath配置,让系统自动获取路径来设置cookie的解决方法
启明星系统底层使用统一接口,特别是用户,用户登录后,都会建立一个 userinfo 的cookie.请看下面2个网址: http://120.24.86.232/book http://120.24. ...
随机推荐
- SQL学习笔记四(补充-1)之MySQL单表查询
阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录 ...
- 面试官问:JS的this指向
前言 面试官出很多考题,基本都会变着方式来考察this指向,看候选人对JS基础知识是否扎实.读者可以先拉到底部看总结,再谷歌(或各技术平台)搜索几篇类似文章,看笔者写的文章和别人有什么不同(欢迎在评论 ...
- Ubuntu下录制屏幕并转换成gif【转】
本文转载自:https://blog.csdn.net/u012964944/article/details/50464263 *录制屏幕 1)打开Ubuntu软件中心,安装RecordMyDeskt ...
- LS1021ATWR开发板启动日志分析
一.背景 LS1021ATWR开发板运行官方的openwrt系统 二.日志分析 2.1 linux相关日志 root@OpenWrt:/# reboot 重启 root@OpenWrt:/# [ 2 ...
- [参考]ASCII对照表 及 字符与二进制、十进制、16进制之间的转化(C/C++)
第1节 ASCII码对照表 1.1 ASCII控制字符 1.2 ASCII可显示字符 第2节字符的进制转换 2.1 获取字符(8位)的上四位和下四位 2.2 获取字符(上表中的‘图形’)所对应的十六进 ...
- Mininet实验 自定义拓扑结构
参考:MiniNet实验2 通过Mininet学习可视化操作,可以在界面上方便的构建拓扑结构. 最新的Mininet 2.2.0内置了一个mininet可视化工具miniedit.miniedit在/ ...
- python 返回列表中的偶数
def is_even_num(l): enum = [] for n in l: == : enum.append(n) return enum print(is_even_num([, , , , ...
- display:box,按比列划分,水平均分,及垂直等高
一.按比例划分 <div class="test"> <p id="p1">Hello</p> <p id=" ...
- 解决Error: ENOENT: no such file or directory, scandir 安装node-sass报错
新项目开发需要安装依赖,但是安装完之后通过gulp运行项目,产生了一下的报错: 解决方案是执行一些方法: npm rebuild node-sass 可是有时就是网络问题导致上面命令安装失败,查下失败 ...
- MySQL查询in操作排序
in操作排序 先说解决方案: select * from test where id in(3,1,5) order by field(id,3,1,5); 或许有人会注意过,但我以前真不知道 SQL ...