今天遇到一个用户报修,说其邮箱自从出差到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 客户端可以使用在同一时间的资源的最大数量,请按照下列步骤操作:
- 单击 开始,请单击 运行,键入 regedit,,然后单击 确定。
- 展开以下注册表子项:
\HKEY_LOCAL_MACHINE SYSTEMCurrentControlSetServicesMSExchangeISParametersSystem
- 用鼠标右键单击 ParametersSystem,指向 新建,然后再单击 项。
- 键入 MaxObjsPerMapiSession,然后按 ENTER 来命名新的子项。
- 用鼠标右键单击 MaxObjsPerMapiSession,单击 新建,然后再单击 DWORD 值。
- 键入 Object_type,然后按 ENTER 命名对象。
注意 Object_type 是在"症状"一节中提到的错误消息中对象类型的名称。 例如对于键入objtMessage,然后按 ENTER 键。 - 用鼠标右键单击 Object_type,然后单击 修改。
- 在 数值数据 框中键入想要限制此项以,对象数目,然后单击 确定。例如对于键入 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。