JAVA移动MS ADUser到指定OU

简介:

近期做OA系统自动化,所以应用到了一些开发,前面文章我们介绍了使用JAVA创建MS ADUser、修改密码等,但是创建后,我们还有离职相关的自动化,我们对用户离职操作为先是禁用用户,然后移动到指定OU下,然后通过powershell或者vbs脚本每个月执行一次删除,而不是对于离职用户账户直接删除操作,所以我们对于上面的需求,需要做两步骤,首先是禁用,对于禁用用户我们一般是修改用户的useracountcontrol属性来操作的,我们将会在下一篇文章中介绍AD用户的属性。今天我们主要演示使用JAVA程序移动用户到指定OU 中。

我们环境中oadi这个用户在IXM Adm OU下,我们需要将移动到IXM Users OU下

image

配置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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
  * moveuser.java
  * 5 July 2001
  * Sample JNDI application to move an object in the Active Directory.
 
  */
 
import  java.util.Hashtable;
import  javax.naming.*;
import  javax.naming.ldap.*;
import  javax.naming.directory.*;
 
public  class  moveuser     {
      public  static  void  main (String[] args)     {
      
           Hashtable env =  new  Hashtable();
           String adminName =  "CN=Administrator,cn=Users,DC=ixmsoft,DC=com" ;
           String adminPassword =  "123"
           String oldUserpath =  "CN=aodi,OU=IXM Adm,OU=IMXSOFT Users,DC=ixmsoft,DC=com" ;
           String newUserpath =  "CN=aodi,OU=IXM Users,OU=IMXSOFT Users,DC=ixmsoft,DC=com" ;
           String ldapURL =  "ldap://192.168.5.20:389" ;
           
           env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
      
           //set security credentials, note using simple cleartext authentication
           env.put(Context.SECURITY_AUTHENTICATION, "simple" );
           env.put(Context.SECURITY_PRINCIPAL,adminName);
           env.put(Context.SECURITY_CREDENTIALS,adminPassword);
                     
           //connect to my domain controller
           env.put(Context.PROVIDER_URL,ldapURL);
                     
           try  {
 
                // Create the initial directory context
                LdapContext ctx =  new  InitialLdapContext(env, null );
 
                // Move the user
                ctx.rename(oldUserpath,newUserpath);
 
                System.out.println( "Moved user" );
                
                ctx.close();
 
          
           catch  (NamingException e) {
                System.err.println( "Problem moving object: "  + e);
           }
 
      }
}

我们定义新、旧用户路劲

image

开始执行

image

执行成功

image

我们查看AD信息

image

我们最后为了方便可以将userpath的CN用户值定义成变量,方便传值

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/**
  * moveuser.java
  * 5 July 2001
  * Sample JNDI application to move an object  in  the Active Directory.
 
  */
 
import  java.util.Hashtable;
import  javax.naming.*;
import  javax.naming.ldap.*;
import  javax.naming.directory.*;
 
public class moveuser     {
      public static void main (String[] args)     {
      
           Hashtable  env  = new Hashtable();
           String ADAccount= "aodi" ;
           String adminName =  "CN=Administrator,cn=Users,DC=ixmsoft,DC=com" ;
           String adminPassword =  "123"
           String oldUserpath =  "CN=" +ADAccount+ "," + "OU=IXM Adm,OU=IMXSOFT Users,DC=ixmsoft,DC=com" ;
           String newUserpath =  "CN=" +ADAccount+ "," + "OU=IXM Users,OU=IMXSOFT Users,DC=ixmsoft,DC=com" ;
           String ldapURL =  "ldap://192.168.5.20:389" ;
           
           env .put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
      
           //set  security credentials, note using simple cleartext authentication
           env .put(Context.SECURITY_AUTHENTICATION, "simple" );
           env .put(Context.SECURITY_PRINCIPAL,adminName);
           env .put(Context.SECURITY_CREDENTIALS,adminPassword);
                     
           //connect  to my domain controller
           env .put(Context.PROVIDER_URL,ldapURL);
                     
           try {
 
                //  Create the initial directory context
                LdapContext ctx = new InitialLdapContext( env ,null);
 
                //  Move the user
                ctx.rename(oldUserpath,newUserpath);
 
                System.out.println( "Moved user:" +ADAccount);
                System.out.println( "NewUserpath:" +newUserpath);
                ctx.close();
 
          
           catch (NamingException e) {
                System.err.println( "Problem moving object: "  + e);
           }
 
      }
}

wKiom1nVlviQey3UAAJWzSHHAiI422.jpg-wh_50




本文转自 高文龙 51CTO博客,原文链接:http://blog.51cto.com/gaowenlong/1970396,如需转载请自行联系原作者

相关文章
|
Java 网络安全 数据安全/隐私保护
|
Java 数据库连接 数据库
Java 连接MS Access数据库
java连接MS Access的两种方式: 1.JDBC-ODBC   Java连接Access可以使用MS自带的管理工具-->数据源(ODBC)设置建立连接,这样就不需要导入jar。但是,如此一来程序部署的每个机器上都要进行设置不方面。
1170 0
|
2月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
117 0
|
2月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
277 83
|
3月前
|
存储 SQL 安全
Java 无锁方式实现高性能线程实战操作指南
本文深入探讨了现代高并发Java应用中单例模式的实现方式,分析了传统单例(如DCL)的局限性,并提出了多种无锁实现方案。包括基于ThreadLocal的延迟初始化、VarHandle原子操作、Record不可变对象、响应式编程(Reactor)以及CDI依赖注入等实现方式。每种方案均附有代码示例及适用场景,同时通过JMH性能测试对比各实现的优劣。最后,结合实际案例设计了一个高性能配置中心,展示了无锁单例在实际开发中的应用。总结中提出根据场景选择合适的实现方式,并遵循现代单例设计原则以优化性能和安全性。文中还提供了代码获取链接,便于读者实践与学习。
90 0
|
2月前
|
存储 Java 调度
Java虚拟线程:轻量级并发的革命性突破
Java虚拟线程:轻量级并发的革命性突破
222 83
|
4月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
181 0
|
3月前
|
存储 Java
说一说 JAVA 内存模型与线程
我是小假 期待与你的下一次相遇 ~

热门文章

最新文章