Saltar al contenido
Microsoft scripts

Scripts de Purview

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.

Antes de correrloConsulta las reglas de una en una por política, así que en tenants con muchas políticas puede tardar. Modo activo no significa bloqueo: revisa también las acciones de cada regla en el portal.

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

Descubren 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

  1. Instala el módulo si no lo tienes: Install-Module ExchangeOnlineManagement -Scope CurrentUser.
  2. Ejecuta el script con -RutaCsv e inicia sesión en Security & Compliance PowerShell.
  3. Filtra la columna Revisar por Sí para ver políticas apagadas, en prueba, sin reglas o con reglas apagadas.
  4. 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
}

Relacionados