/ 中存储网

关于“MAPI Session 超出最大连接数"错误的解决方法详细步骤

2014-08-28 22:04:25 来源:中存储网

今天遇到一个用户报修,说其邮箱自从出差到TW Site,总是报“无法打开默认电子邮件文件夹。Microsoft Exchange server无法使用。可能是网络出现问题,或者是Microsoft Exchange server正处于关闭维修阶段”,无法通过Outlook收发邮件。

问题描述:

通过的MAPI方式能够完成Outlook的配置,但是当打开Outlook的客户端软件的时候,就出现如下提示的报错“无法打开默认电子邮件文件夹。Microsoft Exchange server无法使用。可能是网络出现问题,或者是Microsoft Exchange server正处于关闭维修阶段”。提示这个后,Outlook就不能打开了,自动关闭此对话框。

在其他PC上面配置此用户时,打开的Outlook时,也是报同样的错误,使用管理员账号或者OWA方式都可以打开。

查看该用户所在的Exchange Server,查看系统Log,如下报错(涂盖得部分为User的NT账号信息)

MAPI SESSION超出默认值,阻止MAPI客户端的连接。默认是32个session,如果超出就会报错。 
ID:9646 

Mapi session "/o=XX/ou=XX AG/cn=Recipients/cn=XXX" exceeded the maximum of 32 objects of type "session".

超出了 32 个“session”类型的对象的最大限制。 

问题分析:

遛狗查原因,微软的官方解答为:“Exchange Server 2003 SP1对每个用户能够建立的会话数量做了限制,在缺省情况下,每个用户能建立的最大mapi session 数量为32。当然,您可以根据自己的需要来修改该值的大小。这些mapi session是指从Outlook 客户端到Exchange 服务器之间的建立的会话,而且没有被服务器释放的。导致连接没有断开的原因有多种,比如用户通过不稳定的网络如无线网络连接到Exchange服务器,这样可能会导致连接没有及时断开。”

奇怪,我的系统试Windows2003 SP2+Exchange2003 SP2,看来Exchange SP2也会出同样的问题。

联想到该用户最近会TW,而在TW使用的是无线链接网络,又要跨专线连回Exchange,应该就是网络不稳定或者专线拥塞,导致Outlook和Exchange之间的Mapi连接时通时断,导致Exchange Server未正确释放的Session超过32,自动关闭并拒绝用户的连接。

而恰恰关闭的仅是该用户的MAPI连接,所以同时HTTP方式访问是正常的,而用其他管理员的账号访问该用户的邮箱也是OK的。(管理员的Mapi可没有被关闭啊,额呵呵)

解决问题:

问题原因找到了,那就解决吧-首先想到的肯定是Kill掉死掉的Mapi Session(先解决用户无法打开邮箱的问题)

郁闷的是放狗找了一个多小时也没找到杀掉Mapi Session的方法,看来这条路走不通了。

放狗找到的其他方法。

方法一、修改释放Mapi Session的默认时间

1、在Exchange 服务器上设置下面的注册表键值: 
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParametersKeepAliveTime
该值的范围为1 到7,200,000 ,建议设置为 300,000 (5 mins),缺省值为7,200,000 (2 hours) 
2、重启exchange 服务器; 
3、观察一段时间,看是否出现9646错误;

如果没有此键值的话,请手动添加该键值。 
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices 
Value name: KeepAliveTime 
Key: TcpipParameters 
Value Type: REG_DWORD 
Value: 300,000

方法二、修改MaxObjsPerMapiSession值,扩大32个Session的限制

   http://support.microsoft.com/kb/830829/zh-cn

若要向注册表项限制 MAPI 客户端可以使用在同一时间的资源的最大数量,请按照下列步骤操作:

  1. 单击 开始,请单击 运行,键入 regedit,,然后单击 确定
  2. 展开以下注册表子项:

    \HKEY_LOCAL_MACHINE SYSTEMCurrentControlSetServicesMSExchangeISParametersSystem

  3. 用鼠标右键单击 ParametersSystem,指向 新建,然后再单击 
  4. 键入 MaxObjsPerMapiSession,然后按 ENTER 来命名新的子项。
  5. 用鼠标右键单击 MaxObjsPerMapiSession,单击 新建,然后再单击 DWORD 值
  6. 键入 Object_type,然后按 ENTER 命名对象。

    注意 Object_type 是在"症状"一节中提到的错误消息中对象类型的名称。 例如对于键入objtMessage,然后按 ENTER 键。
  7. 用鼠标右键单击 Object_type,然后单击 修改
  8. 在 数值数据 框中键入想要限制此项以,对象数目,然后单击 确定。例如对于键入 350 增加 objtMessage 对象的值。默认值为 250 个字符。

    但两种方法都要修改注册表且要重启后生效,但我总不能为了解决者一个用户的问题把有几百号人的Server重启吧?

    方法一释放Mapi Session的默认时间倒是个好方法,但我查遍了整个注册表,也没找到默认的KeepAliveTime的键值,晕,要手动键,还得重启。

    重新整理思路,看有没有其他变通的方法,要想快速解决这个User的问题而暂时不修改Exchange Server,只能从Mapi Session上造突破口了。

    脑袋里突然闪了一个念头,迁移User的Mailbox,既然没有办法直接Kill掉Session,那我只要把改User迁移到别的Server上,Mapi Session岂不是自动就Kill掉了吗?

    说干就干,直接将该User的Mailbox迁移到其他Exchange服务器,重新配置Outlook的Profile,OK,没有报错,邮箱可正常打开,搞定!

    总结一下:

    方法三、迁移User的Mailbox至其他服务器

    1、关闭User的Outlook,最好关机。

    2、迁移User的邮箱。

    3、删除Outlook的Profile,重新配置Profile。

    解释一下为什么一定要重新配置Profile:

    正常的用户被迁移邮箱,加入由A服务器搬移到B服务器,打开outlook时,仍回去连接A服务器,这是A告诉Outlook,”你的邮箱已经不在我这了,再B服务器,请连接B服务器”。

    但现在因为MAPI的Session已经被A服务器关闭了,所以如果仍打开原来的配置文件,Outlook仍会去先连接A服务器,仍然会报错,所以只能重建Profile,且Exchange服务器直接选择B。