摘要:本文的先决条件:待创建的邮箱账号必须已经创建了AD账号,关于如何通过Java创建AD账号,请参考我写的另一篇博客现在我们开始。。。。。。话说从研究这个功能到实现它前后大致花了一周的时间,毕竟用Java实现这个不是一件简单的事情,谁让EXCHANGE和.NET更亲呢。一开始想了两个方案:交给.NET团队开发,最终包装个接口出来。服务器安装PowerShell on Linux,远程调用PowerSh
现在我们开始。。。。。。话说从研究这个功能到实现它前后大致花了一周的时间,毕竟用Java实现这个不是一件简单的事情,谁让EXCHANGE和.NET更亲呢。一开始想了两个方案:
交给.NET团队开发,最终包装个接口出来。服务器安装PowerShell on Linux,远程调用PowerShell操作EXCHANGE。第一个方案转瞬即逝,不要问我为什么!那就第二个方案呗,拉来运维团队的同学帮忙搞一下,结果centos6真心装不上,各种包不支持,还把测试服务器装挂了。得出的结论是只有centos7以上才能安装完美运行,算了,完美放弃。Linux不行,咱就放在windows服务器吧,毕竟PowerShell是微软亲儿子啊。于是就有了最终的解决方案:Java+SSH2+PowerShell,具体的想法是Java环境下通过SSH2连接上远程的windows服务器,进入特定目录下执行PowerShell脚本创建邮箱。
至于SSH2和PowerShell是啥,这里就不重复叙述了,感兴趣的同学可以百度了解下。
PowerShell学习资料地址:http://www.pstips.net/powershell-online-tutorials/
下面直接上步骤吧
1:SSH2连接远程服务器这个很简单,下载freesshd软件,按照教程安装就行,安装完成之后使用putty工具连接测试。
freesshd下载地址:
http://www.freesshd.com/?ctt=download
freesshd安装参考百度经验的文章:
https://jingyan.baidu.com/article/f7ff0bfc1ebd322e27bb1344.html
putty安装地址:
https://pan.baidu.com/s/1dG1L1F7密码:gwou
putty测试连接成功后,可以编写Java代码连接了,该过程需要ganymed-ssh2-build210.jar的支持,所以需要添加maven坐标
<dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-ssh2</artifactId> <version>262</version> </dependency>
连接代码案例
import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session;
/** * ssh登录远程服务器 * @return */ public boolean login(){ boolean result = false; try { conn = new Connection(ip,port); conn.connect();//连接 if(!conn.authenticateWithPassword(userName, userPwd)){ logger.error("通过SSH2登录OUTLOOK邮件服务器错误,验证失败"); conn.close(); return result; } result = true; } catch (IOException e) { logger.error("通过SSH2登录OUTLOOK邮件服务器异常",e); } return result; } /** * 退出远程服务器 * @return */ public void exitConnect(){ if(conn != null){ conn.close(); } }2:Powershell脚本编写与测试
这边提供一个get-mailbox方法的脚本getEmail.ps1,用于获取员工的邮箱信息
set-executionpolicy remotesigned $user = $args[0] $password = ConvertTo-SecureString -String $args[1] -AsPlainText -Force $credential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $user,$password $session = New-PSSession -Authentication Kerberos -Credential $credential -ConfigurationName microsoft.exchange -ConnectionUri http://XXXXXXXX(你的邮件服务器)/powershell Import-PSSession $session get-mailbox $args[2]
$args[i]代表给PS脚本传递的参数,$args[0]是outlook管理员的用户名,$args[1]是管理员登录的密码,$args[2]是需要查询的AD账号。
测试案例:
测试结果:
接下来只要将PS脚本中的get-mailbox $args[2]方法替换成Enable-Mailbox $args[2] -Database $args[3]就行,$args[2]代表员工的AD账号,$args[3]代表员工的邮箱创建在哪个数据库中。
3:Java通过ssh2调用命令执行PowerShell脚本/** * 执行远程服务器上的PowerShell脚本 * @param powerShellFile powerShell的脚本文件 * @param powerShellParams powerShell的脚本文件的参数 * @return session对象,包含返回结果 */ public Session executePowerShell(String powerShellFile,String powerShellParams){ Session session = null; String command = "cmd /c C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe "+powerShellFile + " " + powerShellParams; try{ if(login()){ session = conn.openSession(); session.execCommand(command); } }catch (IOException e){ logger.error("执行远程服务器上的PowerShell脚本异常,脚本地址:"+powerShellFile,e); } return session; }
session = outLookOperationService.executePowerShell(powerShellFile,powerShellParams); //等待1分钟处理时间,1分钟后取值 Thread.sleep(60000); InputStream stdout = session.getStdout(); BufferedReader br = new BufferedReader(new InputStreamReader(stdout)); StringBuilder sb = new StringBuilder(); //关闭远程连接 outLookOperationService.exitSession(session); session = null; while(true) { String line = br.readLine(); if(line == null){ break; } System.out.println(line); sb.append(line + "n"); }
相关文章推荐
已有家长中招!“录取通知书”邮件暗藏骗局2022-09-06
连接企微和钉钉,新网全球邮助力企业协同办公2022-09-27
快速申请搭建免费企业邮箱的教程2022-09-16
如何避免你的外贸开发信被当成垃圾邮件?2022-09-14
2021年,全国企业邮箱用户共收发邮件约7637.7亿封2022-09-13