java修改AD域用户密码使用SSL连接方式

2023-11-17

正常情况下,JAVA修改AD域用户属性,只能修改一些普通属性,

如果要修改AD域用户密码和userAccountControl属性就得使用SSL连接的方式修改,

SSL连接的方式需要操作以下步骤:

1.安装AD域证书服务

2.证书颁发机构中设置以web的方式获取证书

3.访问http://localhost/certsrv/下载证书文件

4.将证书导入开发电脑的C:\tmp目录下,使用keytool -import -keystore命令

(以上步骤,在上一篇文章里介绍了https://www.cnblogs.com/amoyzhu/p/9259264.html)

5.写代码(注意端口是636)

package com.case.ldap;


import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.ModificationItem;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

import com.cts.spring.boot.Main.Person;

/**
 * @Description:对AD域用户的增删改查操作
 * @author zhuyr
 * @date 2018-07-03
 */
public class ADDUser {
    //DirContext dc = null;
	LdapContext dc = null;
    String root = "OU=maad,DC=case,DC=com"; // LDAP的根节点的DC
    
    /**
     * @Description:程序入口
     * @author zhuyr
     * @date 2018-07-03
     */
    public static void main(String[] args) {
    	
    	ADDUser utils = new ADDUser();
    	
    	//0.用户连接
    	//utils.init();
    	//1.添加用户
    	//utils.add("testzhu");
    	
        //2.查找组织单位下的所有用户
    	//utils.searchInformation(utils.root); 
    	
    	//3.查找组织单位下的某个用户
        /*SearchResult sr = utils.searchByUserName(utils.root, "testzhu");
        System.out.println(sr.getName());*/

        //4.修改用户属性
        //utils.modifyInformation("testzhu", "M1380005");
        //utils.updatePerson("testzhu");
    	   	
    	//5.重命名用户
        //utils.renameEntry("CN=testzhu,OU=maad,DC=case,DC=com", "CN=testzzz,OU=maad,DC=case,DC=com");
        
    	//6.删除用户
        //utils.delete("CN=testzhu,OU=maad,DC=case,DC=com");
    	
    	
    	
    	utils.certinit();
    	//7.修改密码失败
        //utils.updatePWD("testzhu");
        utils.enablePerson("testzhu");
        //utils.searchInformation(utils.root); 
    	
        
        utils.close();
    }
    
    

    /**
     * @Description:使用帐户密码登录
     * @author zhuyr
     * @date 2018-07-03
     */
    public void init() {
        Properties env = new Properties();
        String adminName = "read-only-admin@case.com";// username@domain
		String adminPassword = "Root.123";// password
		String ldapURL = "ldap://172.16.160.7:389";// ip:port
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");//LDAP访问安全级别:"none","simple","strong"
        env.put(Context.SECURITY_PRINCIPAL, adminName);
        env.put(Context.SECURITY_CREDENTIALS, adminPassword);
        env.put(Context.PROVIDER_URL, ldapURL);
        try {
            dc = new InitialLdapContext(env, null);
            System.out.println("AD域帐户密码认证成功");
        } catch (Exception e) {
            System.out.println("AD域帐户密码认证失败");
            e.printStackTrace();
        }
    }
    
    /**
     * @Description:使用SSl的方式登录
     * @author zhuyr
     * @date 2018-07-03
     */
    public void certinit() {
    	
        Properties env = new Properties();
        String adminName = "cn=read-only-admin,cn=Users,dc=case,dc=com";
		String adminPassword = "Root.123";// password
		String ldapURL = "ldap://172.16.160.7:636";// ip:port
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");//LDAP访问安全级别:"none","simple","strong"
        env.put(Context.SECURITY_PRINCIPAL, adminName);
        env.put(Context.SECURITY_CREDENTIALS, adminPassword);
        env.put(Context.PROVIDER_URL, ldapURL);
        
        String keystore = "C:\\ProgramInstall\\Java\\jdk1.8.0_51\\jre\\lib\\security\\cacerts";
        System.setProperty("javax.net.ssl.trustStore", keystore);  
        env.put(Context.SECURITY_PROTOCOL, "ssl");
        
        try {
            dc = new InitialLdapContext(env, null);
            System.out.println("AD域ssl身份认证成功");
        } catch (Exception e) {
            System.out.println("AD域ssl身份认证失败");
            e.printStackTrace();
        }
    }
    
    
    
    /**
     * @Description:关闭AD域服务连接
     * @author zhuyr
     * @date 2018-07-03
     */
    public void close() {
        if (dc != null) {
            try {
                dc.close();
                System.out.println("AD域服务连接关闭");
            } catch (NamingException e) {
                System.out.println("NamingException in close():" + e);
            }
        }
    }
    
    /**
     * @Description:新增AD域用户
     * @author zhuyr
     * @date 2018-07-03
     */
    public void add(String newUserName) {
        try {
            Attributes attrs = new BasicAttributes(true);
            attrs.put("objectClass", "user");
            attrs.put("samAccountName", newUserName);
            attrs.put("userPrincipalName", newUserName + "@mayocase.com");
	        //attrs.put("userAccountControl","66048"); 
            //attrs.put("userPassword","Root.123");
	        attrs.put("telephoneNumber","15880277368");
	        attrs.put("displayName", "显示名称");
	        attrs.put("description","描述");
	        attrs.put("mail",newUserName + "@case.com");
	        attrs.put("givenName","名字");
	        attrs.put("name","newUserName");
	        attrs.put("cn", newUserName);
	        attrs.put("sn", newUserName);
            
            dc.createSubcontext("CN=" + newUserName + "," + root, attrs);
            System.out.println("新增AD域用户成功:" + newUserName);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("新增AD域用户失败:" + newUserName);
        }
    }

    /**
     * @Description:删除AD域用户
     * @author zhuyr
     * @date 2018-07-03
     */
    public void delete(String dn) {
        try {
            dc.destroySubcontext(dn);
            System.out.println("删除AD域用户成功:" + dn);
        } catch (Exception e) {
            System.out.println("删除AD域用户失败:" + dn);
            e.printStackTrace();
        }
    }

    /**
     * @Description:重命名AD域用户
     * @author zhuyr
     * @date 2018-07-03
     */
    public boolean renameEntry(String oldDN, String newDN) {
        try {
            dc.rename(oldDN, newDN);
            System.out.println("重命名AD域用户成功");
            return true;
        } catch (NamingException ne) {
            System.out.println("重命名AD域用户失败");
            ne.printStackTrace();
            return false;
        }
    }    
    
    /**
     * @Description:修改AD域用户属性
     * @author zhuyr
     * @date 2018-07-03
     */
    public void updatePerson(String dn) {
    	Person person = new Person();		
		person.setCn("testzhu");
        person.setsAMAccountName(person.getCn());
        person.setName(person.getCn());
        person.setSn("3");
        person.setUserAccountControl("66048");
        person.setTelephoneNumber("18506999958");
        person.setGivenName("33");
        person.setDescription("3333");
        person.setDisplayName("333");
        person.setMail("testzhu@case.com");
        person.setUserPassword("Root.123");
    	
        if (person == null || person.getCn() == null 
                || person.getCn().length() <= 0) {
            return;
        }
        
        //修改的属性
        List<ModificationItem> mList = new ArrayList<ModificationItem>();
        //不能修改
        //mList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE,new BasicAttribute("userAccountControl", person.getUserAccountControl())));
        mList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE,new BasicAttribute("sn",person.getSn())));
        mList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE,new BasicAttribute("telephoneNumber", person.getTelephoneNumber())));
        mList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE,new BasicAttribute("mail", person.getMail())));
        mList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE,new BasicAttribute("givenName", person.getGivenName())));
        mList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE,new BasicAttribute("displayName", person.getDisplayName())));
        mList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE,new BasicAttribute("description", person.getDescription())));
        
        if (mList.size() > 0) {
        	
        	//集合转为数组
            ModificationItem[] mArray = new ModificationItem[mList.size()];
            for (int i = 0; i < mList.size(); i++) {
                mArray[i] = mList.get(i);
            }
            try {
				dc.modifyAttributes("cn="+dn + "," + root, mArray);
				System.out.println("修改AD域用户属性成功");
			} catch (NamingException e) {
				System.err.println("修改AD域用户属性失败");
				e.printStackTrace();
			}
        }                
    }
    /**
     * @Description:修改AD域用户密码
     * @author zhuyr
     * @date 2018-07-03
     */
    public void updatePWD(String dn) {
    	Person person = new Person();	
    	person.setCn("testzhu");
    	person.setUserPassword("Root.456");
    	String sOldPassword ="Root.123";
        
    	if (person == null || person.getCn() == null 
                || person.getCn().length() <= 0) {
            return;
        }
        
        try {
        	
        	String oldQuotedPassword = "\"" + sOldPassword + "\"";  
            byte[] oldUnicodePassword = oldQuotedPassword.getBytes("UTF-16LE"); 
        	
        	String newQuotedPassword = "\"" + person.getUserPassword() + "\"";
    		byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");
        	
        	ModificationItem[] mods = new ModificationItem[2];
        	//mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,new BasicAttribute("unicodePwd", newUnicodePassword));
    		mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, new BasicAttribute("unicodePwd", oldUnicodePassword));  //userPassword
            mods[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE, new BasicAttribute("unicodePwd", newUnicodePassword));  
        	
        	
    		    		
    		dc.modifyAttributes("cn="+dn + "," + root, mods);
    		System.out.println("修改密码成功!");
        }catch(Exception e) {
			e.printStackTrace();
        }
    }
    
    /**
     * @Description:修改AD域用户属性
     * @author zhuyr
     * @date 2018-07-03
     */
    public void enablePerson(String dn) {
    	Person person = new Person();	
    	person.setCn("testzhu");
        person.setUserAccountControl("66048");
        
    	if (person == null || person.getCn() == null 
                || person.getCn().length() <= 0) {
            return;
        }
        
        try {
    		ModificationItem[] mods = new ModificationItem[1]; 
            mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,new BasicAttribute("userAccountControl", person.getUserAccountControl()));
    		    		
    		dc.modifyAttributes("cn="+dn + "," + root, mods);
    		System.out.println("启用用户成功!");
        }catch(Exception e) {
			e.printStackTrace();
        }
    }

    /**
     * @Description:搜索指定节点下的所有AD域用户
     * @author zhuyr
     * @date 2018-07-03
     */
    public void searchInformation(String searchBase) {
        try {
            SearchControls searchCtls = new SearchControls();
            searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            String searchFilter = "objectClass=user";
            String returnedAtts[] = { "memberOf" };
            searchCtls.setReturningAttributes(returnedAtts);
            NamingEnumeration<SearchResult> answer = dc.search(searchBase, searchFilter, searchCtls);
            while (answer.hasMoreElements()) {
                SearchResult sr = (SearchResult) answer.next();
                System.out.println(sr.getName());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @Description:指定搜索节点搜索指定域用户
     * @author zhuyr
     * @date 2018-07-03
     */
    public SearchResult searchByUserName(String searchBase, String userName) {
        SearchControls searchCtls = new SearchControls();
        searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
        String searchFilter = "sAMAccountName=" + userName;
        String returnedAtts[] = { "memberOf" }; //定制返回属性
        searchCtls.setReturningAttributes(returnedAtts); //设置返回属性集
        try {
            NamingEnumeration<SearchResult> answer = dc.search(searchBase, searchFilter, searchCtls);
            return answer.next();
        } catch (Exception e) {
            System.err.println("指定搜索节点搜索指定域用户失败");
            e.printStackTrace();
        }
        return null;
    }
}

  

 

转载于:https://www.cnblogs.com/amoyzhu/p/9261844.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java修改AD域用户密码使用SSL连接方式 的相关文章

  • 在java中轮询Http服务器(重复发送http get请求)

    当对其进行 REST 调用时 我的 Web 服务器会发送一些信息 我想不断轮询该服务器 间隔5秒后重复发送HTTP GET请求 以检查返回的信息是否有任何变化 做到这一点最有效的方法是什么 您能提供一些代码示例吗 请注意 我只想开发客户端代
  • 按下按钮并在java中的新窗口中打开文件

    我创建了一个 JFrame 并放置了一个文本字段和按钮 在文本字段中我放置了从文本文件读取的名称 我知道我想单击按钮并打开一个已知窗口 我想在其中放置名称 其他信息来自同一个文件 这是我的代码 这是我的主框架 package Fronten
  • 使用 Java 的 Apache Http 摘要身份验证

    我目前正在开发一个 Java 项目 但无法使 http 摘要身份验证正常工作 我尝试使用 Apache 网站 但没有帮助 我有一个需要 HTTP 摘要身份验证的网站 DefaultHttpClient httpclient new Defa
  • Java:扩展类并实现具有相同方法的接口

    可能无法完成以下操作 我收到编译错误 继承的方法 A doSomthing int 无法隐藏 B 中的公共抽象方法 public class A int doSomthing int x return x public interface
  • Java Logger 未记录到 Netbeans 中的输出

    我正在 Netbeans 中使用 Maven 启动一个 Java 项目 我编写了一些代码来使用 Logger 类进行日志记录 但是 日志记录似乎不起作用 在程序开始时 我运行 Logger getLogger ProjectMainClas
  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • eclipse行号状态行贡献项是如何实现的?

    我需要更新状态行编辑器特定的信息 我已经有了自己的实现 但我想看看 eclipse 贡献项是如何实现的 它显示状态行中的行号 列位置 谁能指点一下 哪里可以找到源代码 提前致谢 亚历克斯 G 我一直在研究它 它非常复杂 我不确定我是否了解完
  • 为什么即使我的哈希码值相同,“==”也会返回 false

    我写了一个像这样的课程 public class HashCodeImpl public int hashCode return 1 public static void main String args TODO Auto generat
  • 如何在 JPQL 或 HQL 中进行限制查询?

    在 Hibernate 3 中 有没有办法在 HQL 中执行相当于以下 MySQL 限制的操作 select from a table order by a table column desc limit 0 20 如果可能的话 我不想使用
  • 如何在 Java 中向时间戳添加/减去时区偏移量?

    我正在使用 JDK 8 并且玩过ZonedDateTime and Timestamp很多 但我仍然无法解决我面临的问题 假设我得到了格式化的Timestamp在格林威治标准时间 UTC 我的服务器位于某处 假设它设置为Asia Calcu
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • 如何检查某个元素是否存在于一组项目中?

    In an ifJava中的语句如何检查一个对象是否存在于一组项目中 例如 在这种情况下 我需要验证水果是苹果 橙子还是香蕉 if fruitname in APPLE ORANGES GRAPES Do something 这是一件非常微
  • 如何在.NET中使用java.util.zip.Deflater解压缩放气流?

    之后我有一个转储java util zip Deflater 可以确认它是有效的 因为 Java 的Inflater打开它很好 并且需要在 NET中打开它 byte content ReadSample sampleName var inp
  • Java继承,扩展类如何影响实际类

    我正在查看 Sun 认证学习指南 其中有一段描述了最终修饰符 它说 如果程序员可以自由地扩展我们所知的 String 类文明 它可能会崩溃 他什么意思 如果可以扩展 String 类 我是否不会有一个名为 MyString 的类继承所有 S
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • 生成 enum 类——数字字典里新增一个按钮 生成他们对应得枚举——java

    前 后 码片 数字字典里新增一个按钮 生成他们对应得枚举 后端 xml 创建一个enum ftl Description dict dictName Author ksf Date now string yyyy MM dd Version
  • sql server 经典练习题分享二

    26 查询存在有85分以上成绩的课程Cno SELECT DISTINCT cno FROM dbo scores WHERE degree gt 85 27 查询出 计算机系 教师所教课程的成绩表 SELECT tname prof cn
  • 23. 客户默认选项(Default Customer Options)

    Editing Email Templates Email Sender Contact Us
  • iphone尺寸_2007至2020:最全的iPhone手机25部历代发展及价格变化历史

    所以iPhone SE 2020 是真的廉价倒地了 智能手机时代的开始 第一代iPhone 2G 2007 4G 3800 8G 4560 2007年 史蒂夫 乔布斯 Steve Jobs 穿着运动鞋 牛仔裤 T恤站在舞台上 宣布了第一部i
  • Maven、pom.xml

    maven库中心 Maven Central Repository Search 搜索可以用的包与版本 目录 Maven 使用方法 1 下载 配置 2 项目中使用 3 生命周期 4 构建插件 MAVEN工程 的目录结构 父子项目 创建父项目
  • dpr-2000 四usb口无线多功能打印服务器,D-Link DPR-2000 超高兼容的打印服务器

    PConline资讯 DPR 2000无线802 11 G多功能打印服务器是一个通用多端口的打印服务器 是办公 学校和商业使用的理想选择 它提供4个USB连接接口可以连接4台USB打印机 本设备给用户提供添加多个打印机 多功能打印机或扫描仪
  • vue项目使用luckyexcel插件预览excel表格

    温馨提示 需要用到luckysheet文件和luckyexcel插件 根据下面步骤一步一步操作会避免踩坑 比如我当时遇到了window luckysheet is not defined控制台报红的问题 第一步 引入luckysheet的相
  • JAVA单元测试框架-14-实现TestNG失败案例重跑

    前面是通过java代码指定重跑 本节是讲解通过实现IAnnotationTransformer接口实现失败案例重跑 创建MyRetry 实现IRetryAnalyzer 接口 package Listener import org test
  • MMsegmentation文档学习

    1 了解配置 config文件结构 config base 下有4种基本组件类型 dataset model schedule default runtime 同一文件夹下的所有配置 建议只具有一个原始配置 所有其他配置从原始配置继承 这样
  • JDK8升级JDK11最全实践干货来了

    1 前言 截至目前 2023年 Java8发布至今已有9年 2018年9月25日 Oracle发布了Java11 这是Java8之后的首个LTS版本 那么从JDK8到JDK11 到底带来了哪些特性呢 值得我们升级吗 而且升级过程会遇到哪些问
  • Ts接口的使用

    TypeScript 的核心原则之一是对值所具有的结构进行类型检查 我们使用接口 Interfaces 来定义对象的类型 接口是对象的状态 属性 和行为 方法 的抽象 描述 接口初探 需求 创建人的对象 需要对人的属性进行一定的约束 id是
  • 工作10年我面试过上百个程序员,真想对他们说…

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 一 写在前面 最近收到不少读者反馈 说自己在应聘一些中大型互联网公司的Java工程师岗位时遇到了不少困惑 这些同学说自己也做了精心准备 网上搜集了不少Java面试题
  • Edit Distance

    Given two words word1 and word2 find the minimum number of steps required to convert word1 to word2 each operation is co
  • 【转载】探索推荐引擎内部的秘密

    原网址 https www ibm com developerworks cn web 1103 zhaoct recommstudy1 index html icomments 这是2011年ibm发布的文章 较为通俗易懂 适合想入门推荐
  • 配置msf连接postgresql数据库

    BackTrack 5 R3版本的Metasploit在每次的升级后总会出现奇奇怪怪的错误 主要是Ruby的库出错 网上找了一些解决的办法 但每次更新后又会出错 蛋碎 解决方法 BackTrack 5中默认自动开启端口7337 1 查看Po
  • Zabbix监控MariaDB服务

    文章目录 1 概述监控MariaDB服务主机 2 安装MariaDB服务和配置MariaDB 3 配置Zabbix的userparameter mysql conf 文件模板 4 在Web配置模板 5 在server进行压力测试mysql服
  • svg实现文本的垂直居中对齐样式

    项目中用到表格内画折线趋势图 本人使用的svg绘制简单折线 没有数据的单元格显示文字 为了不影响表格的宽度自适应 就想到在svg上写文字 于是就有了在svg上对文字样式进行垂直居中的需求 上代码
  • Linux教程:在虚拟机中如何配置Linux系统网络环境 ?

    对于很多初学Linux 的同学 大多选择使用虚拟机来展开学习 可以方便的做实验 修改 测试 不必害怕出问题 可以随便折腾 大不了换一个虚拟机 原来的系统不受任何影响 但由于不是实体pc机 使用难免受限 如果配置不好 后期开发必受其累 比如
  • C++Primer(4-8章)

    第四章 表达式 求值顺序 C 中没有明确规定大多数运算符的求值顺序 因此我们要避免 改变了某个运算对象的值 又在表达式其他地方使用这个运算对象 这种情况出现 赋值运算满足右结合律 在输出表达式中使用条件运算符 条件运算符的优先级非常低 因此
  • java修改AD域用户密码使用SSL连接方式

    正常情况下 JAVA修改AD域用户属性 只能修改一些普通属性 如果要修改AD域用户密码和userAccountControl属性就得使用SSL连接的方式修改 SSL连接的方式需要操作以下步骤 1 安装AD域证书服务 2 证书颁发机构中设置以