博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ldap接触(2)之修改AD域用户密码
阅读量:5895 次
发布时间:2019-06-19

本文共 3243 字,大约阅读时间需要 10 分钟。

hot3.png

编写初步的测试链接代码如下,修改用户密码等我们是链接的是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

你可能感兴趣的文章
PHP如何学习?
查看>>
谈教育与成长
查看>>
jni c++
查看>>
快速集成iOS基于RTMP的视频推流
查看>>
在C#中获取如PHP函数time()一样的时间戳
查看>>
Redis List数据类型
查看>>
android DDMS 连接真机(己ROOT),用file explore看不到data/data文件夹的解决办法
查看>>
sql server(常用)
查看>>
大数据项目实践(四)——之Hive配置
查看>>
Thread类源码解读(1)——如何创建和启动线程
查看>>
Bootstrap清除浮动的实现原理
查看>>
初学vue2.0-组件-文档理解笔记v1.0
查看>>
NG-ZORRO-MOBILE 0.11.9 发布,基于 Angular 7 的 UI 组件
查看>>
我就是一个救火员(DBA救援)
查看>>
Centos7安装Gitlab10.0
查看>>
Windows Server 笔记(六):Active Directory域服务:域控制器安装
查看>>
FTP传输文件(hcl模拟器的操作)
查看>>
discuz X3登录流程分析
查看>>
javascript事件响应
查看>>
通过script标签实现JSONP跨域调用
查看>>