Auditoría de permisos NTFS con PowerShell

Auditoría de permisos NTFS con PowerShell

Tres scripts prácticos para necesidades diferentes

Gestionar correctamente los permisos NTFS en entornos Windows es una tarea fundamental para cualquier departamento de TI. Un control preciso ayuda a garantizar la seguridad de los datos, a cumplir con políticas organizativas y normativas externas, y a prevenir accesos no autorizados.

Este artículo presenta tres scripts en PowerShell diseñados para facilitar distintas tareas de auditoría sobre permisos NTFS. Cada uno cumple una función específica, desde la verificación de accesos de un usuario concreto hasta la inspección completa y recursiva de carpetas compartidas. Todos los scripts se muestran tal como funcionan en entornos reales, listos para ser utilizados o adaptados según las necesidades de cada organización.

1. Comprobación de un usuario concreto en el primer nivel

# Configura el recurso compartido y usuario
$Ruta = "P:\"
$Usuario = "DOMINIO\d.perez"
$Salida = "C:\Scripts\PermisosUsuario.txt"

$Resultados = @()

# Obtener solo carpetas del primer nivel (sin recursión)
Get-ChildItem -Path $Ruta -Force | Where-Object { $_.PSIsContainer } | ForEach-Object {
    try {
        $acl = Get-Acl $_.FullName
        foreach ($entry in $acl.Access) {
            if ($entry.IdentityReference -eq $Usuario) {
                $Resultados += "Carpeta: $($_.FullName)"
                $Resultados += "  Usuario:    $($entry.IdentityReference)"
                $Resultados += "  Permisos:   $($entry.FileSystemRights)"
                $Resultados += "  Acceso:     $($entry.AccessControlType)"
                $Resultados += "  Heredado:   $($entry.IsInherited)"
                $Resultados += "----------------------------------------"
            }
        }
    } catch {
        Write-Warning "No se pudo acceder a: $($_.FullName)"
    }
}

# Si no hay coincidencias, notificarlo
if ($Resultados.Count -eq 0) {
    $Resultados += "No se encontraron permisos para $Usuario en ninguna carpeta bajo $Ruta"
}

# Guardar resultados en archivo
$Resultados | Out-File -FilePath $Salida -Encoding UTF8
Write-Host "✅ Permisos exportados a: $Salida"

¿Qué hace exactamente?

PasoAcciónDetalles clave
1ParámetrosRutas de búsqueda, usuario objetivo y archivo de salida.
2Get-ChildItemLista solo carpetas del primer nivel en P:\ (-Force incluye elementos ocultos).
3Get-AclObtiene la ACL de cada carpeta; se examinan las entradas ($acl.Access).
4Filtro por usuarioSolo se añaden al array $Resultados las entradas cuyo IdentityReference coincide exactamente con $Usuario.
5SalidaSi no se encontró nada se avisa; en caso contrario se escribe el informe plano en UTF-8.

Cuándo usarlo

  • Auditorías puntuales para un solo usuario.
  • Verificar si se colaron permisos directos en carpetas de primer nivel.

2. Inventario de todos los usuarios en el primer nivel

# Ruta base y archivo de salida
$Ruta = "\\recursocompartido\Administración\"
$Salida = "C:\Scripts\PermisosTodosUsuarios.txt"

$Resultados = @()

# Recorre solo carpetas directamente bajo P:\
Get-ChildItem -Path $Ruta -Force | Where-Object { $_.PSIsContainer } | ForEach-Object {
    try {
        $acl = Get-Acl $_.FullName
        $Resultados += "📁 Carpeta: $($_.FullName)"
        foreach ($entry in $acl.Access) {
            $Resultados += "  Usuario/Grupo: $($entry.IdentityReference)"
            $Resultados += "    Permisos:    $($entry.FileSystemRights)"
            $Resultados += "    Acceso:      $($entry.AccessControlType)"
            $Resultados += "    Heredado:    $($entry.IsInherited)"
            $Resultados += ""
        }
        $Resultados += "----------------------------------------`n"
    } catch {
        Write-Warning "No se pudo acceder a: $($_.FullName)"
    }
}

# Guardar resultados
if ($Resultados.Count -eq 0) {
    $Resultados += "No se encontraron permisos en carpetas bajo $Ruta"
}
$Resultados | Out-File -FilePath $Salida -Encoding UTF8
Write-Host "✅ Todos los permisos exportados a: $Salida"

Puntos destacados

  • Sin recursión: ideal para un vistazo rápido al nivel raíz de tu área compartida.
  • Emojis (📁) mejoran la legibilidad del informe.
  • Muestra todas las ACE de cada carpeta, con datos de herencia incluidos.

Aplicaciones típicas

  • Generar un mapa de permisos antes de migrar datos a otro servidor.
  • Compartir con equipos de cumplimiento (compliance) sin inundarlos con información recursiva.

3. Auditoría exhaustiva recursiva

# Ruta base y archivo de salida
$Ruta = "\\recursocompartido\Administración"
$Salida = "C:\Scripts\PermisosCarpetas.txt"

$Resultados = @()

# Recorre todas las carpetas, sin incluir archivos
Get-ChildItem -Path $Ruta -Recurse -Force | Where-Object { $_.PSIsContainer } | ForEach-Object {
    try {
        $acl = Get-Acl $_.FullName
        $Resultados += "📁 Carpeta: $($_.FullName)"
        foreach ($entry in $acl.Access) {
            $Resultados += "  Usuario/Grupo: $($entry.IdentityReference)"
            $Resultados += "    Permisos:    $($entry.FileSystemRights)"
            $Resultados += "    Acceso:      $($entry.AccessControlType)"
            $Resultados += "    Heredado:    $($entry.IsInherited)"
            $Resultados += ""
        }
        $Resultados += "----------------------------------------`n"
    } catch {
        Write-Warning "No se pudo acceder a: $($_.FullName)"
    }
}

# Si no hay resultados
if ($Resultados.Count -eq 0) {
    $Resultados += "No se encontraron permisos en carpetas bajo $Ruta"
}

# Exportar a archivo
$Resultados | Out-File -FilePath $Salida -Encoding UTF8
Write-Host "✅ Permisos de carpetas exportados a: $Salida"

Por qué es diferente

CaracterísticaDescripción
-RecurseBaja por todo el árbol de carpetas; perfecta para auditorías completas o cuando no puedes permitirte dejar ningún permiso sin revisar.
Sin archivosEl filtro Where-Object { $_.PSIsContainer } evita procesar ficheros; el rendimiento mejora y el informe se centra en directorios.
Uso intensivoPuede tardar bastante en volúmenes grandes. Conviene ejecutarlo fuera de horas punta o desde un servidor de administración.

Comparativa rápida

NecesidadScript recomendadoVentajasTiempo de ejecución
Ver si un usuario tiene acceso directo en carpetas raíz#1Rápido, salida compactaSegundos
Inventariar todos los permisos al primer nivel#2Visión global sin ruido recursivoSegundos-minutos
Auditoría completa de todo el árbol#3Cobertura 100 %Minutos-horas

Buenas prácticas al ejecutar los scripts

  1. Abrir PowerShell “Ejecutar como administrador”: garantiza acceso a todas las ACL.
  2. Política de ejecución (Set-ExecutionPolicy) — usa RemoteSigned o Bypass si tu política IT lo permite.
  3. Codificar rutas UNC con comillas dobles ("\\servidor\recurso").
  4. Programar tareas con el Programador de Windows para informes periódicos (por ejemplo, cada domingo a las 02:00).
  5. Versionar los resultados añadiendo la fecha al nombre del archivo ($Fecha = Get-Date -Format "yyyyMMdd").
$Salida = "C:\Scripts\PermisosUsuario_$Fecha.txt"

Conclusión

Estos tres scripts cubren la mayoría de escenarios de auditoría NTFS — desde la comprobación puntual de un único usuario hasta la inspección total de un recurso compartido. Al estar escritos en PowerShell puro, son fáciles de mantener, programar y adaptar a nuevos requisitos (por ejemplo, exportar a CSV o insertar resultados en una base de datos).

Guárdalos en tu repositorio de utilidades IT y ejecútalos según la frecuencia que marque tu política de seguridad. ¡Así tendrás siempre un mapa actualizado de quién puede ver qué en tus sistemas de archivos Windows!

Comentarios

Aún no hay comentarios. ¿Por qué no comienzas el debate?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *