Answers:
我终于能够找到针对此问题的自动修复程序。当您调用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来管理文件系统安全性。
对我来说,这有双重麻烦:非规范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正确的文件
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
使用Cygwin时出现此问题。它尝试在Windows ACL上模拟POSIX文件权限。这通常会导致非规范的ACL,这是合法的,但explorer.exe无法正确处理。
您可以通过安装“ noacl”选项来关闭有问题的仿真,例如/etc/fstab
:
none /cygdrive cygdrive binary,noacl,posix=0,user 0 0
get-acl path_to_corrupt_file | set-acl -path ptah_to_corrupt_file
。