Políticas DLP apagadas o en modo prueba
Lista políticas y reglas DLP, y señala las apagadas o en modo prueba. Es común dejar una simulación corriendo y creer que ya protege.
Ejemplo en México
Empresa de logística en Monterrey, 400 personas
Una auditoría del corporativo pregunta qué controles DLP están realmente activos en los correos de las sucursales.
.\get-politicas-dlp.ps1 -RutaCsv .\politicas-dlp.csvDescubren dos políticas en modo prueba desde hace meses y entregan una lista real de lo que está activo, lo apagado y lo que falta decidir.
Cómo implementarlo
- Instala el módulo si no lo tienes: Install-Module ExchangeOnlineManagement -Scope CurrentUser.
- Ejecuta el script con -RutaCsv e inicia sesión en Security & Compliance PowerShell.
- Filtra la columna Revisar por Sí para ver políticas apagadas, en prueba, sin reglas o con reglas apagadas.
- Decide con el responsable de cada política si la activas, la corriges o la retiras.
Ver el código completo de get-politicas-dlp.ps1
<#
.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
}