大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
现在我们开始。。。。。。话说从研究这个功能到实现它前后大致花了一周的时间,毕竟用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坐标
连接代码案例
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"); }