范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

LDAP和AD域的介绍及使用

  1 LDAP入门
  1.1 定义
  LDAP是轻量目录访问协议(LightweightDirectory Access Protocol)的缩写,LDAP标准实际上是在X.500标准基础上产生的一个简化版本。
  1.2 目录结构
  LDAP也可以说成是一种数据库,也有client端和server端。server端是用来存放数据,client端用于操作增删改查等操作,通常说的LDAP是指运行这个数据库的服务器。只不过,LDAP数据库结构为树结构,数据存储在叶子节点上。  假设你要树上的一个苹果(一条记录),你怎么告诉园丁它的位置呢?
  当然首先要说明是哪一棵树(dc,相当于MYSQL的DB),然后是从树根到那个苹果所经过的所有"分叉"(ou),最后就是这个苹果的名字(uid,相当于MySQL表主键id)。好了!这时我们可以清晰的指明这个苹果的位置了,就是那棵"歪脖树"的东边那个分叉上的靠西边那个分叉的再靠北边的分叉上的半红半绿的……
  因此,在LDAP中,位置可以描述如下  树(dc=ljheee)
  分叉(ou=bei,ou=xi,ou= dong)
  苹果(cn=redApple)
  因此,苹果redApple的位置为
  dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=ljheee
  dn标识一条记录,描述了数据的详细路径。因此,LDAP树形数据库如下  dn(Distinguished Name):一条记录的详细位置
  dc :一条记录所属区域 (哪一颗树)
  ou(Organization Unit) :一条记录所属组织 (哪一个分支)
  cn/uid:一条记录的名字/ID (哪一个苹果名字) LDAP目录树的最顶部就是根,也就是所谓的"基准DN"
  因此,LDAP树形结构在存储大量数据时,查询效率更高,实现迅速查找,可以应用于域验证等。
  1.3 命名格式
  LDAP协议中采用的命名格式常用的有如下两种:LDAP URL 和X.500。
  任何一个支持LDAP 的客户都可以利用LDAP名通过LDAP协议访问活动目录,LDAP名不像普通的Internet URL名字那么直观,但是LDAP名往往隐藏在应用系统的内部,最终用户很少直接使用LDAP 名。LDAP 名使用X.500 命名规 范,也称为属性化命名法,包括活动目录服务所在的服务器以及对象的属性信息。
  2 AD入门
  2.1 AD定义
  AD是Active Directory的缩写,AD是LDAP的一个应用实例,而不应该是LDAP本身。比如:windows域控的用户、权限管理应该是微软公司使用LDAP存储了一些数据来解决域控这个具体问题,只是AD顺便还提供了用户接口,也可以利用ActiveDirectory当做LDAP服务器存放一些自己的东西而已。比如LDAP是关系型数据库,微软自己在库中建立了几个表,每个表都定义好了字段。显然这些表和字段都是根据微软自己的需求定制的,而不是LDAP协议的规定。然后微软将LDAP做了一些封装接口,用户可以利用这些接口写程序操作LDAP,使得ActiveDirectory也成了一个LDAP服务器。
  2.2 作用
  2.2.1 用户服务
  管理用户的域账号、用户信息、企业通信录(与电子邮箱系统集成)、用户组管理、用户身份认证、用户授权管理、按需实施组管理策略等。这里不单单指某些线上的应用更多的是指真实的计算机,服务器等。
  2.2.2 计算机管理
  管理服务器及客户端计算机账户、所有服务器及客户端计算机加入域管理并按需实施组策略。
  2.2.3 资源管理
  管理打印机、文件共享服务、网络资源等实施组策略。
  2.2.4 应用系统的支持
  对于电子邮件(Exchange)、在线及时通讯(Lync)、企业信息管理(SharePoint)、微软CRM&ERP等业务系统提供数据认证(身份认证、数据集成、组织规则等)。这里不单是微软产品的集成,其它的业务系统根据公用接口的方式一样可以嵌入进来。
  2.2.5 客户端桌面管理
  系统管理员可以集中的配置各种桌面配置策略,如:用户适用域中资源权限限制、界面功能的限制、应用程序执行特征的限制、网络连接限制、安全配置限制等。
  2.3 AD域结构常用对象
  2.3.1 域(Domain)
  域是AD的根,是AD的管理单位。域中包含着大量的域对象,如:组织单位(Organizational Unit),组(Group),用户(User),计算机(Computer),联系人(Contact),打印机,安全策略等。
  可简单理解为:公司总部。
  2.3.2 组织单位(Organization Unit)
  组织单位简称为OU是一个容器对象,可以把域中的对象组织成逻辑组,帮助网络管理员简化管理组。组织单位可以包含下列类型的对象:用户,计算机,工作组,打印机,安全策略,其他组织单位等。可以在组织单位基础上部署组策略,统一管理组织单位中的域对象。
  可以简单理解为:分公司。
  2.3.3 群组(Group)
  群组是一批具有相同管理任务的用户账户,计算机账户或者其他域对象的一个集合。例如公司的开发组,产品组,运维组等等。可以简单理解为分公司的某事业部。
  群组类型分为两类:  安全组:用来设置有安全权限相关任务的用户或者计算机账户的集合。比如:Tiger组都可以登录并访问某ftp地址,并拿到某个文件。
  通信组:用于用户之间通信的组,适用通信组可以向一组用户发送电子邮件。比如:我要向团队内10位成员都发送同一封邮件这里就要抄送9次,而使用组的话我直接可以发送给@Tiger,所有Tiger组内的成员都会收到邮件。
  2.3.4 用户(User)
  AD中域用户是最小的管理单位,域用户最容易管理又最难管理,如果赋予域用户的权限过大,将带来安全隐患,如果权限过小域用户无法正常工作。可简单理解成为某个工作人员。
  域用户的类型,域中常见用户类型分为:
  普通域用户:创建的域用户默认就添加到"Domain Users"中。域管理员:普通域用户添加进"Domain Admins"中,其权限升为域管理员。企业管理员:普通域管理员添加进"Enterprise Admins"后,其权限提升为企业管理员,企业管理员具有最高权限。
  一个大致的AD如下所示:
  总之:Active Directory =LDAP服务器 LDAP应用(Windows域控)。ActiveDirectory先实现一个LDAP服务器,然后自己先用这个LDAP服务器实现了自己的一个具体应用(域控)。
  3 使用LDAP操作AD域
  特别注意:Java操作查询域用户信息获取到的数据和域管理员在电脑上操作查询的数据可能会存在差异(同一个意思的表示字段,两者可能不同)。
  连接ad域有两个地址:ldap://XXXXX.com:389 和 ldap://XXXXX.com:636(SSL)。
  端口389用于一般的连接,例如登录,查询等非密码操作,端口636安全性较高,用户密码相关操作,例如修改密码等。
  域控可能有多台服务器,之间数据同步不及时,可能会导致已经修改的数据被覆盖掉,这个要么域控缩短同步的时间差,要么同时修改每一台服务器的数据。
  3.1 389登录  // 只要不抛出异常就是验证通过 public LdapContext adLogin(JSONObject json) {     String username = json.getString("username");     String password = json.getString("password");     String server = "ldap://XXXXXXX.com:389";     try {         Hashtable env = new Hashtable();         //用户名称,cn,ou,dc 分别:用户,组,域         env.put(Context.SECURITY_PRINCIPAL, username);         //用户密码 cn 的密码         env.put(Context.SECURITY_CREDENTIALS, password);         //url 格式:协议://ip:端口/组,域   ,直接连接到域或者组上面         env.put(Context.PROVIDER_URL, server);         //LDAP 工厂         env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");         //验证的类型     "none", "simple", "strong"         env.put(Context.SECURITY_AUTHENTICATION, "simple");         LdapContext ldapContext = new InitialLdapContext(env, null);         log.info("ldapContext:" + ldapContext);         log.info("用户" + username + "登录验证成功");         return ldapContext;      } catch (NamingException e) {         log.info("用户" + username + "登录验证失败");         log.info("错误信息:"+e.getExplanation());         return null;     } }
  3.2 636登录验证(需要导入证书)  //证书提前倒入的Java库中 // 参考:https://www.cnblogs.com/moonson/p/4454159.html  LdapContext adLoginSSL(JSONObject json) { String username = json.getString("username"); String password = json.getString("password"); Hashtable env = new Hashtable();  String javaHome = System.getProperty("java.home");      String keystore = javaHome+"/lib/security/cacerts";      log.info("java.home,{}",keystore);     // 加载导入jdk的域证书      System.setProperty("javax.net.ssl.trustStore", keystore);      System.setProperty("javax.net.ssl.trustStorePassword", "changeit");      String LDAP_URL = "ldap://XXXXXX.com:636"; // LDAP访问地址       env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");      env.put(Context.SECURITY_PROTOCOL, "ssl");//链接认证服务器      env.put(Context.PROVIDER_URL, LDAP_URL);      env.put(Context.SECURITY_AUTHENTICATION, "simple");      env.put(Context.SECURITY_PRINCIPAL, username);      env.put(Context.SECURITY_CREDENTIALS, password);      try {          LdapContext ldapContext = new InitialLdapContext(env, null);          log.info("认证成功");// 这里可以改成异常抛出。          return ldapContext;      } catch (javax.naming.AuthenticationException e) {          log.info("认证失败:{}",e.getMessage());      } catch (Exception e) {          log.info("认证出错:{}",e.getMessage());      }     return null; }
  3.3 查询域用户信息  public List getUserKey(JSONObject json){      JSONObject admin = new JSONObject();     admin.put("username","Aaaaa");     admin.put("password", "bbbbbbbb");     String name = json.getString("name");     log.info("需要查询的ad信息:{}",name);     List resultList = new JSONArray();     LdapContext ldapContext = adLogin(admin); //连接到域控     if (ldapContext!=null){          String company = "";         String result = "";         try {             // 域节点             String searchBase = "DC=XXXXXXX,DC=com";             // LDAP搜索过滤器类             //cn=*name*模糊查询           //cn=name 精确查询           // String searchFilter = "(objectClass="+type+")";            String searchFilter = "(sAMAccountName="+name+")";    //查询域帐号              // 创建搜索控制器             SearchControls searchCtls = new SearchControls();             String  returnedAtts[]={"description","sAMAccountName","userAccountControl"};                     searchCtls.setReturningAttributes(returnedAtts); //设置指定返回的字段,不设置则返回全部             //  设置搜索范围 深度             searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);             // 根据设置的域节点、过滤器类和搜索控制器搜索LDAP得到结果             NamingEnumeration answer = ldapContext.search(searchBase, searchFilter,searchCtls);              // 初始化搜索结果数为0             int totalResults = 0;              int rows = 0;             while (answer.hasMoreElements()) {// 遍历结果集                 SearchResult sr = (SearchResult) answer.next();// 得到符合搜索条件的DN                 ++rows;                 String dn = sr.getName();                 log.info(dn);                 Attributes Attrs = sr.getAttributes();// 得到符合条件的属性集                 if (Attrs != null) {                     try {                         for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) {                             Attribute Attr = (Attribute) ne.next();// 得到下一个属性                             // 读取属性值                             for (NamingEnumeration e = Attr.getAll(); e.hasMore(); totalResults++) {                                 company = e.next().toString();                                 JSONObject tempJson = new JSONObject();                                  tempJson.put(Attr.getID(), company.toString());                                 resultList.add(tempJson);                             }                         }                     } catch (NamingException e) {                         log.info("Throw Exception : " + e.getMessage());                     }                 }              }                             log.info("总共用户数:" + rows);         } catch (NamingException e) {             log.info("Throw Exception : " + e.getMessage());         }finally {             try{                 ldapContext.close();             }catch (Exception e){                 e.printStackTrace();             }         }     }     return resultList; }
  3.4 重置用户密码  // 管理员重置用户密码,后强制用户首次登录修改密码 public Map updateAdPwd(JSONObject json) {     String dn = json.getString("dn");//要修改的帐号(这个dn是查询的用户信息里的dn的值,而不是域账号)     String password = json.getString("password");//新密码      JSONObject admin = new JSONObject();     admin.put("username","aaaaaaa");     admin.put("password", "bbbbbbb");     Map map = new HashMap();     LdapContext ldapContext = adLoginSSL(admin); //连接636端口域     ModificationItem[] mods = new ModificationItem[2];     if (ldapContext!=null){         try {             String newQuotedPassword = """ + password + """;             byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE"); // unicodePwd:修改的字段,newUnicodePassword:修改的值             mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,                     new BasicAttribute("unicodePwd", newUnicodePassword)); mods[1] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,                     new BasicAttribute("pwdLastSet", "0"));  // 首次登录必须修改密码               // 修改密码             ldapContext.modifyAttributes(dn, mods);              map.put("result", "S");             map.put("message","成功");         }catch (Exception e){              map.put("result","E");             map.put("message", "无法重置密码");         }finally {             try{                 ldapContext.close();             }catch (Exception e){                 e.printStackTrace();             }          }      }else {         log.info("");         map.put("result","E");         map.put("message", "验证失败");     }     return map; }
  3.5 域账号解锁  // 表示锁定的字段需要测试,不一定这个lockoutTime public Map deblocking(JSONObject json) {     JSONObject admin = new JSONObject();     String dn = json.getString("dn"); //被解锁的帐号(这个dn指的是查询用户信息里的dn的值,不是域账号)     admin.put("username","aaaaaa");     admin.put("password","bbbbbb");     Map map = new HashMap();     LdapContext ldapContext = adLogin(admin);     ModificationItem[] mods = new ModificationItem[1];     if (ldapContext!=null){         try {       // "0" 表示未锁定,不为0表示锁定             mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,                     new BasicAttribute("lockoutTime","0"));             // 解锁域帐号             ldapContext.modifyAttributes(dn, mods);              map.put("result", "S");             map.put("message","成功");         }catch (Exception e){              map.put("result","E");             map.put("message", "解锁失败");         }finally {             try{                 ldapContext.close();             }catch (Exception e){                 e.printStackTrace();             }         }     }else {         map.put("result","E");         map.put("message", "验证失败");     }     return map; }
  总结
  专注分享行业最新消息和前沿技术资讯,关注我!第一时间获取最新前沿,积累技术人弯道超车的资本

苹果憋大招,这三款新品来了时间如梭,转眼就来到五月,距离苹果今年最为重磅的秋季发布会,已经仅剩不到五个月的时间了。预计本次秋季发布会上将推出全新的iPhone14系列,不出意外仍然会是今年科技数码界的顶流。中国体育品牌遇上NFT李宁官宣联手无聊猿来源新华网新华社北京4月28日电(记者王梦)日前,李宁与无聊猿游艇俱乐部(BoredApeYachtClub)编号4102的非同质化代币(NFT)达成合作,将打造无聊猿潮流运动俱乐72万跑分曲面屏,16GB256GB跌至3299元,外观超越iPhone13根据Counterpoint统计,2022年第一季度,vivo在中国市场份额排名第一,虽然被很多网友吐槽高价低配,但是既然销量那么好,肯定有它的道理,试想一下如果你选择一款手机,品松典相机怎么样松典相机的名字好像是要碰瓷松下,实际上也不是日本产的。它是一个国产的卡片机品牌。松典相机的功能和卡片机差不多,该有的功能都有,作为不能用手机的中小学生,买这个是很有性价比的。而且作森海塞尔发布入耳式无线耳机MOMENTUMTrueWireless3德国著名耳机厂商森海塞尔于近期发布了无线入耳式耳机MOMENTUMTrueWireless3。MOMENTUMTrueWireless3搭配了一枚与自家IE系列耳机相同的采用Tru骁龙870再次真香,三星直屏67W快充48MP三摄,仅1999元来到2022年之后,智能手机的硬件再次更新,目前是骁龙8Gen1,天玑9000的天下,天玑8100也有相应的舞台,成为中端机的不二之选,但是在2000元左右的价位,还是买不到这些机长续航长轴距高智能都想要?爆款近期,新能源汽车领域迎来了涨价潮,但和以往不同,这次涨价表现异常凶猛,因为参与涨价的除了外商独资品牌特斯拉之外,还包括了小鹏这样的造车新势力,以及大众埃安这样的传统汽车制造商,重点华为H3C锐捷三家交换机配置命令详解一直以来,对于华为H3C锐捷交换机的命令配置,不断的有微信群群友留言,三家交换机的配置命令容易弄混,经常在实际项目配置中出错,因此,本期我们将来介绍这三家交换机的基础配置命令,大家20年前苹果推出eMac专门为教育客户而打造今天是苹果推出eMac20周年的纪念日,eMac是专门为教室和计算机实验室的教育用途而设计的。第一代eMac在美国的售价为999美元,采用白色外壳,配有17英寸的CRT显示屏搭载7五一出游,携带相机不如用手机,vivoX80Pro刚好合适今天是五一劳动节的第一天,我身边有不少小伙伴们踏上了同城旅游的路程,甚至还有朋友为了能够记录假期里的美好,还专门去入手了一款拍照手机,那就是vivoX80系列中的X80Pro。而之烂大街的三款手机,有你在用的吗?OPPOx7这款手机外形美观,性价比极高。首先OPPO手机的外观是毋庸置疑的好看,渐变色的背面,看着就很有档次。手机的运行内存较大,运行很在线,且不容易出现卡顿闪现黑屏等情况。运行
如今华为旧旗舰降至千元,你会入手吗?众所周知,手机更新迭代的速度是相当快,往往一款手机发布之后还没过多久,另外一款性能更加强悍的手机就已经发布。而手机厂商为了抢占手机市场,不得已要将以前的旧旗舰机型进行降价处理,荣耀去年的旗舰机,跌至千元机,实力依旧强悍说起千元机,目前最受关注的就是搭载麒麟810处理器的荣耀9x,作为一个基于7nm设计的芯片,荣耀9x的性能也得到了一致的肯定,而1399也可能真的不赚钱,但在和9x与此同时,大量的落魄王者,双屏旗舰暴降1300成千元机手机市场的竞争尤为激烈。与此同时,在技术不断创新的推动下,手机的设计语言也发生了巨大的变化,尤其是在屏幕设计方面。按照传统的理解,手机机身的正面是屏幕,而背面则是后盖的配色设计。此说好不买呢?苹果9月10月出货1000万部手机11月18日,中国科技部下属研究院公布了苹果手机9月10月两个月的发货量数据,从数据中来看,虽然苹果新机的价格依然不便宜,但仅仅两个月时间以iPhone11为主的三款苹果机型共卖出买手机别只看内存大小,这几点同样重要近几年来随着手机市场的不断发展,手机的运行内存也从早年的1G2G升级到现在的6G8G甚至12G,很多厂家在宣传自己手机的时候也喜欢用大内存不卡顿这样的宣传口号,不明就里的小伙伴也稀颜值和性能兼具,11月最值得入手的手机随着通讯技术的发展,智能手机也成为了我们生活中必不可少的工具,它除了可以通话之外还可以用来办公娱乐,甚至是我们现在流行的移动支付。在我们国内手机市场当中,千元机还要占据很大一部分市手机输入法之争九宫格和全键盘哪个更科学?自从手机从物理按键改成清一色的大屏幕之后,输入法就成为我们每天使用手机必备的软件,而经历过九宫格时代的用户大多保留着使用九宫格输入法的习惯,而这种习惯也成为了跟不上时代的象征。那么在线舞蹈游戏DistanceDisco视觉形象设计DistanceDisco是一款在线舞蹈游戏,作为应对新冠疫情(COVID19)保持社交距离的解毒剂,由荷兰阿姆斯特丹的独立互动艺术家发起和创建,目前处于测试版。最近,他们推出了一国产中量级ADV新品,Benelli将推出TRK700抢占市场Benelli这个历史悠久的意大利机车品牌,虽然被中国企业收购,但在欧洲市场依旧非常受到欢迎,过去推出了TRK502这辆多功能车款让销售量突飞猛进,同时在美国的销售量也因为Leon才智双全凯翼炫界Pro解锁年轻出行新潮流随着社交媒体的蓬勃发展,越来越多年轻人开始不满足于用大众品牌和奢侈品牌来彰显自我个性,其产品的独特性符号性设计感才是更能吸引他们目光的要素。在购车方面也是如此,越来越少的年轻人痴迷这波OTA不简单,岚图FREE升级过后不亚于新车改款OTA,全称为OverTheAir,早期被广泛应用于手机行业,随着网联技术逐渐深入汽车领域,OTA也逐渐成为了汽车行业的热词。而10月16日举办的知音话岚图首届用户之夜活动,岚图汽