<# .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 }