Comando icacls: ver y administrar permisos de carpetas y archivos

Si administras un servidor de archivos, antes o después tendrás que responder a preguntas como «¿quién puede entrar en esta carpeta?», «¿por qué este usuario no puede modificar este documento?» o «tengo que dar acceso a un departamento entero a 40.000 archivos». La interfaz gráfica de permisos de Windows sirve para casos sueltos, pero se queda corta cuando necesitas ver, cambiar o copiar permisos de forma masiva. Para eso existe icacls, la herramienta de línea de comandos que muestra y modifica las listas de control de acceso discrecional (DACL) de archivos y carpetas. En esta guía aprenderás a leer su salida, a conceder y quitar permisos, a gestionar la herencia, a guardar y restaurar permisos como copia de seguridad y a resolver los errores habituales.
Qué es icacls
icacls (Integrity Control Access Control Lists) viene incluido en Windows y sustituye al antiguo comando cacls, que está obsoleto. Con él puedes mostrar permisos, concederlos, denegarlos, quitarlos, cambiar el propietario, restablecer los permisos heredados y guardar o restaurar las listas de permisos de un árbol de carpetas completo. Para modificar permisos necesitas ejecutar la consola como administrador, y que tu cuenta tenga derecho a cambiar los permisos de esa carpeta.
Ver los permisos de una carpeta
icacls "D:\Datos\Contabilidad"
La salida es parecida a esta:
D:\Datos\Contabilidad EMPRESA\GRP-Contabilidad:(OI)(CI)(M)
BUILTIN\Administradores:(I)(OI)(CI)(F)
NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
BUILTIN\Usuarios:(I)(OI)(CI)(RX)
Cada línea tiene tres partes: la cuenta (usuario o grupo), los indicadores de herencia entre paréntesis y el permiso concedido. Para leerla hay que conocer estos códigos.
Permisos básicos
- F: control total.
- M: modificar (leer, escribir, ejecutar y eliminar, pero no cambiar permisos).
- RX: leer y ejecutar.
- R: solo lectura.
- W: solo escritura.
- D: eliminar.
- N: sin acceso.
Además existen permisos avanzados, que se escriben entre paréntesis y separados por comas, por ejemplo (RD,WD,AD): leer datos, escribir datos y anexar datos. Los más usados son DE (eliminar), RC (leer permisos), WDAC (cambiar permisos), WO (tomar posesión), X (ejecutar o atravesar) y DC (eliminar subelementos).
Indicadores de herencia
- (I): el permiso es heredado de la carpeta superior. Si no aparece, el permiso es explícito en esta carpeta.
- (OI): lo heredan los objetos (archivos) que contiene.
- (CI): lo heredan los contenedores (subcarpetas) que contiene.
- (IO): «solo heredar»: no se aplica a la carpeta actual, solo a lo que contiene.
- (NP): no propagar: lo heredan los hijos directos, pero no más allá.
Para que un permiso afecte a una carpeta y a todo lo que contiene, lo habitual es usar (OI)(CI), como en el ejemplo.
Conceder permisos
# Conceder "Modificar" a un grupo sobre la carpeta y todo su contenido
icacls "D:\Datos\Contabilidad" /grant "EMPRESA\GRP-Contabilidad:(OI)(CI)M"
# Solo lectura para otro grupo
icacls "D:\Datos\Contabilidad" /grant "EMPRESA\GRP-Auditoria:(OI)(CI)RX"
# Reemplazar los permisos explícitos anteriores de esa cuenta por los nuevos (:r)
icacls "D:\Datos\Contabilidad" /grant:r "EMPRESA\GRP-Contabilidad:(OI)(CI)M"
La diferencia entre /grant y /grant:r es importante: sin :r, el permiso se añade a los que la cuenta ya tuviera de forma explícita; con :r, los reemplaza. Si quieres que la cuenta quede exactamente con el permiso indicado, usa :r.
Quitar y denegar permisos
# Quitar todos los permisos de una cuenta (concedidos y denegados)
icacls "D:\Datos\Contabilidad" /remove "EMPRESA\usuario.antiguo"
# Quitar solo los permisos concedidos (g) o solo los denegados (d)
icacls "D:\Datos\Contabilidad" /remove:g "EMPRESA\usuario.antiguo"
# Denegar explícitamente
icacls "D:\Datos\Contabilidad\Nominas" /deny "EMPRESA\GRP-Practicas:(OI)(CI)F"
Úsalo con prudencia: una denegación explícita prevalece sobre los permisos concedidos, incluso a través de pertenecer a otro grupo. Es una fuente habitual de problemas difíciles de diagnosticar. Lo más recomendable es no denegar y, en su lugar, no conceder acceso a quien no deba tenerlo.
Gestionar la herencia
Por defecto, una carpeta hereda los permisos de su carpeta superior. Para darle permisos propios y que no dependan de arriba, hay que romper la herencia:
# Desactivar la herencia copiando los permisos heredados como explícitos
icacls "D:\Datos\Contabilidad" /inheritance:d
# Desactivar la herencia y eliminar los permisos heredados (queda solo lo explícito)
icacls "D:\Datos\Contabilidad" /inheritance:r
# Volver a activar la herencia
icacls "D:\Datos\Contabilidad" /inheritance:e
Un procedimiento típico para dejar una carpeta accesible solo a un grupo concreto es: desactivar la herencia con :d (para no perder el acceso de los administradores), quitar los grupos que no deben acceder y conceder el permiso al grupo adecuado:
icacls "D:\Datos\RRHH" /inheritance:d
icacls "D:\Datos\RRHH" /remove "*S-1-5-32-545" # Usuarios (por SID)
icacls "D:\Datos\RRHH" /grant "EMPRESA\GRP-RRHH:(OI)(CI)M"
Usa SIDs para que funcione en cualquier idioma
Los nombres de los grupos integrados cambian con el idioma de Windows: Administrators en inglés, Administradores en español. Si un script debe funcionar en servidores en distintos idiomas, usa los identificadores de seguridad (SID) precedidos de un asterisco:
*S-1-5-32-544: Administradores.*S-1-5-32-545: Usuarios.*S-1-5-18: SYSTEM.*S-1-5-11: Usuarios autenticados.*S-1-1-0: Todos (Everyone).
icacls "D:\Datos\Compartida" /grant "*S-1-5-32-544:(OI)(CI)F" "*S-1-5-18:(OI)(CI)F"
Aplicar a todo un árbol y gestionar errores: /T, /C, /Q
/T: aplica la operación a todos los archivos y subcarpetas, no solo a la carpeta indicada./C: continúa aunque se produzcan errores en algún archivo (los errores se siguen mostrando)./Q: suprime los mensajes de éxito, útil en operaciones masivas para ver solo los problemas./L: actúa sobre un vínculo simbólico en lugar de sobre su destino.
icacls "D:\Datos\Contabilidad" /grant:r "EMPRESA\GRP-Contabilidad:(OI)(CI)M" /T /C /Q
Guardar y restaurar permisos: tu copia de seguridad
icacls no tiene un modo de simulación («no hacer nada, solo mostrar»), así que antes de una operación masiva conviene guardar los permisos actuales para poder volver atrás:
# Guardar los permisos de todo el árbol en un archivo
icacls "D:\Datos\Contabilidad\*" /save "C:\Backup\acl-contabilidad.txt" /T /C
# Restaurarlos más adelante (se indica la carpeta contenedora)
icacls "D:\Datos\Contabilidad\" /restore "C:\Backup\acl-contabilidad.txt"
Es la red de seguridad más importante: antes de tocar permisos en un servidor de archivos, guarda siempre el estado actual. También sirve para trasladar los permisos de una estructura de carpetas a otra y para auditar los cambios en el tiempo.
Restablecer los permisos y tomar posesión
# Restablecer los permisos de una carpeta y todo su contenido a los heredados por defecto
icacls "D:\Datos\Contabilidad" /reset /T /C
# Cambiar el propietario
icacls "D:\Datos\Contabilidad" /setowner "*S-1-5-32-544" /T /C
# Alternativa clásica para recuperar una carpeta a la que no tienes acceso
takeown /F "D:\Datos\Contabilidad" /R /D S
icacls "D:\Datos\Contabilidad" /grant "*S-1-5-32-544:(OI)(CI)F" /T /C
Ten en cuenta que /reset elimina todos los permisos explícitos y deja solo los heredados: es útil para arreglar un desorden, pero perderás los permisos específicos que hubiera. En takeown, la respuesta que se indica con /D depende del idioma del sistema: S (sí) en español, Y en inglés.
Buscar y diagnosticar
# Encontrar archivos que mencionan explícitamente un SID (por ejemplo, de una cuenta eliminada)
icacls "D:\Datos\*" /findsid *S-1-5-21-1111111111-2222222222-3333333333-1105 /T /C
# Detectar listas de permisos mal formadas
icacls "D:\Datos\*" /verify /T /C
La opción /findsid es muy útil para limpiar permisos de cuentas que ya no existen: los verás en la salida como un SID largo (S-1-5-21-...) en lugar de un nombre.
icacls frente a PowerShell
PowerShell ofrece Get-Acl y Set-Acl, con una salida en forma de objeto más fácil de filtrar. Para consultar, la comparación es esta:
(Get-Acl 'D:\Datos\Contabilidad').Access |
Select-Object IdentityReference, FileSystemRights, AccessControlType, IsInherited, InheritanceFlags
Para informes y filtros (por ejemplo, «qué carpetas tienen concedido Control total a Todos»), PowerShell es más cómodo, y puedes recorrer un árbol con los bucles de PowerShell. Para modificaciones masivas rápidas y fiables, icacls sigue siendo la herramienta preferida, porque está optimizada para procesar muchos archivos. Si quieres repasar otros comandos de administración, consulta los 10 comandos de PowerShell imprescindibles.
Buenas prácticas de permisos
- Asigna permisos a grupos, no a usuarios. Cuando alguien cambia de puesto, solo se cambia su pertenencia a grupos. Lo explicamos con el modelo AGDLP en la guía de usuarios y grupos en Active Directory.
- Evita «Todos: Control total» y el acceso de «Usuarios autenticados» a carpetas con datos sensibles.
- Mantén la herencia siempre que puedas: romperla en muchas carpetas hace el sistema inmanejable.
- Aplica el principio de mínimo privilegio: «Modificar» suele bastar; reserva «Control total» para administradores.
- Separa los permisos de recurso compartido y los de NTFS, y piensa que se aplica el más restrictivo de ambos.
- Guarda siempre los permisos con
/saveantes de un cambio masivo y prueba antes en una carpeta de pruebas. - Automatiza las auditorías: un informe periódico de permisos anómalos, programado con tareas programadas de PowerShell, detecta problemas antes de que lo hagan los usuarios.
Errores frecuentes
- «Se procesaron correctamente 0 archivos; error al procesar 1 archivos»: normalmente es un problema de acceso (no tienes permiso para cambiar los permisos de esa carpeta) o una ruta mal escrita. Ejecuta la consola como administrador y comprueba la ruta; si el problema es de acceso, toma posesión como se explicó antes.
- «No se realizó ninguna asignación entre los nombres de cuenta y los identificadores de seguridad»: el nombre de la cuenta no existe o está mal escrito (o está en otro idioma). Comprueba el nombre, incluyendo el dominio, o usa el SID.
- Los cambios no se ven en los archivos: te faltó
/To los archivos tienen la herencia desactivada y siguen con sus propios permisos. - El usuario sigue sin acceder: comprueba los permisos del recurso compartido (si accede por red), la pertenencia a grupos (el usuario debe cerrar sesión y volver a entrar para actualizar su token) y que no haya una denegación explícita.
- Rutas de más de 260 caracteres: pueden dar errores al procesar con la API clásica de Windows. Acorta las rutas cuando sea posible o ejecuta el cambio sobre una carpeta de nivel más profundo para que las rutas relativas sean más cortas.
Preguntas frecuentes
¿Cuál es la diferencia entre icacls y cacls?
cacls es la herramienta antigua, ya obsoleta; no maneja bien la herencia ni los permisos modernos. Usa siempre icacls.
¿Qué hace exactamente (OI)(CI)?
Indica que el permiso se hereda tanto por los archivos (object inherit) como por las subcarpetas (container inherit) de la carpeta donde lo defines. Sin esos indicadores, el permiso solo afecta a la propia carpeta.
¿Puedo ver los permisos efectivos de un usuario concreto?
icacls muestra las entradas de la lista, no el resultado final para un usuario. Para los permisos efectivos usa la pestaña Acceso efectivo de las propiedades de seguridad avanzada de la carpeta, que tiene en cuenta los grupos del usuario.
Conclusión
icacls es la herramienta fundamental para gestionar permisos NTFS a escala: muestra la lista de permisos, concede y quita acceso, gestiona la herencia y permite guardar y restaurar el estado completo. Aprende los códigos de permiso y de herencia, usa SIDs para scripts multilingües, aplica los cambios con /T /C y haz siempre una copia con /save antes de un cambio masivo. Y asigna los permisos a grupos, nunca a usuarios sueltos.