惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
InfoQ
G
Google Developers Blog
Engineering at Meta
Engineering at Meta
月光博客
月光博客
博客园 - 聂微东
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
A
About on SuperTechFans
Microsoft Azure Blog
Microsoft Azure Blog
Blog — PlanetScale
Blog — PlanetScale
U
Unit 42
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
云风的 BLOG
云风的 BLOG
S
SegmentFault 最新的问题
F
Fortinet All Blogs
H
Help Net Security
J
Java Code Geeks
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
L
LangChain Blog
Martin Fowler
Martin Fowler
N
Netflix TechBlog - Medium

博客园 - TanSea

VMware虚拟机下Linux系统(Ubuntu桌面版)微服务环境搭建 - 构建篇 VMware虚拟机下Linux系统(Ubuntu桌面版)微服务环境搭建 - Gogs篇 VMware虚拟机下Linux系统(Ubuntu桌面版)微服务环境搭建 - Docker篇 VMware虚拟机下Linux系统(Ubuntu桌面版)微服务环境搭建 - Jenkins篇 VMware虚拟机下Linux系统(Ubuntu桌面版)微服务环境搭建 - 准备篇 Sql Server 分批复制数据 Sql Server 查询数据库表结构 MAUI Blazor+MASA开发安卓应用学习笔记 - 设置图标和初始屏幕 MAUI Blazor+MASA开发安卓应用学习笔记 - 设置APP格式、名称、版本信息 MAUI Blazor+MASA开发安卓应用学习笔记 - 新建项目和发布 一道SQL面试题的解题思路 Windows10设置默认简体美式键盘输入法 C# 历史版本特性变更(更新到C# 11) SQL Server Report Builder RDLC按记录数分页 SQL Server分页查询进化史 一次.NET项目反编译的实战经验(WinForm) 点石成金-访客至上的网站设计秘笈 读书笔记 Windows7使用无线网卡建立WiFi热点 程序员的职业素养 读书笔记 - 第14章 辅导、学徒期与技艺
一次Exchange邮箱接口的开发经历
TanSea · 2020-04-27 · via 博客园 - TanSea

第一次接触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