zoukankan      html  css  js  c++  java
  • 一次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

  • 相关阅读:
    linux下批量转换文件
    linux的最简socket编程
    war包部署到tomcat
    linux 重命名文件和文件夹
    Thread类的常用方法
    java.lang.Integer.MAX_VALUE;这是什么意思?
    java中 在一个异常处理中什么语句块是可多个的
    oracle条件参数中 IN函数中的值最大只能为1000个
    oracle判断一个字段为空
    javascript 六种数据类型
  • 原文地址:https://www.cnblogs.com/TanSea/p/PowerShell-Exchange.html
Copyright © 2011-2022 走看看