一次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

原文地址:https://www.cnblogs.com/TanSea/p/PowerShell-Exchange.html