在我们的几个开发人员工作站上,当我们尝试设置某些文件夹的权限时,我们一直收到可怕的“此访问控制列表不是规范格式,因此无法修改。”错误。我们无法找出是什么破坏了这些 ACL。
目前,我知道修复它的唯一方法是右键单击损坏的文件夹/文件,选择“属性”,然后单击“安全”选项卡。然后 Windows 会注意到损坏并提出修复建议。我不喜欢这种方法,因为它是手动的,需要用户进行一些调查才能找出哪个文件夹/文件已损坏。
是否有某个脚本或程序可以自动执行此操作?我看到它icacls
有一个/verify
参数,但它只显示文件/文件夹上的 ACL 已损坏。它不提供任何修复。
答案1
我终于找到了一个自动修复方法。当您调用 PowerShell 的Set-Acl
cmdlet 时,它将正确地重新排序 ACL:
$path = C:\Path\To\Item\With\Borked\ACL
$acl = Get-Acl $path
Set-Acl $path $acl
当然,可能是目录的父级出现问题,所以您应该进行一些遍历来找到罪魁祸首。用它icacls C:\Path\To\Item\With\Suspect\CL /verify
来确定是否需要修复。
在我们的环境中,Cygwin 可能是罪魁祸首:当它创建目录时,它喜欢授予它们 POSIX 样式的权限,而不是依赖 Windows 来管理文件系统安全。
答案2
您可以尝试使用一个简单的 PowerShell 脚本用另一个文件的 acl 覆盖损坏的文件 acl:get-acl path_to_file_with_known_good_acl | set-acl -path path_to_corrupt_file
答案3
对我来说,这是双重麻烦:非规范 ACL + 为 NULL SID 声明的错误规则(WTH?)。我认为这是由 git 的 cygwin 版本引起的。
无论如何,就我而言,重新申请相同的ACL 没有任何意义:
> 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
因此,我必须明确地从具有正确文件的文件中应用 ACL,正如 @mschneider 所提到的
答案4
使用 Cygwin 时会出现此问题。它尝试在 Windows ACL 之上模拟 POSIX 文件权限。这经常导致非规范 ACL,从而是合法的,但 explorer.exe 无法正确处理。
您可以通过使用“noacl”选项挂载来关闭这个有问题的模拟,例如/etc/fstab
:
none /cygdrive cygdrive binary,noacl,posix=0,user 0 0