<# .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" }