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.
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 correr la simulación 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.
#>
[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
}