ldap接触(2)之修改AD域用户密码

编写初步的测试链接代码如下,修改用户密码等我们是链接的是636端口而不是389

先简单的讲讲AD域和LdAP文件夹訪问协议:AD(active directory)活动文件夹,动态的建立整个域模式网络中的对象的数据库或索引,协议为LDAP,安装了AD的server称为DC域控制器,存储整个域的对象的信息并周期性更新!当中的对象分为三大类——资源(如印表机)、服务(如电子邮件)、和人物(即帐户或用户,以及组)。 LDAP是一个用来公布文件夹信息到很多不同资源的协议。通常它都作为一个集中的地址被使用,只是依据组织者的须要,它能够做得更加强大。

LDAP事实上是一个电话簿,类似于我们所使用诸如NIS(Network Information Service)、DNS (Domain Name Service)等网络文件夹,也类似于你在花园中所示树木。

不少LDAP开发者喜欢把LDAP与关系数据库相比,觉得是还有一种的存贮方式,然后在读性能上进行比較。实际上,这样的对照的基础是错误的。LDAP和关系数据库是两种不同层次的概念,后者是存贮方式(同一层次如网络数据库,对象数据库),前者是存贮模式和訪问协议。LDAP是一个比关系数据库抽象层次更高的存贮概念,与关系数据库的查询语言SQL属同一级别。LDAP最主要的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它能够非常快地得到查询结果,只是在其他方面,比如更新,就慢得多。AD域和LdAP文件夹訪问协议就介绍到这里!

public static void openSSLConnect() throws Exception {
        String keystore = "D:\\Program Files\\jdk1.7.0_80\\jre\\lib\\security\\cacerts";
        System.setProperty("javax.net.ssl.trustStore", keystore);
        Properties env = new Properties();
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://ip地址:636");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, "xxxx@xxx");     
        env.put(Context.SECURITY_CREDENTIALS, "12345678");
        env.put(Context.SECURITY_PROTOCOL, "ssl");
        env.put("java.naming.referral", "follow");
        try {
            InitialLdapContext sss = new InitialLdapContext(env, null);
            System.out.println("成功了================");
            sss.close();
        } catch (NamingException e) {
            System.out.println("失败了================");
            e.printStackTrace();
        }
    }

测试修改用户密码代码如下(测试成功):

    String keystore = "D:\\Program Files\\jdk1.7.0_80\\jre\\lib\\security\\cacerts";
        System.setProperty("javax.net.ssl.trustStore", keystore);
        Properties env = new Properties();
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://xxx:636");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, "xxx@xxx.xxx.com");     
        env.put(Context.SECURITY_CREDENTIALS, "123456Ab");
        env.put(Context.SECURITY_PROTOCOL, "ssl");
        env.put("java.naming.referral", "follow");
        try {
            InitialLdapContext ldapCtx = new InitialLdapContext(env, null);
            
       
             ModificationItem[] mods = new ModificationItem[2];                          
             String oldQuotedPassword  = "\"123456Ab\"";              
             byte[] oldUnicodePassword = oldQuotedPassword.getBytes("UTF-16LE");              
             String newQuotedPassword  = "\"456789Ab\"";              
             byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");                      
  mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE,new                     BasicAttribute("unicodePwd", oldUnicodePassword));              
  mods[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE,new                          BasicAttribute("unicodePwd", newUnicodePassword));               
             String rootDn = getUserDN(ldapCtx,"xxx");
             System.out.println("rootDn================"+rootDn);
             ldapCtx.modifyAttributes(rootDn, mods);
            System.out.println("成功了================");
            ldapCtx.close();
        } catch (NamingException e) {
            System.out.println("失败了================");
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            System.out.println("失败了2w2w================");
            e.printStackTrace();
        }

特别注意密码格式,这是策略     一定要按照红色部分来做的

原因:这个最大的可能是不满足域安全策略:如密码复杂性、密码最短使用期限、强制密码历史。即长度、包含的字符、多久可以修改密码、是否可以使用历史密码等

 

 

在代码中我们用REMOVE_ATTRIBUTEADD_ATTRIBUTE在这个方法,而没用REPLACE_ATTRIBUTE这是因为REPLACE是管理员操作的权限,而用户自己是不能用REPLACE的

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/zhangph89/blog/844372

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值