Crear política DLP de CURP en modo prueba
Crea una política DLP en modo prueba, sin notificaciones ni bloqueo, que busca CURP en Exchange, SharePoint y OneDrive. Sirve para medir antes de decidir.
Hace cambiosSin permisos de GraphProbado con respuestas simuladas. Sin ejecutar en un tenant real.
Ejemplo en México
Manufactura en Querétaro, 800 personas
Recursos Humanos envía archivos con CURP a proveedores de nómina. Quieren medir el volumen sin frenar los turnos de la planta.
.\new-politica-dlp-mexico.ps1 -RutaCsv .\politica-dlp.csvQueda una política en simulación que no bloquea ni avisa a nadie. El resultado les ayuda a documentar medidas de seguridad y a decidir qué controlar.
Cómo implementarlo
- Instala el módulo si no lo tienes: Install-Module ExchangeOnlineManagement -Scope CurrentUser.
- Ejecuta primero con -WhatIf y lee lo que crearía.
- Ejecútalo sin -WhatIf, confirma cada cambio y guarda el CSV con -RutaCsv.
- Deja que la simulación se ejecute y revisa los elementos en el panel de simulación y en el Explorador de actividad.
- Con los resultados, decide en el portal de Microsoft Purview si ajustas, agregas acciones o pasas a modo activo.
Ver el código completo de new-politica-dlp-mexico.ps1
<#
.SYNOPSIS
Crea una política DLP en modo prueba que detecta CURP en Exchange, SharePoint y OneDrive.
.DESCRIPTION
Crea la política con el modo fijo TestWithoutNotifications y una regla sin acciones de bloqueo. Usa el único
tipo integrado específico de México documentado: Mexico Unique Population Registry Code (CURP). No hay
parámetro para cambiar el modo: pasarla a activa es una decisión aparte, después de revisar la simulación.
Si ya existe una política con ese nombre, se detiene y no toca nada.
.PARAMETER Nombre
Nombre de la política. La regla se llama igual, con el sufijo " - Regla CURP".
.PARAMETER RutaCsv
Ruta del CSV con el resultado. Si se omite, solo se muestra en pantalla.
.EXAMPLE
.\new-politica-dlp-mexico.ps1 -WhatIf
.EXAMPLE
.\new-politica-dlp-mexico.ps1 -RutaCsv .\politica-dlp.csv
.NOTES
Permisos: ninguno de Graph; usa ExchangeOnlineManagement.
Rol mínimo: rol 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.
#>
#Requires -Version 7.0
[CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')]
param(
[ValidateNotNullOrEmpty()]
[string]$Nombre = 'Mexico CURP - Modo prueba',
[string]$RutaCsv
)
$ErrorActionPreference = 'Stop'
$modo = 'TestWithoutNotifications'
$nombreRegla = "$Nombre - Regla CURP"
$tipoCurp = 'Mexico Unique Population Registry Code (CURP)'
$idCurp = 'e905ad4d-5a74-406d-bf36-b1efca798af4' # Id de la definición publicada en Microsoft Learn.
if (-not (Get-Command Connect-IPPSSession -ErrorAction SilentlyContinue)) {
throw 'Falta el módulo. Instálalo con: Install-Module ExchangeOnlineManagement -Scope CurrentUser'
}
# -WhatIf simula la creación, no la conexión. Security & Compliance PowerShell no respeta -WhatIf: lo aplica ShouldProcess.
$simular = $WhatIfPreference
$WhatIfPreference = $false
Connect-IPPSSession -ShowBanner:$false
$WhatIfPreference = $simular
try {
$curp = @(Get-DlpSensitiveInformationType | Where-Object { "$($_.Id)" -eq $idCurp -or $_.Name -eq $tipoCurp }) | Select-Object -First 1
if (-not $curp) { throw "El tipo '$tipoCurp' no aparece en este tenant. No se creó nada." }
if (@(Get-DlpCompliancePolicy | Where-Object Name -eq $Nombre).Count) { throw "Ya existe una política llamada '$Nombre'. No se cambió nada." }
$politica = $null
$regla = $null
if ($PSCmdlet.ShouldProcess($Nombre, "Crear política DLP en modo $modo para Exchange, SharePoint y OneDrive")) {
$politica = New-DlpCompliancePolicy -Name $Nombre -Comment 'Detección de CURP en modo prueba. Revisa la simulación antes de activarla.' `
-ExchangeLocation All -SharePointLocation All -OneDriveLocation All -Mode $modo
}
if (($politica -or $simular) -and $PSCmdlet.ShouldProcess($nombreRegla, "Crear regla DLP que detecta '$($curp.Name)' sin bloquear")) {
try {
$regla = New-DlpComplianceRule -Name $nombreRegla -Policy $Nombre -ContentContainsSensitiveInformation @(@{ Name = $curp.Name; minCount = '1' })
} catch {
throw "La política '$Nombre' se creó, pero la regla falló y quedó sin reglas: $_"
}
}
} finally {
Disconnect-ExchangeOnline -Confirm:$false
}
$resultado = [pscustomobject]@{
Politica = if ($politica) { $politica.Name } else { $Nombre }
Regla = if ($regla) { $regla.Name } else { $nombreRegla }
Modo = if ($politica.Mode) { $politica.Mode } else { $modo }
Ubicaciones = 'Exchange, SharePoint, OneDrive'
Tipo = $curp.Name
Resultado = if ($regla) { 'Creada en modo prueba' } elseif ($politica) { 'Política creada sin regla' } elseif ($simular) { 'Simulada con -WhatIf: no se creó nada' } else { 'Cancelada: no se creó nada' }
}
Write-Host "$($resultado.Politica): $($resultado.Resultado)"
if ($RutaCsv) {
# El CSV es local y describe el resultado: se escribe también con -WhatIf. UTF-8 con BOM para Excel en español.
$resultado | Export-Csv -Path $RutaCsv -NoTypeInformation -Encoding utf8BOM -WhatIf:$false -Confirm:$false
Write-Host "CSV guardado en $RutaCsv"
} else {
$resultado | Format-List
}