Questão recursivamente alterar janelas do proprietário 7


De alguma maneira, eu acidentalmente configurei todos os arquivos em uma subpasta para "Sem dono" e não consigo alterar todas as permissões. Posso alterar uma delas manualmente, alterando o proprietário e configurando as permissões, mas como posso alterar o proprietário de todos os arquivos neste diretório de uma só vez?


86


origem




Respostas:


Usar takeown a partir do prompt de comando para apropriar-se de uma pasta, todas as suas subpastas e arquivos de forma recursiva:

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

Isso funciona bem, mas se você não executar o console da linha de comando como administrador, ele poderá falhar nos arquivos que você não possui.


82





Para corrigir permissões realmente quebradas, o melhor é executar esses dois comandos, um após o outro:

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

O primeiro lhe dará a propriedade de todos os arquivos, mas isso pode não ser suficiente, por exemplo, se todos os arquivos tiverem as permissões read / write / exec definidas como "negar". Você possui os arquivos, mas ainda não pode fazer nada com eles.

Nesse caso, execute o segundo comando, que corrigirá as permissões quebradas.


92



Excelente assessoria técnica ... sua solução foi a única que funcionou. Obrigado novamente. - carrabino
Melhor conselho, precisa usar takeown e icacls. - gnac
/ Uma opção é útil se você deseja dar 'propriedade ao grupo de administradores em vez do proprietário atual'. Você precisa ter privilégios de administrador para fazer isso. Pode ser necessário abrir a janela cmd usando ctrl-shift-enter. - PeterVermont
Eu adicionei o /D Y parâmetro para takeown por isso, confirma automaticamente os diretórios recursed nos quais você não tem permissões de "lista de diretórios". - Jeroen Wiert Pluimers
@JeroenWiertPluimers, apesar de ter sido um bom conselho, eu removi a edição, já que é um parâmetro localizado (estupidamente) no Windows em inglês. /D Yem francês /D Otalvez em espanhol /D Setc. - this.lau_


Note-se que cacls é obsoleto (desde o Windows Vista?) E aconselha você a usar icacls.

Este comando irá redefinir recursivamente as permissões em uma pasta:

icacls "C:\path\to\folder" /reset /T

26





Você pode usar cacls no prompt de comando:

cacls "C: \ caminho \ para \ pasta" / E / T / C / G "Administrador": F

o /T switch permite que ele funcione recursivamente. Substituir Administrator com o usuário que você deseja conceder permissões.


5





Eu tive problemas com arquivos com caminhos muito longos (maiores que 256 caracteres). Os dois comandos

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

funcionou, exceto por esses arquivos com caminhos e nomes realmente longos. Acabei renomeando

"C:\path\to\really_long_folder_name"

para

"C:\path\to\r"

e depois correndo

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

após o qual eu poderia renomear as pastas para algo mais sensato. takeown's / D Y responde sim aos prompts. Para icacls eu usei / grant para dar acesso total a todos (como eu estava apenas tentando acessar dados em um disco rígido de um PC morto), com / t para processar subpastas e arquivos, / q para executar em modo silencioso (hide sucessos) e / c para mostrar erros. Repeti o processo, renomeando pastas até que todas as permissões de arquivos fossem atualizadas com sucesso.

Espero que isso ajude alguém que tenha encontrado erros semelhantes aos erros "falha ao enumerar objetos no acesso a contêineres é negado" que eu estava recebendo ao tentar obter acesso aos dados de um disco rígido antigo.


1





Obrigado @ this.lau_ pela dica / reset, isso é exatamente o que eu precisava para completar meu script para tomar posse do CSC e fazer um backup dele. Depois de assumir a propriedade de C: \ Windows \ CSC, as permissões tendem a ficar muito inconsistentes em relação à herança - o parâmetro / reset corrigiu isso para mim.

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 - se você verificar a variável $ icaclsource acima, você verá que eu adicionei "\? \" Na frente do caminho de origem. Ao adicionar isso na frente, ele aceitará nomes de arquivos mais longos. Este é também um problema que eu tive, mas isso resolveu isso! Felicidades.

Josh


0



Bem-vindo ao superusuário! Apenas informando que os usuários "pingados" só funcionam nos comentários das postagens, não dentro os posts reais. Infelizmente você não pode comentar em posts que não sejam seus, ou em respostas a suas perguntas, até que você tenha 50+ reputação. Vejo Como o comentário @replies funciona?. Note que você não pode simplesmente pingar qualquer um em um comentário. Apenas o autor da postagem e qualquer outro usuário que já tenha comentado. - robinCTS