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