Buzones con POP, IMAP o SMTP AUTH
Lista los buzones con POP, IMAP o SMTP AUTH habilitados y dice si SMTP AUTH está desactivado en toda la organización. Te sirve para cerrar protocolos que casi nadie necesita.
Solo lecturaSin permisos de GraphProbado con respuestas simuladas. Sin ejecutar en un tenant real.
Ejemplo en México
Empresa de logística en Monterrey, 200 personas
Una revisión de seguridad del corporativo pide cerrar los protocolos antiguos, pero en las bodegas hay escáneres que mandan correo y nadie sabe con qué cuenta.
.\get-protocolos-heredados.ps1 -RutaCsv .\protocolos.csvVen que SMTP AUTH sigue habilitado para toda la organización y que POP e IMAP están en todos los buzones. Identifican las cuentas de los escáneres, las dejan como excepción y apagan el resto.
Cómo implementarlo
- Instala el módulo si no lo tienes: Install-Module ExchangeOnlineManagement -Scope CurrentUser.
- Ejecuta el script con -RutaCsv y anota lo que diga en pantalla sobre SMTP AUTH a nivel organización.
- En el CSV, mira SmtpEfectivo: el valor del buzón manda sobre el de la organización.
- Confirma quién usa de verdad cada protocolo, como impresoras o sistemas viejos, antes de apagar nada.
- Apaga lo que no se use con Set-CASMailbox y deja SMTP AUTH solo en las excepciones.
Ver el código completo de get-protocolos-heredados.ps1
<#
.SYNOPSIS
Lista los buzones con POP, IMAP o SMTP AUTH habilitados y dice si SMTP AUTH está desactivado en toda la organización.
.DESCRIPTION
Estos protocolos son una superficie de ataque y casi nadie los necesita. Calcula el SMTP AUTH efectivo de cada buzón:
el valor del buzón manda sobre el de la organización y, si está vacío, hereda el de la organización.
Un buzón que no tiene ninguno de los tres habilitado queda fuera del reporte.
Solo lectura: no cambia nada en el tenant.
.PARAMETER TipoBuzon
Tipos de buzón a revisar. Por defecto, todos.
.PARAMETER RutaCsv
Ruta del CSV de salida. Si se omite, solo se muestra en pantalla.
.EXAMPLE
.\get-protocolos-heredados.ps1 -RutaCsv .\protocolos.csv
.EXAMPLE
.\get-protocolos-heredados.ps1 -TipoBuzon SharedMailbox -RutaCsv .\protocolos-compartidos.csv
.NOTES
Permisos: ninguno de Graph; usa ExchangeOnlineManagement.
Rol mínimo: Lector global (o View-Only Organization Management en Exchange Online).
Licencia: Exchange Online.
Licencia del código: MIT. Se entrega TAL CUAL, sin garantía. Pruébalo primero en un tenant de pruebas.
#>
#Requires -Version 7.0
[CmdletBinding()]
param(
[ValidateSet('UserMailbox', 'SharedMailbox', 'RoomMailbox', 'EquipmentMailbox')][string[]]$TipoBuzon = @('UserMailbox', 'SharedMailbox', 'RoomMailbox', 'EquipmentMailbox'),
[string]$RutaCsv
)
$ErrorActionPreference = 'Stop'
if (-not (Get-Command Connect-ExchangeOnline -ErrorAction SilentlyContinue)) {
throw 'Falta el módulo. Instálalo con: Install-Module ExchangeOnlineManagement -Scope CurrentUser'
}
# El CSV se vacía desde el inicio: si algo truena o no hay resultados, no queda uno viejo que parezca actual.
if ($RutaCsv) { Set-Content -LiteralPath $RutaCsv -Value $null -Encoding utf8BOM }
Connect-ExchangeOnline -ShowBanner:$false
try {
$smtpOrg = 'No se pudo consultar'
$errorOrg = $null
try {
$valor = (Get-TransportConfig -ErrorAction Stop).SmtpClientAuthenticationDisabled
if ($null -eq $valor) { throw 'Get-TransportConfig no devolvió SmtpClientAuthenticationDisabled' }
$smtpOrg = if ($valor) { 'Deshabilitado' } else { 'Habilitado' }
} catch { $errorOrg = "$_" }
# Get-EXOCasMailbox no filtra por tipo: el tipo sale de Get-EXOMailbox.
$tipos = @{}
Get-EXOMailbox -ResultSize Unlimited -RecipientTypeDetails $TipoBuzon | ForEach-Object { $tipos["$($_.PrimarySmtpAddress)"] = "$($_.RecipientTypeDetails)" }
$filas = @(foreach ($c in @(Get-EXOCasMailbox -ResultSize Unlimited -Properties SmtpClientAuthenticationDisabled)) {
$correo = "$($c.PrimarySmtpAddress)"
if (-not $tipos.ContainsKey($correo)) { continue }
# Vacío significa que el buzón hereda el valor de la organización.
$smtpBuzon = $c.SmtpClientAuthenticationDisabled
$smtpEfectivo = if ($smtpBuzon -eq $true) { 'Deshabilitado' } elseif ($smtpBuzon -eq $false) { 'Habilitado' } else { $smtpOrg }
if ($c.PopEnabled -ne $true -and $c.ImapEnabled -ne $true -and $smtpEfectivo -eq 'Deshabilitado') { continue }
[pscustomobject]@{
Buzon = $correo
TipoBuzon = $tipos[$correo]
POP = if ($c.PopEnabled -eq $true) { 'Habilitado' } elseif ($c.PopEnabled -eq $false) { 'Deshabilitado' } else { 'No determinado' }
IMAP = if ($c.ImapEnabled -eq $true) { 'Habilitado' } elseif ($c.ImapEnabled -eq $false) { 'Deshabilitado' } else { 'No determinado' }
SmtpEnBuzon = if ($smtpBuzon -eq $true) { 'Deshabilitado' } elseif ($smtpBuzon -eq $false) { 'Habilitado' } else { 'Hereda de la organización' }
SmtpEfectivo = $smtpEfectivo
SmtpOrganizacion = $smtpOrg
}
})
} finally {
Disconnect-ExchangeOnline -Confirm:$false
}
Write-Host "SMTP AUTH a nivel organización: $smtpOrg"
Write-Host "Buzones con algún protocolo heredado: $($filas.Count)"
if ($RutaCsv) {
# Excel ejecutaría como fórmula un valor que empiece con estos caracteres.
foreach ($f in $filas) { foreach ($p in $f.PSObject.Properties) { if ($p.Value -is [string] -and $p.Value -match '^[=+\-@\t\r]') { $p.Value = "'" + $p.Value } } }
# UTF-8 con BOM para que Excel en español muestre bien los acentos.
$filas | Export-Csv -Path $RutaCsv -NoTypeInformation -Encoding utf8BOM
Write-Host "CSV guardado en $RutaCsv"
} else {
$filas | Format-Table -AutoSize
}
if ($errorOrg) { throw "No se pudo consultar SMTP AUTH de la organización: $errorOrg" }