Corrigindo erros "Esta lista de controle de acesso não está em formato canônico" na linha de comando


9

Em várias estações de trabalho de desenvolvedores, recebemos o temido "Esta lista de controle de acesso não está em formato canônico e, portanto, não pode ser modificada". erro quando tentamos definir permissões em determinadas pastas. Não conseguimos descobrir o que está corrompendo essas ACLs.

No momento, a única maneira de corrigir isso é clicar com o botão direito do mouse na pasta / arquivo corrompido, escolher Propriedades e clicar na guia Segurança. O Windows notará a corrupção e oferecerá corrigi-la. Não gosto disso porque é manual e requer que o usuário faça algumas investigações para descobrir qual pasta / arquivo está corrompido.

Existe um script ou programa em algum lugar que fará isso automaticamente? Vejo que icaclstem um /verifyparâmetro, mas apenas me mostra que as ACLs em um arquivo / pasta estão corrompidas. Não oferece para consertar nada.

Respostas:


6

Você pode tentar usar um script simples do PowerShell para substituir os arquivos de interrupção acl pela acl de outro arquivo: get-acl path_to_file_with_known_good_acl | set-acl -path path_to_corrupt_file


A outra resposta sugere que você poderia fazer get-acl path_to_corrupt_file | set-acl -path ptah_to_corrupt_file.
binki

5

Finalmente, consegui descobrir uma correção automatizada para isso. Quando você chama o Set-Aclcmdlet do PowerShell , ele solicita novamente as ACLs corretamente:

$path = C:\Path\To\Item\With\Borked\ACL
$acl = Get-Acl $path
Set-Acl $path $acl

Obviamente, ele pode ser o pai do diretório que está bagunçado; portanto, você deve percorrer algumas etapas para encontrar o culpado. Use icacls C:\Path\To\Item\With\Suspect\CL /verifypara descobrir se algo precisa de reparo.

Em nosso ambiente, Cygwin é o provável culpado: quando cria diretórios, ele gosta de conceder permissões no estilo POSIX, em vez de confiar no Windows para gerenciar a segurança do sistema de arquivos.


1
Obrigado pelo truque. Eu tive o problema hoje e escreveu um pequeno PowerShell para automatizar a fixação: gist.github.com/vbfox/8fbec5c60b0c16289023
Julien Roncaglia

1

Para mim, houve um duplo problema: regra errônea ACL + não-canônica declarada para NULL SID (WTH?). Eu sugiro que foi causado pela versão cygwin do git.

De qualquer forma, no meu caso, reaplicar a mesma ACL não fazia nenhum sentido:

> Set-Acl $f.FullName (Get-Acl $f.FullName)
> (Get-Acl $f.FullName).AreAccessRulesCanonical
False
> (Get-Acl $f.FullName).GetAccessRules($True, $False, [System.Security.Principal.NTAccount]) | ? {$_.Identityeference.Value -eq "NULL SID" }
FileSystemRights  : WriteExtendedAttributes, ExecuteFile, DeleteSubdirectoriesAndFiles, ReadPermissions
AccessControlType : Deny
IdentityReference : NULL SID
IsInherited       : False
InheritanceFlags  : None
PropagationFlags  : None

Então, eu tive que aplicar explicitamente a ACL do arquivo com a correta, como mencionado por @mschneider


1

O icacls também pode corrigi-lo:

c:\> accesschk -q FILE
Error: FILE has a non-canonical DACL:
   Explicit Deny after Explicit Allow

c:\> icacls FILE /t /q /c /reset
Successfully processed 1 files; Failed processing 0 files

c:\> accesschk -q FILE
.. OK

Outros comandos úteis, equivalentes ao chmod 0777 FILE, raiz do chown FILE

  icacls  FILE /t /q /c /grant    :r Everyone:F
  icacls  FILE /t /q /c /grant    :r Everyone:F /inheritance:r
  icacls  FILE /t /q /c /setowner Administrators


-1
  1. No IIS, clique com o botão direito do mouse na pasta com o problema
  2. Editar permissões ...
  3. Selecione a guia Segurança
  4. Clique no botão "Editar" e salve (isso parece reordenar a ACL)
  5. Confirme todos os pop-ups

Essa solução já foi mencionada na pergunta. No entanto, o autor pede uma solução automática.
Scai

Além disso, essas são permissões NTFS, portanto, o IIS não está envolvido.
pedaços salpicado
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.