Estou com vontade de contar uma história, então se você quiser ir direto ao cerne da questão, pule para a linha horizontal.
Título original: Zumbis de um domínio morto não me entregam meus arquivos!
Encontrei um problema ao restaurar algumas fitas de arquivo antigas, onde arquivos e pastas pertenciam a usuários que não existiam mais em um domínio que não existia mais.
As fitas continham arquivos de backup no Windows 2000, 2003, 2008, 2012 R2 (pode até haver alguns NT4) de volumes NTFS locais e matrizes de armazenamento CIFS NAS, e estou restaurando-os no Windows Server 2022.
No passado, era útil preservar a propriedade dos arquivos, pois esse era o único registro de autoria para muitos tipos de arquivos.
Mas parece ter havido um período no início dos anos 2000 em que as pessoas que deixaram a empresa tiveram suas contas do Active Directory excluídas em vez de desativadas. Claro, eles possuíam arquivos e pastas nessas fitas.
Muito mais tarde, houve uma renomeação de domínio e, como os usuários foram excluídos, não havia como adicionar seus SIDs a um histórico de SID, cujo escopo era desconhecido de qualquer maneira.
De qualquer forma, venha hoje e estou restaurando arquivos dessas fitas antigas, e o Windows está restaurando os antigos DACLs e proprietários do passado. Grande erro: não só não consigo acessar esses arquivos e pastas como administrador, como também não consigo forçar a herança de permissão nesses arquivos e pastas ou até mesmo redefinir o proprietário usando icacls e um prompt de comando elevado.
icacls <folder> /setowner Administrators /t /c
icacls <folder> /reset /t /c
Também tenho um script usando xcacls.vbs que me permite redefinir o proprietário apenas de pastas.
Isso funcionou para arquivos que não pertenciam a zumbis, mas o Windows recusou acesso a muitos, muitos arquivos.
No entanto, consegui redefinir os proprietários na GUI do File Explorer e enviar o novo proprietário para tudo que está abaixo. "substituir todas as permissões de objetos filhos, etc.." em seguida, substituiu as permissões. Eu poderia então excluir tudo.
Agora, posso recomeçar sem restaurar DACLs ou proprietários - mas então, os autores originais não-zumbis terão que ser esquecidos. (O software de backup é tudo ou nada sobre isso).
icacls
e xcacls
não limpará os proprietários e DACLs, mesmo com elevação. Mas posso fazer isso em massa no File Explorer! Existe uma maneira de fazer isso de forma mais seletiva usando um prompt de comando?
ATUALIZAÇÃO: OK, então a resposta de @ u1686_grawity me colocou no caminho certo. Consegui usar o takeown para excluir os arquivos e recomeçar.
O problema é que takeown /r
é um instrumento contundente e apenas se apropria de todos os arquivos e pastas. Eu poderia simplesmente ter restaurado os arquivos da fita sem restaurar suas ACLs e proprietários originais. O objetivo era manter a propriedade original do arquivo (na medida do possível) com redefinição de ACLs.
Para algo um pouco mais seletivo, redirecionei a saída icacls /reset /t /c /q
para um arquivo de texto e, em seguida, usei um editor de texto para transformar cada access denied
mensagem de erro em um takeown /F
comando e salvei-o como um .bat
arquivo. Executar o arquivo em lote e repetir icacls /reset
me deu um novo conjunto de arquivos no próximo nível abaixo. Após 10 repetições, isso corrigiu cerca de 40.000 dos 267.678 arquivos. Isso deixou 41 arquivos que se recusaram a ter sua propriedade tomada. 36 estavam em 2 diretórios que tiveram sua propriedade assumida manualmente.
Os últimos 5 arquivos tinham caracteres não ASCII em seus nomes. O arquivo em lote só seria executado se eu o salvasse na codificação DOS, o UTF8 não funcionaria.
Consegui apropriar-me manualmente dos últimos 5 arquivos.
Demorou cerca de 12 horas e foi uma fita. Não tenho certeza se vale a pena espremer o suco.
O problema com o uso
icacls /setowner
é que obter propriedade não lhe concede implicitamente quaisquer outros direitos, exceto "Escrever ACL" - em particular, na verdade, não lhe concede os direitos de listar o conteúdo do diretório ou mesmo de ler sua ACL. Você precisa apropriar-se do diretório superior, redefinir sua DACL, apropriar-se dos subdiretórios de primeiro nível, redefinir suas DACLs e assim por diante.Use
takeown /a /r /d y
para fazer isso; ele redefinirá automaticamente as DACLs sempre que encontrar um diretório que não pode listar.Alternativamente, instale o módulo PowerShell "PSPrivilege" da PSGallery e use-o para ativar
SeBackupPrivilege
eSeRestorePrivilege
. Eles permitem que você ignore a maioria das restrições de DACL, incluindo a capacidade de escrever DACLs (na verdade, é o que o icacls e o Explorer usam para definir proprietários arbitrários), mas por padrão eles estão no estado "retido, mas inativo" para administradores. Assim que os dois privilégios estiverem ativos, os icacls deverão ser mais eficazes.Como já existe uma boa resposta que provavelmente é o que o OP deseja, aqui está outra opção. O suporte NTFS no Linux tende a ser realmente útil (ou quebrado, dependendo de como você o vê, eu acho), pois ignora a segurança de problemas de propriedade. Monte como root, pegue os arquivos e pronto. Eles provavelmente ainda estarão errados quando você voltar ao Windows (o Windows se preocupa com a segurança do NTFS), mas pelo menos você terá acesso a eles.