Informe del tamaño del buzón de Office 365 con PowerShell
Es importante realizar un seguimiento del tamaño de los buzones 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 del buzón excedido".
Con la ayuda de PowerShell, podemos crear un Informe del tamaño del buzón de Office 365 que le brinda toda la información que necesita.
La siguiente secuencia de comandos de PowerShell exporta los siguientes datos de buzones de correo 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 artículos
- Recuento de elementos eliminados
- Tamaño de advertencia del problema
- 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
- Archivar recuento de elementos eliminados
- Cuota de advertencia de archivo
- Cuota de archivo
Puedo simplemente compartir el guión contigo, pero siempre es bueno entender cómo funciona un guión. Así que primero vamos a repasar el guión, mientras explico las diferentes opciones. Al final del artículo, encontrarás un enlace al script en mi Github.
Cómo utilizar el Informe de tamaño del buzón de Office 365
El script de informe del tamaño del buzón de Office 365 se puede ejecutar con un par de parámetros diferentes. Siempre deberá proporcionar su dirección de correo electrónico para la autenticación con el parámetro -adminUPN. 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 john@contoso.comBuzones compartidos
Tiene un par de opciones para los buzones compartidos. De forma predeterminada, están incluidos, pero puede dejarlos fuera del informe u obtener solo los buzones compartidos con el parámetro -sharedMailboxes:
# Get only the shared mailboxes
.\MailboxSizeReport.ps1 -adminUPN john@contoso.com -sharedMailboxes only
# Get only the user mailboxes
.\MailboxSizeReport.ps1 -adminUPN john@contoso.com -sharedMailboxes no
# (Default) Get user and shared mailboxes
.\MailboxSizeReport.ps1 -adminUPN john@contoso.com -sharedMailboxes includeArchivar 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), utilice el parámetro -archive:$false:
# Don't get the archive mailboxes
.\MailboxSizeReport.ps1 -adminUPN john@contoso.com -archive:$falseRuta de exportación CSV
Puede definir un archivo de salida y una ruta con el parámetro -csvpath.
# Define path for CSV file
.\MailboxSizeReport.ps1 -adminUPN john@contoso.com -csvpath c:\temp\mailboxsizereport.csvEl script de informe del 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 utilizado 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 tendrá que ingresar su dirección de correo electrónico y podremos conectarnos a Exchange Online sin ninguna interacción del usuario.
Para que el script 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 de 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.
Obtener el tamaño del buzón con PowerShell
Para obtener las estadísticas de los buzones, primero debemos reunir 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.
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. Desde el cmdlet Get-EXOMailbox necesitamos obtener un par de propiedades adicionales:
- ProblemaAdvertenciaCuota
- ProhibirEnviarRecibirCuota
- ArchivoCuota
- ArchivoAdvertenciaCuota
- ArchivoBase de datos
Con la propiedad ArchiveDatabase podemos determinar si el correo del usuario también tiene un buzón de archivo. Al utilizar la selección, solo devolvemos los campos que necesitamos en el informe del buzón.
Obtener-MailboxStatistics en PowerShell
Para cada buzón, obtendremos las estadísticas del buzón. Ahora también queremos incluir el buzón de archivo de los usuarios. Para ello, necesitaremos ejecutar el cmdlet Get-EXOMailboxStatistics dos veces. 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-EXOMailboxStatistics-Identity $_.UserPrincipalName | Select TotalItemSize,TotalDeletedItemSize,ItemCount,DeletedItemCount,LastUserActionTimePara 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
}
} Para los buzones sin archivo, configuramos 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-EXOMailboxStatistics-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++;
}
}
}
}Quizás hayas notado que convertimos todos los tamaños a GB. La razón de esto 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.
Entonces, 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)
}
}
}Descargue el guión completo
Puedes descargar el script completo desde mi página de GitHub. Le recomiendo que lo pruebe primero en un pequeño conjunto de buzones. Cambie el ResultSize en la 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, ArchiveDatabaseConcluyendo
Para ejecutar este script fácilmente desde su 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 encuentres útil este script. Si tiene alguna pregunta, simplemente deje un comentario a continuación.
Es posible que también le guste uno de los siguientes scripts de informes de PowerShell:
- Informe de permisos de buzón
- Informe de tamaño de OneDrive
- Informe de situación de la AMF

