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?
Paso | Acción | Detalles clave |
---|---|---|
1 | Parámetros | Rutas de búsqueda, usuario objetivo y archivo de salida. |
2 | Get-ChildItem | Lista solo carpetas del primer nivel en P:\ (-Force incluye elementos ocultos). |
3 | Get-Acl | Obtiene la ACL de cada carpeta; se examinan las entradas ($acl.Access ). |
4 | Filtro por usuario | Solo se añaden al array $Resultados las entradas cuyo IdentityReference coincide exactamente con $Usuario . |
5 | Salida | Si 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ística | Descripción |
---|---|
-Recurse | Baja por todo el árbol de carpetas; perfecta para auditorías completas o cuando no puedes permitirte dejar ningún permiso sin revisar. |
Sin archivos | El filtro Where-Object { $_.PSIsContainer } evita procesar ficheros; el rendimiento mejora y el informe se centra en directorios. |
Uso intensivo | Puede tardar bastante en volúmenes grandes. Conviene ejecutarlo fuera de horas punta o desde un servidor de administración. |
Comparativa rápida
Necesidad | Script recomendado | Ventajas | Tiempo de ejecución |
---|---|---|---|
Ver si un usuario tiene acceso directo en carpetas raíz | #1 | Rápido, salida compacta | Segundos |
Inventariar todos los permisos al primer nivel | #2 | Visión global sin ruido recursivo | Segundos-minutos |
Auditoría completa de todo el árbol | #3 | Cobertura 100 % | Minutos-horas |
Buenas prácticas al ejecutar los scripts
- Abrir PowerShell “Ejecutar como administrador”: garantiza acceso a todas las ACL.
- Política de ejecución (
Set-ExecutionPolicy
) — usaRemoteSigned
oBypass
si tu política IT lo permite. - Codificar rutas UNC con comillas dobles (
"\\servidor\recurso"
). - Programar tareas con el Programador de Windows para informes periódicos (por ejemplo, cada domingo a las 02:00).
- 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!