Los administradores de Exchange Server temen el momento en que su panel de monitoreo se ilumina con errores Microsoft.Exchange.Data.Storage.TooManyObjectsOpenedException mientras el consumo de memoria de Store.exe escala mas alla de umbrales aceptables. Este error indica que uno o mas procesos han excedido el numero maximo de objetos MAPI abiertos simultaneamente en tu servidor Exchange 2013, 2016 o 2019. En este articulo, aprenderas exactamente que desencadena esta excepcion, como diagnosticar la causa raiz usando PowerShell y Performance Monitor, y como resolverlo sistematicamente antes de que impacte todo tu entorno de mensajeria.

Requisitos Previos

  • Exchange Server 2013, 2016 o 2019 con la ultima actualizacion acumulativa instalada
  • Acceso al Exchange Management Shell con rol de Organization Management o Server Management
  • Acceso de administrador local al servidor Exchange
  • Acceso a Performance Monitor (perfmon.exe)
  • Familiaridad con PowerShell y cmdlets de Exchange
  • Acceso al Visor de Eventos para los logs de Aplicacion y Sistema
  • Comprension basica del protocolo MAPI

Entendiendo TooManyObjectsOpenedException

La excepcion TooManyObjectsOpenedException es lanzada por el Exchange Information Store (Store.exe) cuando una sesion de cliente o proceso en segundo plano abre mas objetos MAPI de los que el umbral configurado permite. Los objetos MAPI incluyen mensajes, carpetas, adjuntos, vistas de tabla y suscripciones de notificacion. Cada vez que Outlook abre una carpeta, expande una conversacion, o un agente de respaldo enumera contenidos de buzon, crea objetos MAPI que consumen memoria dentro del proceso Store.exe.

Exchange aplica estos limites a traves de politicas de limitacion para proteger la estabilidad del servidor. Cuando una sola sesion o buzon excede su conteo de objetos asignado, el Information Store genera el Event ID 9646 en el log de Aplicacion y rechaza solicitudes adicionales de objetos de esa sesion. El sintoma visible inmediato es que los clientes de Outlook afectados experimentan bloqueos, desconexiones o errores de “No se puede expandir la carpeta”, mientras que del lado del servidor se ve la memoria de Store.exe creciendo sin control.

La distincion critica aqui es entre limites por sesion y limites por buzon. Un solo usuario ejecutando Outlook con diez complementos puede tener diez sesiones separadas, cada una consumiendo objetos. El limite por sesion puede no ser excedido, pero el limite agregado por buzon aun puede superarse.

Como Funcionan los Limites de Objetos MAPI

Exchange rastrea los objetos abiertos a traves del seguimiento interno de recursos del Information Store. Cada tipo de objeto tiene su propio contador:

  • Mensajes abiertos: Numero de objetos de mensaje abiertos simultaneamente
  • Carpetas abiertas: Numero de objetos de carpeta retenidos en memoria
  • Adjuntos abiertos: Flujos de adjuntos actualmente accedidos
  • Suscripciones de notificacion: Registros de notificaciones push de clientes

Cuando cualquier contador excede su maximo configurado, el store genera la excepcion y la registra como Event ID 9646 con detalles sobre que usuario y que tipo de objeto desencadeno el limite.

Diagnosticando el Problema

Paso 1: Confirmar el Error en Logs de Eventos

Abre el Visor de Eventos y navega a Logs de Windows > Aplicacion. Filtra por Event ID 9646 con origen MSExchangeIS. El detalle del evento revela el usuario afectado, el tipo de objeto que excedio el limite y el conteo actual versus el maximo:

Event ID: 9646
Source: MSExchangeIS
Description: Mapi session "/o=Organization/ou=Exchange Administrative Group/cn=Recipients/cn=jsmith"
exceeded the maximum of 500 objects of type "objtMessage".

Esto te dice inmediatamente cual buzon es problematico y que tipo de objeto se esta agotando.

Paso 2: Usar Get-StoreUsageStatistics

El cmdlet Get-StoreUsageStatistics es tu herramienta de diagnostico principal. Ejecutalo contra la base de datos de buzon afectada:

Get-StoreUsageStatistics -Database "Mailbox Database 01" |
    Sort-Object -Property DigestCategory -Descending |
    Format-Table DisplayName, DigestCategory, SampleCount, SampleValue -AutoSize

Esto retorna datos de consumo de recursos para todas las sesiones activas de buzon. Busca buzones con numeros anormalmente altos en SampleValue, que indican objetos abiertos excesivos.

Para enfocarte en un buzon especifico:

Get-StoreUsageStatistics -Identity "[email protected]" |
    Format-List *

Paso 3: Verificar Estadisticas del Buzon

Usa Get-MailboxStatistics para identificar buzones con conteos de elementos inusualmente grandes que podrian contribuir al problema:

Get-MailboxStatistics -Database "Mailbox Database 01" |
    Sort-Object -Property ItemCount -Descending |
    Select-Object DisplayName, ItemCount, TotalItemSize, LastLogonTime -First 20

Los buzones con cientos de miles de elementos en una sola carpeta son candidatos principales para desencadenar excepciones de limite de objetos, especialmente cuando los clientes intentan sincronizar la carpeta completa.

Paso 4: Contadores de Performance Monitor

Agrega los siguientes contadores en Performance Monitor para rastrear el consumo de objetos MAPI en tiempo real:

  • MSExchangeIS Store\Active Client Logons — total de sesiones activas
  • MSExchangeIS Store\Client: RPCs attempted/sec — tasa de solicitudes
  • MSExchangeIS Store\Messages Opened/sec — tasa de creacion de objetos
  • MSExchangeIS\RPC Requests — operaciones RPC concurrentes
  • Process(Store)\Working Set — consumo de memoria de Store.exe

Crea un conjunto de recopiladores de datos y ejecutalo durante al menos cuatro horas para capturar patrones de uso pico. Correlaciona los picos en conteos de mensajes abiertos con las marcas de tiempo de las entradas del Event ID 9646.

Causas Comunes

Complementos de Outlook Defectuosos

Los complementos de terceros para Outlook son el culpable mas frecuente. Los complementos que realizan indexacion en segundo plano, integracion con redes sociales o sincronizacion con CRM frecuentemente abren cientos de objetos MAPI por carpeta y no los liberan correctamente. Un solo usuario con un complemento mal programado puede agotar el limite de objetos por sesion en minutos.

Para identificar el complemento infractor, verifica la informacion del cliente RPC:

Get-RpcClientAccess -Server EX01 | Format-List

Luego correlaciona el nombre de la aplicacion cliente en los detalles del Event ID 9646. Los infractores comunes incluyen versiones desactualizadas de Salesforce para Outlook, complementos de Thomson Reuters y escaneadores de correo antivirus.

Software de Respaldo y Archivado de Terceros

Los agentes de respaldo como Veeam Explorer for Exchange, Veritas Backup Exec o Commvault frecuentemente usan MAPI o EWS para enumerar y leer contenidos de buzon durante ventanas de respaldo. Si el software de respaldo esta configurado para recuperacion a nivel de elemento, puede abrir cada mensaje en una base de datos simultaneamente, excediendo facilmente los limites de objetos.

Verifica los programas de trabajos de respaldo y confirma si los eventos de TooManyObjectsOpenedException se correlacionan con ventanas de respaldo. Revisa la configuracion del software de respaldo para opciones de limitar conexiones MAPI o usar snapshots VSS en su lugar.

Problemas del Indexador de Busqueda de Exchange

El Microsoft Exchange Search Host Controller (HostControllerService) y el proceso de indexacion de contenido pueden funcionar mal e intentar repetidamente indexar los mismos elementos, manteniendo objetos excesivos abiertos. Verifica la salud del indice de busqueda:

Get-MailboxDatabaseCopyStatus * |
    Select-Object Name, Status, ContentIndexState, ContentIndexErrorMessage

Si ContentIndexState muestra Failed o Crawling por periodos extendidos, el indexador puede estar contribuyendo al agotamiento de objetos. Reconstruye el indice si es necesario:

Stop-Service MSExchangeFastSearch
Stop-Service HostControllerService

# Eliminar la carpeta del catalogo de indice para la base de datos afectada
Remove-Item "D:\ExchangeDatabases\DB01\DB01.Single" -Recurse -Force

Start-Service MSExchangeFastSearch
Start-Service HostControllerService

Problemas de Replicacion de Carpetas Publicas

En entornos con buzones de carpetas publicas, la sincronizacion de jerarquia de replicacion puede causar creacion excesiva de objetos. Cada carpeta publica en la jerarquia requiere objetos abiertos durante la sincronizacion. Las organizaciones con miles de carpetas publicas pueden exceder facilmente los limites durante ciclos de replicacion.

Verifica la salud de replicacion de carpetas publicas:

Get-PublicFolderMailboxDiagnostics -Identity "PF_Mailbox01" |
    Select-Object -ExpandProperty SyncInfo

Corrupcion de Base de Datos

La corrupcion subyacente de la base de datos ESE puede causar que el Information Store intente repetidamente acceder a paginas danadas, creando y abandonando objetos MAPI en el proceso. Si se han eliminado otras causas, ejecuta una verificacion de integridad:

# Desmontar la base de datos primero
Dismount-Database "Mailbox Database 01" -Confirm:$false

# Ejecutar eseutil para verificacion de integridad
eseutil /g "D:\ExchangeDatabases\DB01\DB01.edb"

# Si se encuentran problemas, ejecutar reparacion
eseutil /p "D:\ExchangeDatabases\DB01\DB01.edb"

# Desfragmentar para recuperar espacio
eseutil /d "D:\ExchangeDatabases\DB01\DB01.edb"

# Remontar
Mount-Database "Mailbox Database 01"

Comparativa de Limites de Objetos por Version de Exchange

ParametroExchange 2013Exchange 2016Exchange 2019
Max objetos por sesion (objtMessage)500500500
Max carpetas abiertas por sesion500500500
Max objetos por buzon (total)16,00016,00016,000
Max conexiones RPC concurrentes404040
Timeout RPC predeterminado (segundos)120120120
Memoria max de Store.exe (% de RAM)Dinamico (hasta 75%)Dinamico (hasta 75%)Dinamico (hasta 75%)
Politica de limitacion configurableSi (New-ThrottlingPolicy)Si (New-ThrottlingPolicy)Si (New-ThrottlingPolicy)
Tamano de cache ESE configurableSi (registro)Si (registro)Si (registro)

Nota que aunque los limites predeterminados son identicos entre versiones, Exchange 2016 y 2019 tienen algoritmos mejorados de gestion de memoria que manejan la limpieza de objetos de forma mas agresiva que Exchange 2013.

Resolucion Paso a Paso

1. Identificar la Causa Inmediata

Revisa las ultimas 24 horas de entradas del Event ID 9646 y compila una lista de buzones afectados y aplicaciones cliente:

Get-WinEvent -FilterHashtable @{
    LogName = 'Application'
    ProviderName = 'MSExchangeIS'
    ID = 9646
    StartTime = (Get-Date).AddHours(-24)
} | Select-Object TimeCreated, Message | Export-Csv C:\temp\9646events.csv

2. Aumentar Limites de Objetos (Alivio Temporal)

Si el impacto en produccion es severo, aumenta temporalmente el limite de objetos por sesion via registro:

HKLM\SYSTEM\CurrentControlSet\Services\MSExchangeIS\ParametersSystem
Value: Maximum Allowed Sessions Per User
Type: REG_DWORD
Data: 32 (predeterminado es 16, aumentar a 32 o 64)

Para limites por tipo de objeto, crea una politica de limitacion personalizada:

New-ThrottlingPolicy -Name "HighObjectLimit" -RCAMaxConcurrency 40 -RCAPercentTimeInAD 100
Set-Mailbox -Identity "jsmith" -ThrottlingPolicy "HighObjectLimit"

Reinicia el servicio Microsoft Exchange Information Store despues de cambios en el registro.

3. Abordar la Causa Raiz

Basandote en tu diagnostico de las secciones anteriores:

  • Complementos de Outlook: Deshabilita el complemento infractor via Politica de Grupo o las claves de registro de complementos COM de Office. Prueba con Outlook en modo seguro (outlook.exe /safe).
  • Software de respaldo: Reconfigura para usar snapshots basados en VSS en lugar de enumeracion MAPI. Programa respaldos durante horas de baja demanda.
  • Indexador de busqueda: Reconstruye el catalogo de indice de contenido para la base de datos afectada.
  • Carpetas publicas: Reduce el tamano de la jerarquia, divide buzones grandes de carpetas publicas o ajusta el programa de replicacion.
  • Corrupcion de base de datos: Ejecuta eseutil /d para desfragmentacion fuera de linea para limpiar inconsistencias de la base de datos.

4. Implementar Monitoreo Preventivo

Crea una regla de monitoreo para Event ID 9646 en tu sistema de monitoreo (SCOM, Zabbix o similar) y configura una tarea programada de PowerShell para rastrear conteos de objetos:

$results = Get-StoreUsageStatistics -Database "Mailbox Database 01" |
    Where-Object { $_.SampleValue -gt 400 }
if ($results) {
    Send-MailMessage -To "[email protected]" -Subject "Alerta de Objetos MAPI" `
        -Body ($results | Out-String) -SmtpServer "smtp.contoso.com"
}

Escenario del Mundo Real

Tu servidor Exchange 2016 comienza a registrar Event ID 9646 cada pocos minutos un lunes por la manana. La memoria de Store.exe ha escalado de sus habituales 24 GB a 38 GB en un servidor de 48 GB. Los usuarios reportan desconexiones de Outlook y carga lenta de carpetas.

Ejecutas Get-StoreUsageStatistics y descubres que cinco buzones pertenecientes al equipo de ventas muestran conteos elevados de objetos. Verificando los detalles del evento, ves que la aplicacion cliente se identifica como “Client=MSExchangeRPC” con una etiqueta adicional apuntando a un complemento CRM de terceros.

Una investigacion adicional revela que el equipo de TI implemento una nueva version del complemento de Dynamics 365 para Outlook durante el fin de semana. Esta version tiene un error conocido donde abre objetos de mensaje para cada registro de contacto pero nunca los cierra. En pocas horas, la sesion de cada usuario de ventas acumula mas de 450 objetos de mensaje abiertos, acercandose al limite de 500.

La resolucion involucra tres pasos: Primero, aumentas temporalmente el limite por sesion a 1,000 via registro para detener el sangrado inmediato. Segundo, reviertes el complemento CRM a la version anterior usando Politica de Grupo. Tercero, reinicias el servicio Information Store durante el almuerzo para limpiar los objetos acumulados. Durante las siguientes 24 horas, la memoria de Store.exe regresa a su linea base normal de 24 GB y no aparecen mas eventos 9646.

Errores Comunes y Casos Especiales

Entornos de Database Availability Group (DAG): En un DAG, TooManyObjectsOpenedException en un nodo no se replica automaticamente a copias pasivas. Sin embargo, si la causa raiz es un problema a nivel de buzon (como un elemento corrupto), el problema seguira al buzon durante la conmutacion por error de la base de datos. Siempre verifica tanto nodos activos como pasivos.

Coexistencia con Exchange 2013 y 2016: Durante la coexistencia de migracion, las sesiones proxy entre servidores pueden multiplicar los conteos de objetos MAPI. Una sola sesion de Outlook a un buzon 2013 proxiada a traves de un servidor 2016 crea objetos en ambos servidores. Monitorea ambos servidores durante la coexistencia.

Modo cache versus modo en linea: Outlook en Modo Cache de Exchange abre menos objetos concurrentes que el Modo En Linea porque sincroniza incrementalmente. Sin embargo, la sincronizacion inicial de un perfil en Modo Cache para un buzon grande (100,000+ elementos) puede elevar temporalmente los conteos de objetos por encima de los umbrales.

Buzones compartidos con muchos delegados: Un buzon compartido abierto por 20 usuarios simultaneamente crea 20 sesiones separadas, cada una con su propia asignacion de objetos. El limite agregado por buzon puede alcanzarse rapidamente incluso si ninguna sesion individual es abusiva.

Exchange hibrido con Office 365: Las consultas hibridas de libre/ocupado y los movimientos de buzon entre instalaciones crean sesiones MAPI temporales que consumen objetos. Durante migraciones masivas por lotes, el servidor local puede experimentar presion de objetos desde el endpoint de migracion.

Solucion de Problemas

Consulta de Log de Eventos para Errores Relacionados

Busca eventos relacionados que frecuentemente acompanan a TooManyObjectsOpenedException:

Get-WinEvent -FilterHashtable @{
    LogName = 'Application'
    ProviderName = 'MSExchangeIS'
    ID = 9646, 9660, 9667, 9760
    StartTime = (Get-Date).AddDays(-7)
} | Group-Object Id | Select-Object Name, Count | Sort-Object Count -Descending
  • Event ID 9660: La sesion excedio el maximo de objetos de tipo objtFolder
  • Event ID 9667: Limite de conexion RPC excedido
  • Event ID 9760: Sesion MAPI desconectada por agotamiento de recursos

Contadores de Rendimiento ESE

Monitorea estos contadores para detectar problemas a nivel de base de datos que contribuyen al alto consumo de memoria:

  • Database\Database Cache % Hit — debe estar por encima del 99%. Por debajo del 95% indica memoria insuficiente o thrashing de cache
  • Database\Database Page Evictions/sec — valores altos significan que el cache esta lleno y descartando paginas activamente
  • Database\Log Record Stalls/sec — indica contencion de escritura que puede escalar a retencion de objetos

La Memoria de Store.exe No Disminuye Despues de la Correccion

Si la memoria de Store.exe permanece elevada despues de resolver la causa raiz, el cache ESE puede necesitar intervencion manual. Reinicia el servicio Microsoft Exchange Information Store durante una ventana de mantenimiento:

Restart-Service MSExchangeIS -Force

En entornos DAG, realiza primero una conmutacion controlada de base de datos:

Move-ActiveMailboxDatabase "Mailbox Database 01" -ActivateOnServer EX02 -Confirm:$false

Luego reinicia el Information Store en el servidor activo original. Esto asegura cero tiempo de inactividad para los usuarios.

Resumen

  • TooManyObjectsOpenedException ocurre cuando se exceden los limites de objetos MAPI, causando crecimiento de memoria de Store.exe y desconexiones de clientes
  • Event ID 9646 en el log de Aplicacion identifica el buzon afectado y el tipo de objeto que alcanzo el limite
  • Get-StoreUsageStatistics es el cmdlet principal de PowerShell para diagnosticar que buzones consumen recursos excesivos
  • Las cinco causas mas comunes son complementos de Outlook defectuosos, software de respaldo, fallas del indexador de busqueda, problemas de replicacion de carpetas publicas y corrupcion de base de datos
  • El alivio temporal involucra aumentar los limites por sesion via registro, pero siempre aborda la causa raiz
  • eseutil /d para desfragmentacion fuera de linea resuelve la corrupcion a nivel de base de datos que contribuye a fugas de objetos
  • Monitorea proactivamente los Event IDs 9646, 9660, 9667 y 9760 para detectar problemas antes de que impacten a los usuarios
  • En entornos DAG, siempre realiza conmutaciones controladas antes de reiniciar el Information Store

Articulos Relacionados