Cambiar permisos en carpetas con icacls.exe

Si has cambiado permisos NTFS desde linea de comandos seguramente te suenen los comandos cacls, xcacls, setACL, fileACL...
Windows 7/2008 traen la utilidad de linea de comandos icacls (que funciona mucho mejor que su antecesor xcacls)
Por ejemplo si queremos añadir a los administradores locales permiso de Control Total sobre una carpeta (y subcarpetas):
icacls.exe "%ruta%" /Q /T /grant:r *S-1-5-32-544:(OI)(CI)(F)

Aunque se puede añadir permisos con el nombre del usuario/grupo, prefiero usar el SID para evitar problemas con los distintos idiomas (Administradores/Administrators).
Este comando crea una entrada para los Administradores locales en cada ACL de cada carpeta, pero si prefieres que las carpetas, subcarpetas y ficheros hereden los permisos de la carpeta padre:
icacls.exe "%ruta%" /Q /T /inheritance:e

En mi caso he necesitado añadir Administrators y SYSTEM a todas las subcarpetas de una unidad (sin modificar la carpeta padre), con un bucle 'FOR' lo conseguimos enseguida:
For /F "eol=* tokens=*" %%i IN ('dir "%ruta%" /b /AD') do icacls.exe "%ruta%\%%i" /Q /grant:r *S-1-5-32-544:(OI)(CI)(F) /grant:r *S-1-5-18:(OI)(CI)(F)

Pero, claro si quieres añadir este permiso es porque no tienes acceso, y los comandos anteriores te devolveran un Acceso Denegado.
Antes tendras que tomar posesion de las carpetas y ficheros:
takeown.exe /f "%ruta%" /R /A /D S
*(S en Windows ESP o Y en Windows ENG)

He preparado un bat para ejecutar los comandos segun cada necesidad:
@echo off
:inicio
set /P ruta=[carpeta a la que conceder permisos?]
echo.
echo [0-] NO CAMBIAR OWNER
echo [1-] ESTABLECER OWNER ADMINISTRATORS
echo.
echo [-2] AÑADIR ADMINISTRATORS A CARPETA Y SUBCARPETAS
echo [-3] AÑADIR ADMINISTRATORS A CARPETA
echo [-4] HABILITAR HERENCIA
echo [-5] AÑADIR SYSTEM A CARPETA
echo.
echo Ej. 04 SOLO HABILITAR HERENCIA. 14 OWNER + HABILITAR HERENCIA.
echo.
set /P val=[Que permiso quieres asignar?]

REM PROPIETARIO DE CARPETA Y SUBCARPETAS
if %val:~0,1%==1 takeown.exe /f "%ruta%" /R /A /D S
REM AÑADIR ADMINISTRATORS A CARPETA Y SUBCARPETAS
if %val:~1,1%==2 icacls.exe "%ruta%" /Q /T /grant:r *S-1-5-32-544:(OI)(CI)(F)
REM AÑADIR ADMINISTRATORS A CARPETA
if %val:~1,1%==3 icacls.exe "%ruta%" /Q /grant:r *S-1-5-32-544:(OI)(CI)(F)
REM HABILITAR HERENCIA
if %val:~1,1%==4 icacls.exe "%ruta%" /Q /T /inheritance:e
REM AÑADIR SYSTEM A CARPETA
if %val:~1,1%==5 icacls.exe "%ruta%" /Q /grant:r *S-1-5-18:(OI)(CI)(F)
pause
cls
goto inicio

De esta manera con asignar a la variable val 02,03,04,05,12,13,14,15 contemplo todas las opciones que me interesan.

Comentarios

  1. Estoy estudiando icacls pero desde muy basico y quiero dar permisos a un usuario sobre una carpeta...pero voy mas perdido....

    ResponderEliminar
    Respuestas
    1. para añadir permisos de modificación a un usuario en una carpeta:
      icacls c:\carpeta /grant:r dominio\usuario:(OI)(CI)(M)

      Eliminar
  2. Gracias!!!!!
    Hacia los cambios desde el GUI y no funcionaba...con esto, funciono la primera vez!!

    ResponderEliminar
  3. Hola, me gustaría tener acceso para modificar system32 y SysWOW64 ya que no he podido dando propiedad y permisos, espero puedas ayudarme, gracias.

    ResponderEliminar
    Respuestas
    1. no te recomiendo cambiar los permisos de esas carpetas, pero con el script del ejemplo puedes hacerlo. Tienes que hacerte owner primero ya que el owner es TrustedInstaller. Pero vaya, que me parece una muy mala idea...

      Eliminar
  4. como añadirias permisos a un grupo de ususarios

    ResponderEliminar
    Respuestas
    1. para añadir permisos de modificación a un grupo en una carpeta:
      icacls c:\carpeta /grant:r dominio\grupo:(OI)(CI)(M)

      Eliminar
  5. una consulta yo use este comando para dar acceso atotal a cualquier usuario en la red ,pero no me funciona,al entrar desde otra maquina la recurso compartido solo puedo ver el contenido de la carpeta pero no puedo crear ,ni modificar archivos,cual puede ser el error ..saludos
    icacls c:\comp /Q /T /grant:r todos:(OI)(CI)(F)

    ResponderEliminar
  6. Muchas gracias por los datos del bat.
    Yo además le agregué una segunda variable para poder agregar al usuario que queremos dar permisos.

    @echo off
    :inicio
    set /P ruta=[carpeta a la que conceder permisos?]
    set /P usuario=[nombre de usuario al que quieres dar o quitar permisos?]
    echo.
    echo [0-] NO CAMBIAR OWNER
    echo [1-] ESTABLECER OWNER AL USUARIO %usuario%
    echo.
    echo [-2] AGREGAR USUARIO %usuario% A LA CARPETA Y SUBCARPETAS %ruta%
    echo [-3] AGREGAR PERMISOS AL USUARIO %usuario% A LA CARPETA %ruta%
    echo [-4] HABILITAR HERENCIA A LA CARPETA %ruta%
    echo [-5] ELIMINAR PERMISO A LA CARPETA %ruta% DEL USUARIO %usuario%
    echo [-6] RESETAR PERMISOS A LA CARPETA %ruta%
    echo [-7] DESHABILITAR HERENCIA A LA CARPETA %ruta%
    echo.
    echo Ej. 04 SOLO HABILITAR HERENCIA. 14 OWNER + HABILITAR HERENCIA.
    echo.
    set /P val=[Que permiso quieres asignar?]

    REM PROPIETARIO DE CARPETA Y SUBCARPETAS
    if %val:~0,1%==1 takeown.exe /f "%ruta%" /R /A /D S
    REM AÑADIR "%usuario%" A CARPETA Y SUBCARPETAS
    if %val:~1,1%==2 icacls.exe "%ruta%" /grant:r "%usuario%":(OI)(CI)(F) /T /C
    REM AÑADIR PERMISOS AL "%usuario%" A LA CARPETA "%ruta%"
    if %val:~1,1%==3 icacls.exe "%ruta%" /grant:r "%usuario%":(OI)(CI)(F) /C
    REM HABILITAR HERENCIA
    if %val:~1,1%==4 icacls.exe "%ruta%" /inheritance:e /T /C
    REM DESHABILITAR HERENCIA
    if %val:~1,1%==7 icacls.exe "%ruta%" /inheritance:d /T /C
    REM ELIMINAR "%usuario%" A CARPETA Y SUBCARPETAS
    if %val:~1,1%==5 icacls.exe "%ruta%" /remove:g "%usuario%" /T /C
    REM RESETEAR PERMISOS
    if %val:~1,1%==6 icacls.exe "%ruta%" /reset /T /C
    pause
    cls
    goto inicio

    Un saludo

    ResponderEliminar
  7. Gracias por el artículo, lo veo genial.

    Importante abrir el cmd como administrador para evitar la UAC y también el idioma de Windows, si está inglés o en español:

    http://www.sysadmit.com/2017/07/windows-actualmente-no-tiene-permiso-de-acceso-a-esta-carpeta.html

    ResponderEliminar
  8. Hola una pregunta, quiero modificar permisos de todas las carpetas llamadas minutas de un arbol, y quitar la herencia de esas carpetas pero no de todo su contenido, si hago esto:
    "icacls minutas /T /inheritance:r /grant:r jorge:F /grant:r portatil_casa:F" mqe quita la herencia de cada carpeta y archivo que hay dentro de minutas, ¿hay alguna forma de hacerlo con todas a la vez? Gracias de antemano muy buen trabajo.

    ResponderEliminar
  9. /T hace que sea recursivo, si quieres recorrer una carpeta y aplicar el icacls solo a ciertas subcarpetas yo ya me meteria en powershell, con algo como:
    get-childitem [carpeta padre] -directory -recurse -include 'minutas'|select fullname|%{icacls $_.fullname /inheritance:r /grant:r jorge:F /grant:r portatil_casa:F}

    *Probado con Powershell 5.1, creo que el parametro -directory no esta en 2.0

    ResponderEliminar
  10. Muchas gracias por compartir estos detalles, pero he intentado y no puedo recuperar los permisos de unos archivos, que no se si se dañaron o algún usuario encontró la forma de denegar el acceso hasta al administrador del mismo servidor. Son archivos que se encontraban compartidos en una carpeta de red, ¿conocen algún modo en el que pueda recuperar el acceso a esos archivos aunque el administrador no tenga ni acceso de lectura? no se ve ni siquiera las propiedades del archivo.

    Gracias!
    Aurora

    ResponderEliminar
    Respuestas
    1. Si, precisamente este script es para eso, tienes que hacerte owner primero asi que elige la opcion 14 (owner + habilitar herencia)
      Y recuerda que el comando takeown.exe /f "%ruta%" /R /A /D S
      es para un Windows en Español, si lo lanzas en un Windows en Ingles será takeown.exe /f "%ruta%" /R /A /D Y

      Eliminar
  11. hola buenos dias yo he intentado utilizar el comando cacls en windows 10 pero no ha funcionado cambia en algo la forma de utilizar el comando, lo teclee asi icacls*/grant usuario 2:F /T y no arrojo el resultado deseado hay otra forma de hacerlo??? o existe otra forma de realizar la asignacion de control de acceso, de antemano gracias por su ayuda

    ResponderEliminar
  12. gran trabajo el tuyo una consulta para que una carpeta se vuelva sin escritura osea que no se modifique su contenido no se quite ni se añada nada y a la vez que se pueda volver a activar tal escritura agradeceria bastante tu ayuda

    ResponderEliminar

Publicar un comentario