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


9

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

现在,我知道要修复的唯一方法是右键单击损坏的文件夹/文件,选择“属性”,然后单击“安全性”选项卡。然后,Windows将注意到损坏并提出修复。我不喜欢它,因为它是手动的,并且要求用户进行一些调查以找出损坏的文件夹/文件。

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

Answers:


6

您可以尝试使用简单的PowerShell脚本用另一个文件的acl覆盖当前文件acl: get-acl path_to_file_with_known_good_acl | set-acl -path path_to_corrupt_file


在对方的回答表明,你可以只是做get-acl path_to_corrupt_file | set-acl -path ptah_to_corrupt_file。
— 宾基

5

我终于能够找到针对此问题的自动修复程序。当您调用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来管理文件系统安全性。


1
谢谢你的把戏。我今天遇到了问题,并写了一个小的powershell来自动完成修复:gist.github.com/vbfox/8fbec5c60b0c16289023
— Julien

1

对我来说,这有双重麻烦:非规范ACL +为NULL SID(WTH?)声明了错误规则。我建议这是由cygwin版本的git引起的。

无论如何,就我而言,重新应用相同的 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

因此,我必须从@mschneider提到的文件中正确地应用ACL正确的文件


1

icacls也可以修复它:

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

其他方便的命令,等同于chmod 0777 FILE,chown root 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. 在IIS中,右键单击出现问题的文件夹
  2. 编辑权限...
  3. 选择安全选项卡
  4. 单击“编辑”按钮并保存(这似乎重新排列了ACL)
  5. 确认所有弹出窗口

问题中已经提到了这种解决方案。但是作者要求一种自动解决方案。
— scai 2015年

另外,这些都是NTFS权限,因此不涉及IIS。
— 喷溅的比特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.