Informe de tamaño de buzón de Office 365 con PowerShell

Es importante realizar un seguimiento de los tamaños de los buzones de correo de Office 365.

No desea que los buzones de correo de sus usuarios alcancen su cuota de envío y recepción, para evitar errores como «Límite de tamaño de buzón excedido».

Con la ayuda de PowerShell, podemos crear un informe de tamaño de buzón de Office 365 que le brinda toda la información que necesita.

El siguiente script de PowerShell exporta los siguientes datos de buzones de usuario, compartidos y de archivo a un archivo CSV:

  • Nombre para mostrar
  • Dirección de correo electrónico principal
  • Tipo de buzón
  • Hora de la última acción del usuario
  • Tamaño total del buzón
  • Tamaño del elemento eliminado
  • Recuento de elementos
  • Recuento de elementos eliminados
  • Emitir tamaño de advertencia
  • Prohibir cuota de envío y recepción (tamaño máximo del buzón)
  • Tamaño del archivo (si el usuario tiene un archivo)
  • Recuento de elementos de archivo
  • Recuento de elementos eliminados del archivo
  • Cuota de advertencia de archivo
  • Cuota de archivo
Informe de tamaño de buzón de Office 365
Ejemplo de exportación de informe de tamaño de buzón de Office 365

Simplemente puedo compartir el guión con usted, pero siempre es bueno entender cómo funciona un guión.

Así que primero vamos a recorrer el guión, mientras explico las diferentes opciones. Al final del artículo, encontrará un enlace al script en mi Github.

Cómo usar el informe de tamaño de buzón de Office 365

El script de informe de tamaño de buzón de Office 365 se puede ejecutar con un par de parámetros diferentes.

Siempre debe proporcionar su dirección de correo electrónico para la autenticación con el -adminUPN parámetro. Sin más parámetros, el script generará un informe con:

  • buzones compartidos
  • Archivar buzones
  • Almacene el informe en la ubicación raíz del script ( .\mailboxsizereport-sep-23-2021.csv)
.\MailboxSizeReport.ps1 -adminUPN [email protected]
get-mailboxstatistics powershell

Buzones compartidos

Tiene un par de opciones para los buzones compartidos. De forma predeterminada, se incluyen, pero puede dejarlos fuera del informe u obtener solo los buzones compartidos con el -sharedMailboxes parámetro:

# Get only the shared mailboxes
.\MailboxSizeReport.ps1 -adminUPN [email protected] -sharedMailboxes only

# Get only the user mailboxes
.\MailboxSizeReport.ps1 -adminUPN [email protected] -sharedMailboxes no

# (Default) Get user and shared mailboxes
.\MailboxSizeReport.ps1 -adminUPN [email protected] -sharedMailboxes include

Archivar buzones

De forma predeterminada, también recopilamos las estadísticas de los buzones de archivo si el usuario tiene un buzón de archivo. Si no desea los buzones de archivo (hacen que el script sea un poco más lento), use el -archive:$false parámetro:

# Don't get the archive mailboxes
.\MailboxSizeReport.ps1 -adminUPN [email protected] -archive:$false

Ruta de exportación CSV

Puede definir un archivo de salida y una ruta con el -csvpath parámetro.

# Define path for CSV file
.\MailboxSizeReport.ps1 -adminUPN [email protected] -csvpath c:\temp\mailboxsizereport.csv

La secuencia de comandos del informe de tamaño del buzón

Para obtener el tamaño del buzón de Office 365, primero debemos conectarnos a Exchange Online. Luego, necesitamos tanto las propiedades del buzón como las estadísticas del buzón para crear el informe completo.

He usado el módulo Exchange Online v2 para el script. La ventaja del nuevo módulo Exchange Online es que admite MFA y SSON. De esta manera, solo tiene que ingresar su dirección de correo electrónico y podemos conectarnos a Exchange Online sin ninguna interacción del usuario.

Para que la secuencia de comandos sea más fácil de usar en otras computadoras, agregué una verificación para el módulo de administración en línea de Exchange y la opción para instalarlo cuando no esté disponible. También verificamos si hay una conexión Exchange Online existente para evitar conexiones múltiples.

Puede encontrar una muestra del código aquí en este artículo.

Obtenga el tamaño del buzón con PowerShell

Para obtener las estadísticas de los buzones, primero debemos recopilar todos los buzones. El cmdlet Get-Mailbox en PowerShell devuelve todas las propiedades del buzón, mientras que Get-MailboxStatistics devuelve la información sobre el uso del buzón.

Entonces, primero obtenemos todos los buzones que queremos para nuestro informe.

Function Get-Mailboxes {
  <#
    .SYNOPSIS
        Get all the mailboxes for the report
  #>
  process {
    switch ($sharedMailboxes)
    {
      "include" {$mailboxTypes = "UserMailbox,SharedMailbox"}
      "only" {$mailboxTypes = "SharedMailbox"}
      "no" {$mailboxTypes = "UserMailbox"}
    }

    Get-EXOMailbox -ResultSize unlimited  -RecipientTypeDetails $mailboxTypes -Properties IssueWarningQuota, ProhibitSendReceiveQuota, ArchiveQuota, ArchiveWarningQuota, ArchiveDatabase | 
      select UserPrincipalName, DisplayName, PrimarySMTPAddress, RecipientType, IssueWarningQuota, ProhibitSendReceiveQuota, ArchiveQuota, ArchiveWarningQuota, ArchiveDatabase
  }
}

En base al parámetro SharedMailboxes determinamos si queremos incluirlos o no. Del cmdlet Get-EXOMailbox necesitamos obtener un par de propiedades adicionales:

  • ProblemaAdvertenciaCuota
  • ProhibirEnviarRecibirCuota
  • Cuota de archivo
  • ArchivoAdvertenciaCuota
  • ArchivoBase de datos

Con la propiedad ArchiveDatabase, podemos determinar si el correo del usuario también tiene un buzón de archivo. Al usar la selección, solo devolvemos los campos que necesitamos en el informe del buzón.

Get-MailboxStatistics en PowerShell

Para cada buzón, vamos a obtener las estadísticas del buzón. Ahora también queremos incluir el buzón de archivo de los usuarios.

Para ello, necesitaremos ejecutar dos veces el cmdlet Get-MailboxStatistics. Una vez para el buzón normal y otra para el buzón de archivo.

Ahora he notado que este último es mucho más lento. No sé exactamente por qué, pero solicitar las estadísticas del buzón de archivo lleva mucho más tiempo que el buzón normal.

Para el buzón normal simplemente podemos usar el siguiente cmdlet en PowerShell:

# Get mailbox size
$mailboxSize = Get-MailboxStatistics -Identity $_.UserPrincipalName | Select TotalItemSize,TotalDeletedItemSize,ItemCount,DeletedItemCount,LastUserActionTime

Para el buzón de archivo, primero verificamos si queremos el buzón de archivo y luego si la propiedad ArchiveDatabase está configurada:

# Get archive size if it exists and is requested
$archiveSize = 0

if ($archive.IsPresent -and ($_.ArchiveDatabase -ne $null)) {
        $result = Get-EXOMailboxStatistics -UserPrincipalName $_.UserPrincipalName -Archive | Select ItemCount,DeletedItemCount,@{Name = "TotalArchiveSize"; Expression = {$_.TotalItemSize.ToString().Split("(")[0]}}
        if ($result -ne $null) {
          $archiveSize = ConvertTo-Gb -size $result.TotalArchiveSize
        }else{
          $archiveSize = 0
        }
}

Habrás notado que usé el Get-EXOMailboxStatistics para el buzón de archivo y el cmdlet anterior, Get-MailboxStatistics para el buzón normal. Siempre trato de usar los últimos módulos/cmdlets, pero el LastUserActionTime solo está disponible en el cmdlet anterior.

Para los buzones sin Archive, establecemos archiveSize en 0 y restablecemos archiveResult.

Todos los datos se colocan en un PSCustomObject, lo que nos permite exportarlos fácilmente más tarde a un archivo CSV.

Function Get-MailboxStats {
  <#
    .SYNOPSIS
        Get the mailbox size and quota
  #>
  process {
    $mailboxes = Get-Mailboxes
    $i = 0

    $mailboxes | ForEach-Object {

      # Get mailbox size     
      $mailboxSize = Get-MailboxStatistics -identity $_.UserPrincipalName | Select-Object TotalItemSize,TotalDeletedItemSize,ItemCount,DeletedItemCount,LastUserActionTime

      if ($null -ne $mailboxSize) {
      
        # Get archive size if it exists and is requested
        $archiveSize = 0
        $archiveResult = $null

        if ($archive.IsPresent -and ($null -ne $_.ArchiveDatabase)) {
          $archiveResult = Get-EXOMailboxStatistics -UserPrincipalName $_.UserPrincipalName -Archive | Select-Object ItemCount,DeletedItemCount,@{Name = "TotalArchiveSize"; Expression = {$_.TotalItemSize.ToString().Split("(")[0]}}
          if ($null -ne $archiveResult) {
            $archiveSize = ConvertTo-Gb -size $archiveResult.TotalArchiveSize
          }
        }

        write-host $mailboxSize.TotalDeletedItemSize
    
        [pscustomobject]@{
          "Display Name" = $_.DisplayName
          "Email Address" = $_.PrimarySMTPAddress
          "Mailbox Type" = $_.RecipientTypeDetails
          "Last User Action Time" = $mailboxSize.LastUserActionTime
          "Total Size (GB)" = ConvertTo-Gb -size $mailboxSize.TotalItemSize.ToString().Split("(")[0]
          "Deleted Items Size (GB)" = ConvertTo-Gb -size $mailboxSize.TotalDeletedItemSize.ToString().Split("(")[0]
          "Item Count" = $mailboxSize.ItemCount
          "Deleted Items Count" = $mailboxSize.DeletedItemCount
          "Mailbox Warning Quota (GB)" = ($_.IssueWarningQuota.ToString().Split("(")[0]).Split(" GB") | Select-Object -First 1
          "Max Mailbox Size (GB)" = ($_.ProhibitSendReceiveQuota.ToString().Split("(")[0]).Split(" GB") | Select-Object -First 1
          "Mailbox Free Space (GB)" = (($_.ProhibitSendReceiveQuota.ToString().Split("(")[0]).Split(" GB") | Select-Object -First 1) - (ConvertTo-Gb -size $mailboxSize.TotalItemSize.ToString().Split("(")[0])
          "Archive Size (GB)" = $(if($null -ne $archiveResult) {ConvertTo-Gb -size $archiveResult.TotalArchiveSize} else {'-'})
          "Archive Items Count" = $(if($null -ne $archiveResult) {$archiveResult.ItemCount} else {'-'}) 
          "Archive Mailbox Free Space (GB)*" = $(if($null -ne $archiveResult) {(ConvertTo-Gb -size $_.ArchiveQuota.ToString().Split("(")[0]) - $archiveSize} else {'-'})
          "Archive Deleted Items Count" = $(if($null -ne $archiveResult) {$archiveResult.DeletedItemCount} else {'-'})
          "Archive Warning Quota (GB)" = $(if($null -ne $archiveResult) {($_.ArchiveWarningQuota.ToString().Split("(")[0]).Split(" GB") | Select-Object -First 1} else {'-'})
          "Archive Quota (GB)" = $(if($null -ne $archiveResult) {(ConvertTo-Gb -size $_.ArchiveQuota.ToString().Split("(")[0])} else {'-'})
        }

        $currentUser = $_.DisplayName
        Write-Progress -Activity "Collecting mailbox status" -Status "Current Count: $i" -PercentComplete (($i / $mailboxes.Count) * 100) -CurrentOperation "Processing mailbox: $currentUser"
        $i++;
      }
    }
  }
}

Es posible que haya notado que convertimos todos los tamaños a GB. El motivo es que Get-MailboxStatistics devuelve el tamaño en KB, MB o GB, según el tamaño. Pero en un informe, es mucho más conveniente tener una sola unidad.

Así que con la siguiente función podemos convertir todos los tamaños a GB y redondearlos a dos decimales:

Function ConvertTo-Gb {
  <#
    .SYNOPSIS
        Convert mailbox size to Gb for uniform reporting.
  #>
  param(
    [Parameter(
      Mandatory = $true
    )]
    [string]$size
  )
  process {
    if ($size -ne $null) {
      $value = $size.Split(" ")

      switch($value[1]) {
        "GB" {$sizeInGb = ($value[0])}
        "MB" {$sizeInGb = ($value[0] / 1024)}
        "KB" {$sizeInGb = ($value[0] / 1024 / 1024)}
        "B"  {$sizeInGb = 0}
      }

      return [Math]::Round($sizeInGb,2,[MidPointRounding]::AwayFromZero)
    }
  }
}

Descarga el Guión Completo

Puede descargar el script completo desde mi página de GitHub. Le recomiendo que lo pruebe primero en un pequeño conjunto de buzones. Cambiar el Tamaño del resultado en línea 122 (Get-EXOMailboxes) de ilimitado a 10 por ejemplo.

# Change this line
Get-EXOMailbox -ResultSize unlimited -RecipientTypeDetails $mailboxTypes -Properties IssueWarningQuota, ProhibitSendReceiveQuota, ArchiveQuota, ArchiveWarningQuota, ArchiveDatabase | 
      select UserPrincipalName, DisplayName, PrimarySMTPAddress, RecipientType, RecipientTypeDetails, IssueWarningQuota, ProhibitSendReceiveQuota, ArchiveQuota, ArchiveWarningQuota, ArchiveDatabase

# To 
Get-EXOMailbox -ResultSize 10 -RecipientTypeDetails $mailboxTypes -Properties IssueWarningQuota, ProhibitSendReceiveQuota, ArchiveQuota, ArchiveWarningQuota, ArchiveDatabase | 
      select UserPrincipalName, DisplayName, PrimarySMTPAddress, RecipientType, RecipientTypeDetails, IssueWarningQuota, ProhibitSendReceiveQuota, ArchiveQuota, ArchiveWarningQuota, ArchiveDatabase

Terminando

Para ejecutar este script fácilmente desde la línea de comandos de PowerShell, puede agregar un alias en su perfil que apunte al script.

Lea todo sobre la configuración de su perfil de PowerShell en este artículo o cómo ejecutar scripts de PowerShell en general en este artículo.

Espero que encuentre útil este script. Si tiene alguna pregunta, simplemente deje un comentario a continuación.

También le puede gustar uno de los siguientes scripts de informes de PowerShell:

Otros artículos relacionados

Microsoft 365 Familia vs Personal vs Gratis — RipAdmin

Microsoft 365 Familia vs Personal vs Gratis — RipAdmin

En abril de 2020, Microsoft cambió los nombres de los planes Office 365 Personal y Home a Microsoft 365 Personal ...
Leer Más
Cómo advertir a los usuarios sobre suplantación de identidad de correo electrónico Correo de phishing

Cómo advertir a los usuarios sobre suplantación de identidad de correo electrónico Correo de phishing

Los correos electrónicos de phishing son una amenaza constante para su entorno de TI. Además de todas las medidas de ...
Leer Más
Instalar o implementar Microsoft Teams

Instalar o implementar Microsoft Teams

Microsoft Teams reemplazará a Skype for Business Online. Microsoft Teams ahora está disponible en general en Office 365, por lo ...
Leer Más
Plantillas de correo electrónico de Outlook: cómo crearlas, usarlas y compartirlas fácilmente

Plantillas de correo electrónico de Outlook: cómo crearlas, usarlas y compartirlas fácilmente

¿Está enviando muchas respuestas estándar en Outlook? ¿O quieres estandarizar las respuestas enviadas por tus empleados? Entonces, las plantillas de ...
Leer Más
Cómo crear una firma HTML de Outlook

Cómo crear una firma HTML de Outlook

Las firmas de correo electrónico pueden ser mucho más que una tarjeta de presentación digital. Las firmas HTML de Outlook ...
Leer Más
Compara todos los planes de Microsoft Office 365 en una descripción general

Compara todos los planes de Microsoft Office 365 en una descripción general

Los planes de Microsoft Office 365 ofrecen excelentes herramientas para que las empresas y empresas trabajen completamente en la nube ...
Leer Más

Deja un comentario