icacls - Ver y cambiar permisos
A veces, al abrir una carpeta aparece “No tiene permiso para obtener acceso a esta carpeta”, o al eliminar un archivo aparece “Acceso denegado”.
La causa son los permisos (ACL: lista de control de acceso) del archivo o la carpeta. En el Símbolo del sistema puede ver y cambiar los permisos con el comando icacls y tomar la posesión con el comando takeown.
Este artículo explica cómo usar ambos comandos, centrándose en los procedimientos más habituales.
Sintaxis básica del comando icacls
icacls <archivo o carpeta> [opciones]
Sin opciones, muestra los permisos actuales.
icacls "C:\work"
Cada línea es la configuración de un usuario (o grupo), con el formato usuario:(permiso).
Tipos de permisos
Códigos como (F) y (M) indican el permiso concedido. Estos cinco son los más usados (los “derechos simples”).
| Código | Significado |
|---|---|
F | Control total (todas las operaciones, incluido cambiar permisos) |
M | Modificar (leer, escribir y eliminar) |
RX | Lectura y ejecución |
R | Solo lectura |
W | Solo escritura |
Existen también derechos individuales, como D (eliminar), pero con estos cinco basta para empezar.
Códigos de herencia
Si los permisos de una carpeta se transmiten a los archivos y subcarpetas que contiene, se indica con códigos antes del permiso.
| Código | Significado |
|---|---|
(OI) | Herencia de objeto. Se transmite a los archivos de la carpeta |
(CI) | Herencia de contenedor. Se transmite a las subcarpetas de la carpeta |
(IO) | Solo herencia. No se aplica a la propia carpeta |
(NP) | Sin propagación. Solo se transmite un nivel, no más abajo |
(I) | La configuración se heredó de la carpeta superior |
Para dar permisos a toda una carpeta, lo normal es añadir (OI)(CI) a la vez.
Conceder permisos (/grant)
Use /grant para añadir permisos a un usuario o grupo.
icacls "C:\work" /grant "Users:(OI)(CI)M"
Esto concede al grupo Users el permiso “Modificar” sobre C:\work y todo su contenido.
Para el usuario actual puede usar la variable de entorno %USERNAME%.
icacls "C:\work" /grant "%USERNAME%:(OI)(CI)F"
/grant añade a la configuración existente. Para reemplazarla, use /grant:r.
icacls "C:\work" /grant:r "%USERNAME%:(OI)(CI)RX"
Con /grant:r, los permisos de tipo “permitir” que ya tuviera el usuario indicado se reemplazan por los nuevos (las entradas heredadas y las de denegación no se reemplazan).
Los nombres de los grupos integrados pueden mostrarse de forma distinta según el idioma del sistema. Para mayor seguridad, indique el SID precedido de *. Por ejemplo, Administrators es *S-1-5-32-544 y Everyone es *S-1-1-0.
icacls "C:\work" /grant "*S-1-5-32-544:(OI)(CI)F"
Denegar y quitar permisos
Para bloquear a un usuario concreto, use /deny.
icacls "C:\work\secret.txt" /deny "Guest:(R)"
Para eliminar por completo la entrada de un usuario, use /remove.
icacls "C:\work\secret.txt" /remove "Guest"
Una entrada de denegación (/deny) establecida en el mismo nivel suele tener prioridad sobre una de permiso. Si se deniega a sí mismo o al grupo Users, podría quedarse sin acceso. Úsela solo cuando sea realmente necesario.
Cambiar también subcarpetas y archivos (/T)
Con /T, la operación se aplica a todos los archivos y subcarpetas de la carpeta indicada. Con /C, el proceso continúa aunque se produzcan errores.
icacls "C:\work" /grant "%USERNAME%:F" /T /C
Controlar la herencia (/inheritance)
| Opción | Comportamiento |
|---|---|
/inheritance:e | Activa la herencia |
/inheritance:d | Desactiva la herencia y copia las entradas heredadas como entradas explícitas |
/inheritance:r | Desactiva la herencia y elimina todas las entradas heredadas |
/inheritance:r elimina todas las entradas heredadas, por lo que, si no hay entradas explícitas, puede que después nadie tenga acceso. Si tiene dudas, use /inheritance:d.
Para devolver los permisos a su estado inicial (heredados de la carpeta superior), es útil /reset.
icacls "C:\work" /reset /T /C
Se pierden los permisos que concedió a usuarios y las denegaciones, y se reemplazan por los heredados de la carpeta superior. Con /T afecta a todo el contenido, así que haga antes una copia con /save.
Resolver “Acceso denegado”
Cuando no puede acceder a una carpeta creada por otro usuario o a datos traídos de un PC anterior, el procedimiento básico es tomar posesión y después concederse permisos. Hágalo en un Símbolo del sistema ejecutado como administrador.
1. Tomar posesión (takeown)
takeown /f "D:\old-data" /r /d y
| Opción | Significado |
|---|---|
/f | El archivo o carpeta de destino (se admiten comodines) |
/r | Incluye subcarpetas y archivos |
/d y | Si no tiene permiso para listar el contenido de una carpeta, responde “sí” y continúa |
/a | Hace propietario al grupo Administrators (sin esta opción, el propietario es el usuario actual) |
Al usar /r, indique también /d y (o /d n) para que el proceso continúe sin preguntas.
2. Conceder permisos (icacls)
Ser propietario no concede acceso automáticamente. A continuación, use icacls para concederse permisos.
icacls "D:\old-data" /grant "%USERNAME%:(OI)(CI)F" /T /C
Con estas dos líneas, normalmente podrá abrir o eliminar la carpeta.
Cambiar la posesión o los permisos de C:\Windows, C:\Program Files o la raíz de una unidad (C:\) puede impedir que Windows funcione correctamente. Cambie solo las carpetas que contengan sus propios datos.
Copia de seguridad y restauración de permisos
Conviene guardar la configuración actual antes de cambiarla.
icacls "C:\work\*" /save "%USERPROFILE%\work-acl.txt" /T
Para volver atrás, ejecute /restore indicando la carpeta que contiene los elementos guardados.
icacls "C:\work" /restore "%USERPROFILE%\work-acl.txt"
En /restore, indique la carpeta que contenía los elementos guardados. En el ejemplo anterior se guardó el contenido de C:\work\*, por lo que se indica C:\work.
Uso en un archivo por lotes
icacls y takeown establecen ERRORLEVEL en 0 si tienen éxito y en un valor distinto de cero si fallan, por lo que puede actuar según el resultado. if errorlevel 1 solo comprueba el comando anterior, así que compruébelo tras cada uno. Además, > nul oculta solo la salida normal; los mensajes de error siguen mostrándose.
@echo off
setlocal
set "TARGET=D:\old-data"
takeown /f "%TARGET%" /r /d y > nul
if errorlevel 1 (
echo No se pudo tomar posesión. Compruebe que se ejecuta como administrador.
exit /b 1
)
icacls "%TARGET%" /grant "%USERNAME%:(OI)(CI)F" /T /C > nul
if errorlevel 1 (
echo No se pudieron cambiar los permisos.
exit /b 1
)
echo Permisos cambiados.
endlocal