从命令行修复“此访问控制列表不属于规范格式”错误

从命令行修复“此访问控制列表不属于规范格式”错误

在我们的几个开发人员工作站上,当我们尝试设置某些文件夹的权限时,我们一直收到可怕的“此访问控制列表不是规范格式,因此无法修改。”错误。我们无法找出是什么破坏了这些 ACL。

目前,我知道修复它的唯一方法是右键单击损坏的文件夹/文件,选择“属性”,然后单击“安全”选项卡。然后 Windows 会注意到损坏并提出修复建议。我不喜欢这种方法,因为它是手动的,需要用户进行一些调查才能找出哪个文件夹/文件已损坏。

是否有某个脚本或程序可以自动执行此操作?我看到它icacls有一个/verify参数,但它只显示文件/文件夹上的 ACL 已损坏。它不提供任何修复。

答案1

我终于找到了一个自动修复方法。当您调用 PowerShell 的Set-Aclcmdlet 时,它将正确地重新排序 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

相关内容