Memperbaiki "Daftar kontrol akses ini tidak dalam bentuk kanonik" kesalahan dari baris perintah


9

Pada beberapa workstation pengembang kami, kami telah mendapatkan yang ditakuti "Daftar kontrol akses ini tidak dalam bentuk kanonik dan karena itu tidak dapat dimodifikasi." kesalahan saat kami mencoba dan mengatur izin pada folder tertentu. Kami belum dapat menemukan apa yang merusak ACL ini.

Saat ini, satu-satunya cara saya tahu untuk memperbaikinya adalah dengan mengklik kanan folder / file yang rusak, pilih Properties dan klik tab Security. Windows kemudian akan melihat korupsi dan menawarkan untuk memperbaikinya. Saya tidak suka ini karena ini manual dan mengharuskan pengguna untuk melakukan investigasi untuk mengetahui folder / file apa yang rusak.

Apakah ada skrip atau program di suatu tempat yang akan melakukan ini secara otomatis? Saya melihat bahwa icaclsmemiliki /verifyparameter, tetapi itu hanya menunjukkan kepada saya bahwa ACL pada file / folder rusak. Itu tidak menawarkan untuk memperbaiki apa pun.

Jawaban:


6

Anda bisa mencoba menggunakan skrip PowerShell sederhana untuk menimpa file currupt acl dengan acl file lain: get-acl path_to_file_with_known_good_acl | set-acl -path path_to_corrupt_file


The jawaban lain menunjukkan bahwa Anda hanya bisa melakukan get-acl path_to_corrupt_file | set-acl -path ptah_to_corrupt_file.
binki

5

Saya akhirnya dapat menemukan perbaikan otomatis untuk ini. Ketika Anda memanggil Set-Aclcmdlet PowerShell , itu akan memesan ulang ACL dengan benar:

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

Tentu saja, ini bisa menjadi induk dari direktori yang kacau, jadi Anda harus melakukan beberapa lintasan untuk menemukan pelakunya. Gunakan icacls C:\Path\To\Item\With\Suspect\CL /verifyuntuk mencari tahu apakah ada sesuatu yang perlu diperbaiki.

Di lingkungan kita, Cygwin adalah penyebabnya: ketika membuat direktori, ia suka memberikan izin gaya POSIX pada mereka, alih-alih mengandalkan Windows untuk mengelola keamanan sistem file.


1
Terima kasih untuk triknya. Saya memiliki masalah hari ini dan menulis PowerShell kecil untuk mengotomatiskan perbaikannya: gist.github.com/vbfox/8fbec5c60b0c16289023
Julien Roncaglia

1

Bagi saya ada masalah ganda: ACL + aturan kan-kanonik non-kanonik dideklarasikan untuk NULL SID (WTH?). Saya menyarankan itu disebabkan oleh versi cygwin dari git.

Bagaimanapun, dalam kasus saya menerapkan kembali ACL yang sama tidak masuk akal:

> 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

Jadi saya harus secara eksplisit menerapkan ACL dari file yang memiliki yang benar, seperti yang disebutkan oleh @mschneider


1

icacls juga dapat memperbaikinya:

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

Perintah praktis lainnya, setara dengan 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. Di IIS klik kanan folder dengan masalah
  2. Edit Izin ...
  3. Pilih tab Keamanan
  4. Klik tombol 'Edit' dan simpan (ini tampaknya memesan ulang acl)
  5. Konfirmasikan semua Munculan

Solusi ini sudah disebutkan dalam pertanyaan. Namun penulis meminta solusi otomatis.
scai

Juga, ini adalah izin NTFS, jadi IIS tidak terlibat.
bit cipratan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.