一次Exchange邮箱接口的开发经历
第一次接触Exchange邮箱,资料翻了很多,也踩过一些坑。这里把整个开发经过记录一下:
使用Exchange提供的COM组件编写接口
毫无疑问,直接调用Exchange的接口是最简单暴力的,但是在实际开发中发现了一些问题不得不改变思路。
1、网上流传这个COM组件并不是太稳定,而且针对C#一直存在一些BUG,建议用VB编码
2、Exchange只能安装在服务器版本的Windows上,而服务器的文件又是只进不出的,所以拿不到COM组件,就算拿到了也不好测试。
使用PowerShell来操作Exchange
使用PowerShell比COM组件要多出一步,但是毕竟它们都是微软的产品,在稳定性上还是可以的。
using (PowerShell powerShell = PowerShell.Create()) { PSCommand command = new PSCommand(); command.AddCommand("Enable-Mailbox"); command.AddParameter("identity", identity); command.AddParameter("Confirm", false); powerShell.Commands = command; using (powerShell.Runspace = GetRunspace()) { Collection<PSObject> result = powerShell.Invoke(); } }
private Runspace GetRunspace() { RunspaceConfiguration rsConfig = RunspaceConfiguration.Create(); PSSnapInException snapInException = new PSSnapInException(); PSSnapInInfo snapinInfo = rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out snapInException); Runspace runspace = RunspaceFactory.CreateRunspace(rsConfig); runspace.Open(); return runspace; }
以启用邮箱为例,代码并不复杂,主要由2个部分组成:
1、添加Command:操作Exchange的指令和参数
2、添加Runspace:这里主要是添加SnapIn,因为在默认环境下,PowerShell是不支持Exchange指令的
问题一:
新建个控制台程序测试一下,然后果然就报错了。从上面代码可以看出来“E2010”,可是我操作的Exchange是2016版本,尝试改成“E2016”,然后还是报错了。
然后从搜索引擎查一下,改成“Microsoft.Exchange.Management.PowerShell.Admin”,仍然报错。
实在没有办法了,在服务器上查找关键字“Microsoft.Exchange.Management.PowerShell”,搜索到一个叫“Microsoft.Exchange.Management.PowerShell.SnapIn”的DLL,尝试了一下操作成功了。
附上各版本SnapIn的参数:
Exchange 2007:Microsoft.Exchange.Management.PowerShell.Admin
Exchange 2010:Microsoft.Exchange.Management.PowerShell.E2010
Exchange 2013 & 2016:Microsoft.Exchange.Management.PowerShell.SnapIn
问题二:
核心代码测试完成,集成到WebServices去,在服务器本地再测试一下,报错。
第一想法是不是代码搞错了,检查了一下结果和控制台程序的代码一模一样,再测试,仍然报错。切换到控制台程序再测试,成功了。
后来发现是权限问题,在网站上调用PowerShell是属于完程调用,需要进行身份验证。
远程调用PowerShell来操作Exchange
然后就进入到了一个不断测试代码的过程,具体的经过我也不太记得了,大致就是用WSManConnectionInfo建议一个远程通信协议,还需要给WinRM添加TCP端口,需要给PowerShell开通远程操作等等。
最终给我的结果就是拒绝访问,我怀疑服务器本身也做了一些访问的限制。所以这一块我也只能放弃了,看看还有什么其他的思路。
具体可以参考一下:https://www.cnblogs.com/renzh/p/AD-Exchange.html
WebServices调用本地代码,实现PowerShell操作Exchange
之前用控制台程序测试过是成功的,也就是说我只要把代码放在本地这种操作是可以实现的。比如说:用WebServices来调用控制台程序或是Windows服务。
最终还是在本地添加COM+组件实现了功能:https://www.cnblogs.com/opps/p/3792787.html