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

今天遇到一个用户报修,说其邮箱自从出差到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_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\KeepAliveTime
该值的范围为1 到7,200,000 ,建议设置为 300,000 (5 mins),缺省值为7,200,000 (2 hours) 
2、重启exchange 服务器; 
3、观察一段时间,看是否出现9646错误;
如果没有此键值的话,请手动添加该键值。 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 
Value name: KeepAliveTime 
Key: Tcpip\Parameters 
Value Type: REG_DWORD 
Value: 300,000
方法二、修改MaxObjsPerMapiSession值,扩大32个Session的限制
若要向注册表项限制 MAPI 客户端可以使用在同一时间的资源的最大数量,请按照下列步骤操作:
  1. 单击 开始,请单击 运行,键入 regedit,,然后单击 确定。
  2. 展开以下注册表子项:
    \\HKEY_LOCAL_MACHINE \SYSTEM\CurrentControlSet\Services\MSExchangeIS\ParametersSystem
  3. 用鼠标右键单击 ParametersSystem,指向 新建,然后再单击 项。
  4. 键入 MaxObjsPerMapiSession,然后按 ENTER 来命名新的子项。
  5. 用鼠标右键单击 MaxObjsPerMapiSession,单击 新建,然后再单击 DWORD 值。
  6. 键入 ,然后按 ENTER 命名对象。

    注意 是在"症状"一节中提到的错误消息中对象类型的名称。 例如对于键入objtMessage,然后按 ENTER 键。
  7. 用鼠标右键单击 ,然后单击 修改。
  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。

分享到