Etiquetas de confidencialidad y sus políticas
Lista tus etiquetas de confidencialidad y las políticas que las publican. Señala las que existen pero nadie puede usar porque no están en ninguna política.
Ejemplo en México
Clínica privada en Mérida, 120 personas
El corporativo pidió una etiqueta para expedientes médicos, pero en recepción dicen que no les aparece en Word.
.\get-etiquetas-sensibilidad.ps1 -RutaCsv .\etiquetas.csvVen que la etiqueta de expedientes aparece como Sin publicar y la agregan a la política de ese equipo.
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 cuando Security & Compliance PowerShell te lo pida.
- Filtra por Tipo en Excel y busca las etiquetas con Estado Sin publicar o Deshabilitada.
- Publica o retira esas etiquetas, y revisa las políticas marcadas con Revisar modo.
Ver el código completo de get-etiquetas-sensibilidad.ps1
<#
.SYNOPSIS
Lista las etiquetas de confidencialidad y las políticas que las publican.
.DESCRIPTION
Usa Get-Label y Get-LabelPolicy para mostrar qué etiquetas existen y cuáles no están en ninguna política:
una etiqueta sin publicar no aparece a los usuarios. 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-etiquetas-sensibilidad.ps1 -RutaCsv .\etiquetas.csv
.NOTES
Permisos: ninguno de Graph; usa ExchangeOnlineManagement.
Rol mínimo: grupo de roles Information Protection Readers, o el rol Sensitivity Label Reader en un grupo propio.
Licencia: Microsoft 365 E5/A5/G5/E3/A3/G3/F1/F3/Business Premium u Office 365 E5/A5/E3/A3 (etiquetado manual).
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 Resumir($valor) {
$lista = @($valor | Where-Object { $_ })
if (-not $lista.Count) { 'Nadie' }
elseif ("$lista" -match '(^|\s)All($|\s)') { 'Todos' }
else { "$($lista.Count) específicos" }
}
Connect-IPPSSession -ShowBanner:$false
try {
$etiquetas = @(Get-Label)
$politicas = @(Get-LabelPolicy)
} finally {
Disconnect-ExchangeOnline -Confirm:$false
}
$filas = @(
foreach ($e in $etiquetas) {
# Labels puede traer el nombre o el GUID de la etiqueta.
$publicadaEn = @($politicas | Where-Object { $_.Labels -contains $e.Name -or $_.Labels -contains "$($e.Guid)" } | ForEach-Object Name)
[pscustomobject]@{
Tipo = 'Etiqueta'
Nombre = $e.Name
Mostrado = $e.DisplayName
Prioridad = $e.Priority
Contenido = "$($e.ContentType)"
Estado = if ($e.Disabled -eq $true) { 'Deshabilitada' } elseif ($publicadaEn.Count) { 'Publicada' } else { 'Sin publicar' }
Politicas = $publicadaEn -join '; '
Modo = ''
Usuarios = ''
Grupos = ''
}
}
foreach ($p in $politicas) {
[pscustomobject]@{
Tipo = 'Política'
Nombre = $p.Name
Mostrado = ''
Prioridad = ''
Contenido = ''
Estado = if ($p.Mode -eq 'Enforce') { 'Aplicada' } else { 'Revisar modo' }
Politicas = "$($p.Labels)"
Modo = $p.Mode
Usuarios = Resumir $p.ExchangeLocation
Grupos = Resumir $p.ModernGroupLocation
}
}
)
Write-Host "Etiquetas: $($etiquetas.Count). Sin publicar: $(@($filas | Where-Object Estado -eq 'Sin publicar').Count). Políticas: $($politicas.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
}