Los buzones compartidos de Microsoft 365 son muy útiles para el trabajo en equipo, pero los que quedan abandonados se convierten en un consumo silencioso de recursos y en un riesgo de seguridad. Automatizar la generación de informes sobre buzones inactivos es clave para mantener un entorno seguro, conforme con la normativa y eficiente en costes.
En esta guía aprenderás a identificar estas cuentas inactivas, generar informes de auditoría claros y aplicar acciones correctivas con PowerShell en los tenants de tus clientes.
Cómo identificar y gestionar buzones inactivos con PowerShell
Mantener los tenants de Microsoft 365 libres de buzones compartidos sin uso refuerza la seguridad, mejora el rendimiento y simplifica las auditorías.
📌 Caso de uso: realiza esta limpieza durante el mantenimiento periódico, en la incorporación o salida de clientes, o en las revisiones trimestrales (QBR) para garantizar el cumplimiento y un uso eficiente de los recursos.
📌 Requisitos previos: antes de empezar, asegúrate de contar con:
- Un rol de administrador global de Microsoft 365 o de administrador de Exchange.
- El módulo de PowerShell de Exchange Online instalado.
- PowerShell 5.1 o versiones posteriores.
- (Opcional) Una herramienta RMM como NinjaOne para ejecutar scripts a gran escala en varios tenants.
- (Opcional) Etiquetado en el Registro para el seguimiento en entornos híbridos.
Te recomendamos revisar ⚠️ Aspectos a tener en cuenta antes de continuar.
Paso 1: conéctate a Exchange Online con PowerShell
Para gestionar buzones en los tenants de tus clientes, primero necesitas una conexión segura con Microsoft 365.
- Abre PowerShell (Admin) o Windows Terminal (Admin).
- Instala el módulo necesario.
- Ejecuta el siguiente comando para instalar el módulo ExchangeOnlineManagement. Confirma las indicaciones que aparezcan:
Install-Module -Name ExchangeOnlineManagement -Force -AllowClobber
- Establece la conexión.
- Ejecuta el comando siguiente y sustituye [email protected] por tu cuenta de administrador. Se abrirá una ventana de autenticación moderna para que inicies sesión.
Connect-ExchangeOnline -UserPrincipalName [email protected]
Una vez conectado, podrás listar, auditar y gestionar los buzones de tus tenants siguiendo los pasos que se indican a continuación.
Paso 2: identifica todos los buzones compartidos y la fecha del último inicio de sesión
Para encontrar buzones inactivos, primero necesitas reunir una lista de todos los buzones compartidos y comprobar su última fecha de acceso.
Una vez conectado a Exchange Online, ejecuta los siguientes comandos de PowerShell.
- Obtén todos los buzones compartidos del tenant:
$sharedMailboxes = Get-Mailbox -RecipientTypeDetails SharedMailbox -ResultSize Unlimited
- Comprueba la hora del último inicio de sesión de cada buzón:
$sharedMailboxes = Get-Mailbox -RecipientTypeDetails SharedMailbox -ResultSize Unlimited$mailboxReport = foreach ($mb in $sharedMailboxes) {$auditLog = Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-90) -EndDate (Get-Date) -Operations "MailItemsAccessed" -UserIds $mb.PrimarySmtpAddress[PSCustomObject]@{DisplayName = $mb.DisplayNamePrimarySMTP = $mb.PrimarySmtpAddressLastActivity = if ($auditLog) { ($auditLog | Sort-Object CreationDate -Descending | Select-Object -First 1).CreationDate } else { "No Activity Found" }}}$mailboxReport | Format-Table -AutoSize
Al terminar, tendrás un informe claro que muestra qué buzones compartidos están activos y cuáles están inactivos. Ese informe será la base de tus siguientes acciones: deshabilitar el buzón o convertirlo en inactivo por motivos de cumplimiento.
Paso 3: filtra y exporta los buzones inactivos
Ahora que has recopilado señales de actividad, puedes empezar a identificar qué buzones podrían llevar inactivos más tiempo del umbral que hayas definido.
Partiendo de la lista de buzones obtenida en el paso 2, el siguiente script de PowerShell los filtra según el indicador de actividad elegido y un umbral definido (por ejemplo, 90 días), y después exporta los resultados a un archivo CSV para su revisión.
- Define tu umbral de inactividad (por ejemplo, 90 días):
$cutoffDate = (Get-Date).AddDays(-90)
- Filtra la lista de buzones compartidos para localizar los inactivos:
$cutoffDate = (Get-Date).AddDays(-90)
$dormantMailboxes = foreach ($mb in $sharedMailboxes) {$auditLog = Search-UnifiedAuditLog -StartDate $cutoffDate -EndDate (Get-Date) -Operations "MailItemsAccessed" -UserIds $mb.PrimarySmtpAddressif (-not $auditLog) {[PSCustomObject]@{DisplayName = $mb.DisplayNamePrimarySMTP = $mb.PrimarySmtpAddressLastActivity = "No Activity Found"}}}
- Exporta los resultados a un archivo CSV:
$dormantMailboxes | Export-Csv -Path "C:\Reports\InactiveSharedMailboxes.csv" -NoTypeInformation
Después de ejecutar este script, tendrás un archivo CSV con los buzones compartidos en los que no se ha detectado actividad según la señal de auditoría elegida. Puedes usar este informe como lista de revisión para acciones posteriores, como una revisión de accesos, una evaluación de archivado u otras decisiones de ciclo de vida, según los requisitos de tu organización.
Paso 4: gestiona los buzones compartidos sin actividad detectada
Una vez identificados los buzones compartidos sin señales de actividad reciente en el paso anterior, revísalos y valídalos antes de tomar ninguna medida. En función de los requisitos de cumplimiento y de ciclo de vida de tu organización, elige la acción de gestión adecuada para cada buzón incluido en el informe.
- Opción 1: bloquear el inicio de sesión de la cuenta asociada.
- Esta acción bloquea el inicio de sesión interactivo de la cuenta asociada, lo que ayuda a reducir las vías de acceso no autorizado sin perder los datos ni la configuración del buzón:
Set-Mailbox -Identity "SharedMailboxName" -AccountDisabled $true
- Opción 2: retirar los permisos delegados (recomendado antes de deshabilitar)
- Retira los permisos de acceso total de un usuario concreto:
Remove-MailboxPermission -Identity "SharedMailboxName" -User [email protected] -AccessRights FullAccess -Confirm:$false
- Retira los permisos Send As de un usuario concreto:
Remove-RecipientPermission -Identity "SharedMailboxName" -Trustee [email protected] -AccessRights SendAs -Confirm:$false
- Opción 3: convertirlo en un buzón de usuario normal (para archivado)
- Ejecuta este script:
Set-Mailbox -Identity "SharedMailboxName" -Type Regular
- Opción 4: etiquetarlo para el seguimiento de retención
- Usa un atributo personalizado para etiquetar buzones y facilitar su identificación, los informes o las acciones de seguimiento dentro de tus procesos de gestión:
Set-Mailbox -Identity "SharedMailboxName" -CustomAttribute1 "Inactive_90Days"
Al completar este procedimiento, los buzones seleccionados pueden quedarse sin acceso delegado, convertirse en otro tipo de buzón o etiquetarse para el seguimiento interno, según tus necesidades de gestión. Estas acciones mejoran la visibilidad administrativa y facilitan las tareas de gestión posteriores.
Los cambios se aplican de inmediato; aun así, conviene validar los resultados revisando las propiedades y los permisos de cada buzón procesado (por ejemplo, con Get-Mailbox, Get-MailboxPermission o Get-RecipientPermission).
Paso opcional: guarda los metadatos en el Registro o en un archivo de registro
En entornos híbridos o para un seguimiento local, puedes guardar los resultados de la auditoría directamente en el Registro de Windows.
Este paso opcional crea un registro permanente del análisis en tu equipo de gestión, algo útil para seguir tendencias o integrarlo con sistemas on-premise:
- Crea la ruta de la clave del Registro (ejecútalo como administrador):
New-Item -Path "HKLM:\SOFTWARE\YourOrg\MailboxAudit" -Force
- Registra la marca de tiempo y el número de buzones inactivos:
Set-ItemProperty -Path "HKLM:\SOFTWARE\YourOrg\MailboxAudit" -Name "LastDormantScan" -Value (Get-Date).ToString("u")Set-ItemProperty -Path "HKLM:\SOFTWARE\YourOrg\MailboxAudit" -Name "DormantMailboxesCount" -Value $dormantMailboxes.Count
- Verifícalo desde el Símbolo del sistema (Admin):
reg query HKLM\SOFTWARE\YourOrg\MailboxAudit
Una vez implementado, tu sistema conservará un historial verificable de las auditorías de buzones que podrás consultar en los informes de cumplimiento o integrar con herramientas de monitorización. Las entradas del Registro se mantendrán hasta que las modifiques o las elimines manualmente, lo que te proporciona un registro a largo plazo de tu trabajo de higiene del tenant.
⚠️ Aspectos a tener en cuenta
En esta sección se señalan posibles dificultades que conviene tener presentes al seguir esta guía.
| Riesgos | Posibles consecuencias | Cómo revertirlo |
| 1. Identificar mal la inactividad ($null LastLogonTime) | Un buzón sin hora de inicio de sesión ($null) puede ser un buzón nuevo que nunca se ha usado, o uno al que solo se accede mediante protocolos que no actualizan esta estadística. Confundirlo con un buzón inactivo puede interrumpir el funcionamiento de un buzón activo crítico. | Contrasta la información con otros datos, como los registros de flujo de correo (MessageTrace) o el registro de auditoría unificada en busca de eventos MailItemsAccessed, antes de actuar. |
| 2. Permisos de administrador insuficientes | Ejecutar Get-MailboxStatistics o Set-Mailbox sin el rol de administrador de Exchange provocará errores, fallos en el script e informes incompletos. | Asegúrate de que tu cuenta tiene asignados los roles adecuados (por ejemplo, administrador de Exchange) y permisos suficientes en Exchange Online (RBAC) antes de ejecutar los comandos de PowerShell. |
| 3. Pérdida accidental de datos o interrupción del servicio | Deshabilitar un buzón que sigue en uso o convertir un buzón compartido en un buzón de usuario normal romperá de inmediato el acceso del equipo e interrumpirá la actividad del negocio. | Restablece el acceso de inmediato revirtiendo el comando:
O vuelve a convertirlo:
|
| 4. Tiempos de espera del script en tenants grandes | Lanzar consultas de estadísticas sobre miles de buzones puede activar las políticas de limitación (throttling) de Exchange Online, lo que hará que el script falle o devuelva datos incompletos. | Usa paginación con el parámetro -ResultSize Unlimited e introduce pausas (Start–Sleep -Seconds 2) entre lotes de peticiones para evitar la limitación. |
| 5. Corrupción del Registro (paso opcional) | Editar el Registro de Windows sin una copia de seguridad puede dañar la configuración del sistema y provocar errores en las aplicaciones o inestabilidad. | Exporta siempre una copia de seguridad de la clave del Registro antes de hacer cambios:
Si se produce un error, importa la copia de seguridad para restaurar el estado anterior. |
| 6. Falsos positivos en los informes de auditoría | Fiarte solo de LastLogonTime puede dejar fuera buzones que se usan para enviar alertas automáticas o que reciben correos esporádicos pero importantes, lo que llevaría a una clasificación incorrecta. | Aplica un proceso de revisión con varios criterios. Comprueba los elementos enviados recientemente, las reglas de bandeja de entrada o las direcciones de reenvío antes de cerrar la lista de buzones inactivos. |
Claves para una gestión segura de los buzones compartidos
Gestionar bien los buzones inactivos requiere una planificación cuidadosa que va más allá de ejecutar scripts.
Activa el registro de auditoría de buzones
Antes de tomar cualquier medida, asegúrate de que el registro de auditoría está activado en tus buzones compartidos.
Así dispondrás de datos detallados sobre quién accedió al buzón y cuándo, lo que crea un rastro imprescindible para comprobar en el futuro si un buzón compartido está activo y para las auditorías de cumplimiento. Estos datos históricos resultan muy valiosos si más adelante necesitas verificar patrones de uso.
Ten en cuenta las políticas de retención y las retenciones legales
Contrasta siempre tu lista de buzones inactivos con las políticas de retención de Microsoft 365 y las retenciones legales de tu organización.
Un buzón sujeto a retención por litigio o a una política de retención activa no puede eliminarse de forma permanente y debe conservarse íntegro. Bloquear el acceso es aceptable, pero los datos deben conservarse según tus requisitos de cumplimiento.
Comprueba las licencias de los buzones compartidos
Aunque los buzones compartidos de menos de 50 GB no suelen requerir licencia, confírmalo antes de convertirlos o eliminarlos. Algunas aplicaciones integradas o configuraciones heredadas pueden haber asignado una licencia.
Además, revisa las configuraciones de seguridad o de servicio aplicadas a los buzones compartidos, ya que ciertas funciones o integraciones pueden implicar consideraciones de licenciamiento según cómo se use el buzón.
Scripts seguros en varios tenants
Cuando automatices este proceso en los tenants de tus clientes, nunca guardes las credenciales de administrador en texto plano dentro de los scripts. Recurre a métodos seguros como Azure Key Vault o la autenticación basada en certificados (registros de aplicaciones) para permitir un acceso controlado y no interactivo.
Estas prácticas reducen el riesgo de exposición de credenciales y permiten una automatización segura y escalable en todos los entornos.
Cómo ayudan herramientas de automatización como NinjaOne
Una plataforma RMM puede automatizar la ejecución de las tareas de gestión de buzones y aportar flujos de trabajo más coherentes a los MSP.
| Función | En qué ayuda |
| Despliegue centralizado de scripts | Ejecuta los scripts de PowerShell necesarios para obtener los datos de buzones inactivos de todos tus clientes desde un único panel, sin conexiones manuales tenant por tenant. |
| Auditorías e informes automatizados | Usa la plataforma RMM para recopilar la salida de los scripts y generar informes de los endpoints gestionados, que puedes utilizar para revisar los datos de actividad de los buzones. |
| Alertas proactivas | Configura disparadores que creen tickets o alertas cuando los buzones inactivos superen un umbral determinado, para poder actuar antes de una auditoría. |
| Integración en los flujos de trabajo | Incorpora estas comprobaciones automáticas a los procedimientos estandarizados de incorporación de clientes (QBR) y garantiza una higiene del tenant coherente y facturable. |
Identificar los buzones inactivos para ganar visibilidad operativa
Dominar la generación de informes de buzones inactivos es esencial para eliminar riesgos de seguridad y reducir el desorden administrativo en tus tenants de Microsoft 365. Esta guía te ha mostrado un camino claro para identificar cuentas inactivas con PowerShell, deshabilitarlas o etiquetarlas por cumplimiento y exportar informes para las revisiones con clientes.
Al automatizar este proceso, conviertes una tarea manual y tediosa en una estrategia escalable y proactiva que mejora la higiene y la seguridad de todos los tenants de tus clientes.

