Управление NTFS разрешениями на папках файлового сервера иногда может быть довольно утомительной задачей. Неосторожное внесение изменений на верхнем (корневом) уровне каталога может привести к неожиданным результатам, когда будут принудительно изменены индивидуальные разрешения на файлах и каталогов более низкого уровня. Перед существенным изменением разрешений (переносе, обновлении ACL, миграции ресурсов) на NTFS папке (общей сетевой папке) желательно иметь под рукой резервную копию старых разрешений, которая позволит вернуться к исходным настройкам или хотя бы уточнить старые права доступа на конкретный файл или каталог.
Для экспорта/ импорта текущих NTFS разрешений каталога можно воспользоваться утилитой icacls, которая включена в состав Windows. Утилита используется для получения и изменения списков управления доступами (ACL) на объекты файловой системы.
Чтобы получить все ACL для конкретной папки и вложенных каталогов и файлов и сохранить их в текстовый файл, нужно выполнить команду
icacls g:\veteran /save veteran_ntfs_perms.txt /t /c
Файл с правами доступа по-умоланию сохраняется в текущую папку пользователя.
В зависимости от количества файлов и папок, процесс экспорта разрешений может занять довольно продолжительное время. После окончания выполнения команды отобразится статистика о количестве обработанных и пропущенных файлов.
Successfully processed 3001 files; Failed processing 0 files
Откроем файл veteran_ntfs_perms.txt с помощью любого текстового редактора. Как вы видите, он содержит полный список папок и файлов в каталоге, и для каждого указаны текущие разрешения в формате SDDL (Security Descriptor Definition Language).
К примеру, текущие NTFS разрешения на корень папки у нас такие:
Данная строка описывает доступ для нескольких групп или пользователей. Мы не будем подробно углубляться в SDDL синтаксис (при желании справку по нему можно найти на MSDN). Мы для примера разберем небольшой кусок SDDL, выбрав только одного субъекта:
(A;OICI;FA;;;S-1-5-21-2340243621-32346796122-2349433313-24109193)
A – тип доступа (Allow)
OICI – флаг наследования (OBJECT INHERIT+ CONTAINER INHERIT)
FA – тип разрешения (SDDL_FILE_ALL – все разрешено)
S-1-5-21-2340243621-32346796122-2349433313-24109193 – SID учетной записи или группы в домене, для которой заданы разрешения. Чтобы преобразовать SID в имя учетной записи или группы, воспользуемся командой:
$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-21-2340243621-32346796122-2349433313-24109193")
$objUser = $objSID.Translate( [System.Security.Principal.NTAccount])
$objUser.Value
Или командами Get-ADUser -Identity SID или Get-ADGroup -Identity SID
Таким образом, мы узнали, что пользователь corp\dvivan обладал полными правами (Full Control) на данный каталог.
Чтобы автоматически выставить NTFS решения на объекты в данном каталоге в соответствии со значениями, сохраненными в файле резервной копии, выполните команду:
icacls g:\ /restore veteran_ntfs_perms.txt /t /c
По окончанию восстановления разрешений также отобразится статистика о количестве обработанных файлов.
Если не нужно специальных «извращений» с правами, то можно воспользоваться и предыдущей, более простой и удобной утилитой — cacls.exe, которая все еще входит в состав Windows
Возможно ее вывод разрешений и проще чем у icacls, но вот экспорт, импорт разрешений и рекурсию она все же не поддерживает.
И да, я же написал
«Если не нужно специальных «извращений» с правами»
cacls.exe освоить в разы проще/ Правд. если дружишь с правильным текстовым редактором, а не с ГУЁвым.
Экспорт/Импорт — в чем проблема?
Экспорт — переадресация вывода в файл
Импорт — запуск bat-ника после обработки в FAR (любом редакторе с макросами)
Правда сегодняшние «новички» они все больше «мышиные» (ГУЁ-вые) пользователи 🙂 А не админы 🙂
+100500
Админ обязан уметь писать батники любой сложности.
А уж из регулярной структуры, которую выдает cacls, слепить батник в FAR’е, с использованием макросов, проще простого
Спасибо за статью.
Вопрос — прокатал процедуру на одном из своих фс. из 1,5 млн. файлов около 1600 в ошибке. Как можно узнать что это за файлы?
Утилита ICACLS выводит довольно подробный лог. Добавьте атрибут /q (не будут выводится сообщения об успешных операциях) и перенаправьте вывод в текстовый файл:
icacls D:\Share /save c:\ps\share_ntfs_perms.txt /t /c /q >>c:\ps\icacls.log
Спасибо. Помогло.
А что если путь к файлу превышает 256 символов, как обойти ограничение?
Основные методы обхода ограничения 256 символов описаны здесь: https://winitpro.ru/index.php/2014/11/12/kak-udalit-fajl-s-dlinoj-puti-bolee-260-simvolov/
Вероятно в вашем случае проще реализовать через mklink или
Subst
+ в Windows 10 вроде хотели отключить данное ограничеие
https://winitpro.ru/index.php/2016/06/10/kak-v-windows-10-otklyuchit-ogranichenie-na-dlinu-puti-v-260-simvolov/
Строить фалйовое хранилище на Windows 10 …. О! Это что-то запредельное 🙂 Поэтому отключили там ограничение или нет, не так существенно. 🙂
Жаль у icacls не хватает одного ключа. Сохранять разрешения только для папок. Файлы, то так и так вложенные получать теже самые разрешения, что и у их папки. Я не быру в расчет «странные» разрешения на файл.папки внутри папки, отличные от нее самой (кроме прав на корневую)
А старый вариант cacls не умеет ходить по вложенным папкам.
В итоге выкручиваемся используя оба средства 🙂