Saltar al contenido
MS Scripts

Scripts de Exchange

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.

Antes de ejecutarloMicrosoft deja POP e IMAP habilitados de forma predeterminada, así que espera ver casi todos los buzones. Habilitado no significa que se use, y este reporte no lee los inicios de sesión. Con los valores predeterminados de seguridad de Microsoft Entra estos protocolos ya están bloqueados aunque aquí salgan habilitados. En un buzón compartido, deshabilitar un protocolo no impide el acceso de quien lo tenga habilitado en su propia cuenta.

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.csv

Ven 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

  1. Instala el módulo si no lo tienes: Install-Module ExchangeOnlineManagement -Scope CurrentUser.
  2. Ejecuta el script con -RutaCsv y anota lo que diga en pantalla sobre SMTP AUTH a nivel organización.
  3. En el CSV, mira SmtpEfectivo: el valor del buzón manda sobre el de la organización.
  4. Confirma quién usa de verdad cada protocolo, como impresoras o sistemas viejos, antes de apagar nada.
  5. 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" }

Relacionados