<# .SYNOPSIS Lista las políticas y reglas DLP, y señala las apagadas o en modo prueba. .DESCRIPTION Usa Get-DlpCompliancePolicy y Get-DlpComplianceRule. Una política en modo prueba o apagada no protege nada aunque aparezca en el portal. Solo lectura: no cambia nada en el tenant. .PARAMETER RutaCsv Ruta del CSV de salida. Si se omite, solo se muestra en pantalla. .EXAMPLE .\get-politicas-dlp.ps1 -RutaCsv .\politicas-dlp.csv .NOTES Permisos: ninguno de Graph; usa ExchangeOnlineManagement. Rol mínimo: rol View-Only DLP Compliance Management en un grupo de roles, o grupo Compliance Data Administrator. Licencia: Microsoft 365 E5/A5/G5/E3/A3/G3, Microsoft 365 Business Premium u Office 365 E5/A5/G5/E3/A3/G3. Licencia del código: MIT. Se entrega TAL CUAL, sin garantía. Pruébalo primero en un tenant de pruebas. #> [CmdletBinding()] param( [string]$RutaCsv ) $ErrorActionPreference = 'Stop' if (-not (Get-Command Connect-IPPSSession -ErrorAction SilentlyContinue)) { throw 'Falta el módulo. Instálalo con: Install-Module ExchangeOnlineManagement -Scope CurrentUser' } function Ubicaciones($p) { $mapa = [ordered]@{ Exchange = $p.ExchangeLocation SharePoint = $p.SharePointLocation OneDrive = $p.OneDriveLocation Teams = $p.TeamsLocation Dispositivos = $p.EndpointDlpLocation } ($mapa.Keys | Where-Object { @($mapa[$_] | Where-Object { $_ }).Count }) -join ', ' } function EstadoPolitica($p) { if ($p.Mode -eq 'Disable' -or $p.Enabled -eq $false) { return 'Apagada' } switch -Regex ("$($p.Mode)") { '^Test' { return 'En modo prueba' } '^(Enable|Enforce)$' { return 'Activa' } default { return "Revisar ($_)" } } } Connect-IPPSSession -ShowBanner:$false try { $filas = @( foreach ($p in @(Get-DlpCompliancePolicy)) { $estado = EstadoPolitica $p $reglas = @(Get-DlpComplianceRule -Policy $p.Name) if (-not $reglas.Count) { [pscustomobject]@{ Politica = $p.Name; Modo = $p.Mode; Estado = $estado; Ubicaciones = Ubicaciones $p; Regla = ''; EstadoRegla = 'Sin reglas'; Revisar = 'Sí' } } foreach ($r in $reglas) { $estadoRegla = if ($r.Disabled -eq $true) { 'Regla apagada' } else { 'Regla encendida' } [pscustomobject]@{ Politica = $p.Name Modo = $p.Mode Estado = $estado Ubicaciones = Ubicaciones $p Regla = $r.Name EstadoRegla = $estadoRegla Revisar = if ($estado -eq 'Activa' -and $r.Disabled -ne $true) { 'No' } else { 'Sí' } } } } ) } finally { Disconnect-ExchangeOnline -Confirm:$false } Write-Host "Reglas revisadas: $($filas.Count). Por revisar: $(@($filas | Where-Object Revisar -eq 'Sí').Count)." if ($RutaCsv) { # 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 }