Странное поведение /deny DE,W с icacls
У меня есть следующий сценарий, в котором я () применил(DE,W)
запретить доступ к следующей папке тем, кто уже унаследовал разрешения на изменение из родительской папки:
B:\>icacls test_folder
test_folder test_user:(I)(OI)(CI)(M)
admin:(I)(OI)(CI)(M)
B:\>icacls test_folder /deny test_user:(DE,W)
B:\>icacls test_folder
test_folder test_user:(DENY)(W,D)
test_user:(I)(OI)(CI)(M)
admin:(I)(OI)(CI)(M)
Конечным результатом, которого я ожидал, является возможность иметь доступ для чтения/выполнения без возможности удалять/переименовывать папку и добавлять в нее папки/файлы.
Однако результата вообще не было видно. Мне все еще видно(admin
).
Пока я отрицаю толькоDE
однако:
B:\>icacls test_folder
test_folder test_user:(I)(OI)(CI)(M)
admin:(I)(OI)(CI)(M)
B:\>icacls test_folder /deny test_user:(DE)
B:\>icacls test_folder
test_folder test_user:(DENY)(D)
test_user:(I)(OI)(CI)(M)
admin:(I)(OI)(CI)(M)
test_user
смог увидетьtest_folder
. Так как-тоW
вызывает проблему.
Есть идеи, почему это происходит?
1 ответ
Оба и
В частности,
- «Синхронизировать»
(S)
- «Записать данные»
(WD)
- «Добавить данные»
(AD)
- «Пишите советники»
(WEA)
- «Написать атрибуты»
(WA)
Право «Синхронизировать» довольно неясно (и даже не отображается в графическом интерфейсе), но оно необходимо практически для любого полезного доступа к файлу – оно необходимо как для чтения, так и для записи, и поэтому включено в оба « (R)» и «(W)» .
Таким образом, когда вы запрещаете (W) доступ, вы также в конечном итоге отказываетесь от права «Синхронизировать», которое требуется для того, чтобы многие программы вообще работали с файлом.
В документации Microsoft FILE_GENERIC_WRITEпо доступу к файлам также отмечается следующее:
Обратите внимание, что вы не можете использовать ACE с отказом в доступе, чтобы запретить только GENERIC_READ или только GENERIC_WRITE доступ к файлу. Это связано с тем, что для файловых объектов общие сопоставления как для GENERIC_READ, так и для GENERIC_WRITE включают право доступа SYNCHRONIZE. Если ACE отказывает доверенному лицу в доступе GENERIC_WRITE, а доверенное лицо запрашивает доступ GENERIC_READ, запрос завершится неудачей, поскольку запрос неявно включает доступ SYNCHRONIZE, который неявно запрещен ACE, и наоборот. Вместо использования ACE с запрещенным доступом используйте ACE с разрешенным доступом, чтобы явно разрешить разрешенные права доступа.
Если вам необходимо использовать «запретить» ACE, вам придется индивидуально запретить четыре других права, которые включает в себя (W), т.е.
Старший
PS C:\> icacls test /grant "user:(OI)(CI)(R,X)" PS C:\> icacls test /deny "user:(OI)(CI)(W)" PS C:\> Тест Get-Acl | эт Доступ: FOO\user Запретить запись, Синхронизировать NT AUTHORITY\SYSTEM Разрешить FullControl BUILTIN\Администраторы разрешают полный контроль FOO\user Разрешить ReadAndExecute, Синхронизировать PS C:\> тест cacls C:\test FOO\user (OI)(CI)(DENY)(специальный доступ:) СИНХРОНИЗИРОВАТЬ FILE_WRITE_DATA FILE_APPEND_DATA FILE_WRITE_EA FILE_WRITE_ATTRIBUTES FOO\user:(OI)(CI)(DENY)(специальный доступ:) УДАЛИТЬ СИНХРОНИЗИРОВАТЬ ВСТРОЕН\Администраторы:(OI)(CI)F NT AUTHORITY\SYSTEM:(OI)(CI)F