Исправление ошибок «Этот список контроля доступа не в канонической форме» из командной строки

9

На нескольких наших рабочих станциях для разработчиков мы получали страшные сообщения: «Этот список контроля доступа не имеет канонической формы и поэтому не может быть изменен». ошибка, когда мы пытаемся установить права на определенные папки. Мы не смогли выяснить, что портит эти ACL.

Прямо сейчас единственный известный мне способ исправить это - щелкнуть правой кнопкой мыши поврежденную папку / файл, выбрать «Свойства» и перейти на вкладку «Безопасность». Затем Windows заметит коррупцию и предложит ее исправить. Мне не нравится это, потому что это руководство и требует от пользователя провести некоторые исследования, чтобы выяснить, какая папка / файл поврежден.

Есть ли где-нибудь скрипт или программа, которая сделает это автоматически? Я вижу, что у icaclsнего есть /verifyпараметр, но он просто показывает мне, что списки ACL для файла / папки повреждены. Он не предлагает ничего исправить.

забрызганные биты
источник

Ответы:

6

Вы можете попробовать использовать простой сценарий PowerShell для переопределения ACL-файлов с помощью ACL другого файла: get-acl path_to_file_with_known_good_acl | set-acl -path path_to_corrupt_file

mschneider
источник
Другой ответ предполагает , что вы могли бы просто сделать get-acl path_to_corrupt_file | set-acl -path ptah_to_corrupt_file.
Бинки
5

Я наконец смог придумать автоматическое исправление для этого. Когда вы вызываете Set-Aclкомандлет PowerShell , он правильно упорядочивает 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
Жюльен Ронкалья,
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

Поэтому я должен был явно применить ACL из файла, имеющего правильный, как упомянуто @mschneider

oxfn
источник
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

Эта проблема появляется при использовании Cygwin. Он пытается эмулировать права доступа к файлам POSIX поверх списков контроля доступа Windows. Это часто приводит к неканоническим спискам ACL, которые являются законными, но не могут быть исправлены с помощью explorer.exe .

Вы можете отключить эту проблемную эмуляцию, установив опцию «noacl», например, в /etc/fstab:

none /cygdrive cygdrive binary,noacl,posix=0,user 0 0
ManuelAtWork
источник
-1
  1. В IIS щелкните правой кнопкой мыши папку с вопросом
  2. Изменить разрешения ...
  3. Выберите вкладку Безопасность
  4. Нажмите кнопку «Редактировать» и сохраните файл (похоже, для переупорядочения ACL)
  5. Подтвердите все всплывающие окна
Джеймс
источник
Это решение уже упоминалось в вопросе. Однако автор просит автоматического решения.
Scai
Кроме того, это разрешения NTFS, поэтому IIS не участвует.
разбрызганные биты