cambiar recursivamente el propietario de windows 7

95

De alguna manera, accidentalmente configuré todos los archivos en una subcarpeta en "Sin propietario" y parece que no puedo cambiar todos los permisos. Puedo cambiar uno a mano cambiando el propietario y luego estableciendo los permisos, pero ¿cómo puedo cambiar el propietario de todos los archivos? en este directorio a la vez?

Laurent
fuente

Respuestas:

92

Use takeowndesde el símbolo del sistema para tomar posesión de una carpeta, todas sus subcarpetas y archivos de forma recursiva:

takeown /f "c:\folder\subfolder" /r

Esto funciona bien, pero si no ejecuta su consola de línea de comandos como administrador, puede fallar para los archivos que no posee.

Kez
fuente
105

Para arreglar permisos realmente rotos, lo mejor es ejecutar estos dos comandos uno tras otro:

takeown /f "C:\path\to\folder" /r
icacls "C:\path\to\folder" /reset /T

El primero le dará la propiedad de todos los archivos, sin embargo, eso podría no ser suficiente, por ejemplo, si todos los archivos tienen los permisos de lectura / escritura / ejecución establecidos en "denegar". Eres el propietario de los archivos pero aún no puedes hacer nada con ellos.

En ese caso, ejecute el segundo comando, que reparará los permisos rotos.

Laurent
fuente
3
Excelente asesoramiento técnico ... su solución fue la única que funcionó. Gracias de nuevo.
carrabino
44
El mejor consejo, necesita usar takeown y icacls.
gnac
2
/ Una opción es útil si desea otorgar 'propiedad al grupo de administradores en lugar del propietario actual'. Debe tener privilegios de administrador para hacer esto. Es posible que deba abrir la ventana cmd usando ctrl-shift-enter.
PeterVermont
44
He agregado el /D Yparámetro para takeownque confirme automáticamente los directorios recurrentes para los que no tiene permisos de 'directorio de lista'.
Jeroen Wiert Pluimers
3
@JeroenWiertPluimers, aunque es un buen consejo que he eliminado la edición, ya que es (lo suficientemente estúpida) un parámetro localizada etc. Inglés de Windows será /D Y, por un francés /D O, tal vez en español /D S, etc.
Laurent
26

Tenga en cuenta que cacls está en desuso (¿desde Windows Vista?) Y le recomienda que lo use icacls.

Este comando restablecerá recursivamente los permisos en una carpeta:

icacls "C:\path\to\folder" /reset /T
de allí
fuente
5

Puede usar caclsdesde el símbolo del sistema:

cacls "C: \ ruta \ a \ carpeta" / E / T / C / G "Administrador": F

El /Tinterruptor le permite funcionar recursivamente. Reemplace Administratorcon el usuario al que desea otorgar permisos.

John T
fuente
1

Tuve problemas con archivos con rutas muy largas (más de 256 caracteres). Los dos comandos

takeown /f "C:\path\to\really_long_folder_name" /r
icacls "C:\path\to\really_long_folder_name" /reset /T

funcionó a excepción de estos archivos con rutas y nombres realmente largos. Terminé renombrando

"C:\path\to\really_long_folder_name"

a

"C:\path\to\r"

y luego corriendo

takeown /f "C:\path\to\r" /r /D Y
icacls "C:\path\to\r" /grant Everyone:(F) /t /c /q

después de lo cual podría cambiar el nombre de las carpetas a algo más sensato. takeown's / DY responde que sí a las indicaciones. Para icacls usé / grant para dar acceso completo a todos (ya que solo estaba tratando de acceder a los datos en un disco duro desde una PC muerta), con / t para procesar subcarpetas y archivos, / q para ejecutar en modo silencioso (ocultar éxitos) y / c para mostrar errores. Repetí el proceso, renombrando carpetas hasta que todos los permisos de los archivos se actualizaron con éxito.

Esperemos que esto ayude a alguien que ha encontrado errores similares a los errores "no se pudieron enumerar los objetos en el acceso denegado al contenedor" que estaba recibiendo al intentar obtener acceso a los datos de un disco duro antiguo.

Thesle Williams
fuente
0

Gracias @ this.lau_ por el consejo / reset, esto es exactamente lo que necesitaba para completar mi script para tomar posesión del CSC y hacer una copia de seguridad del mismo. Después de tomar posesión de C: \ Windows \ CSC, los permisos tienden a ser muy inconsistentes con respecto a la herencia: el modificador / reset me solucionó esto.

Function Copy-CSCData {
    $Datetime = Get-Date -Format yyyyMMdd.hhmmss
    $LogPath = 'PATH TO LOG'
    $CSCSource = 'C:\Windows\CSC\v2.0.6\namespace'
    $Dest = 'DESTINATION PATH'
    $icaclsource = "\\?\" + $CSCSource

    $CSCLogfile = "$LogPath\" + "$Datetime" + "_CSCRobocopy.log"

    icacls.exe $icaclsource /reset /T
    icacls.exe $icaclsource /grant :r "Everyone:(OI)(CI)F"

    Robocopy $CSCSource $Dest /Copy:DATSO /E /XO /Z /LOG+:$CSCLogfile /V /FP /NP /R:2 /W:2 /XF "~$*","*.tmp"
}

@Thesle Williams: si comprueba la variable $ icaclsource desde arriba, observa que agrego "\? \" Delante de la ruta de origen. Al agregar esto al frente, aceptará nombres de archivo más largos. Esto también es un problema que tuve pero esto lo solucionó. Salud.

Josh

Joshua Biddle
fuente
¡Bienvenido a Super User! Solo para hacerle saber que "hacer ping" a los usuarios solo funciona en los comentarios de las publicaciones, no en las publicaciones reales. Lamentablemente, no puede comentar en publicaciones que no sean las suyas, o en las respuestas a sus preguntas, hasta que tenga más de 50 reputación . Consulte ¿Cómo funcionan los comentarios @respuestas? . Tenga en cuenta que no puede hacer ping a nadie en un comentario. Solo el autor de la publicación y cualquier otro usuario que ya haya comentado.
robinCTS