Saltar al contenido
Microsoft scripts

Scripts de Purview

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.csv

Ven que la etiqueta de expedientes aparece como Sin publicar y la agregan a la política de ese equipo.

Cómo implementarlo

  1. Instala el módulo si no lo tienes: Install-Module ExchangeOnlineManagement -Scope CurrentUser.
  2. Ejecuta el script con -RutaCsv e inicia sesión cuando Security & Compliance PowerShell te lo pida.
  3. Filtra por Tipo en Excel y busca las etiquetas con Estado Sin publicar o Deshabilitada.
  4. 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
}

Relacionados