Для управления NTFS разрешениями в Windows можно использовать встроенную утилиту iCACLS. Утилита командной строки icacls.exe позволяет получить или изменить списки управления доступом (ACL — Access Control Lists) на файлы и папки на файловой системе NTFS. В этой статье мы рассмотрим полезные команды управления ntfs разрешениями в Windows с помощью icacls.
Просмотр и изменения NTFS прав на папки и файлы с помощью icacls
Текущие права доступа к любому объекту на NTFS томе можно вывести так:
icacls 'C:\Share\Veteran\'
Команда вернет список пользователей и групп, которым назначены права доступа. Права указываются с помощью сокращений:
- F – полный доступ
- M – изменение
- RX – чтение и выполнение
- R – только чтение
- W – запись
- D – удаление
Перед правами доступа указаны права наследования (применяются только к каталогам):
- (OI)— наследование объектами
- (CI)— наследование контейнерами
- (IO)— только наследование
- (I)– разрешение унаследовано от родительского объекта
С помощью icacls вы можете изменить права доступа на папку.
Чтобы предоставить группе fs01_Auditors домена resource права чтения и выполнения (RX) на каталог, выполните:
icacls 'C:\Share\Veteran\' /grant resource\fs01_Auditors:RX
Чтобы удалить группу из ACL каталога:
icacls 'C:\Share\Veteran\' /remove resource\fs01_Auditors
С помощью icacls вы можете включить наследование NTFS прав с родительского каталога:
icacls 'C:\Share\Veteran\' /inheritance:e
Или отключить наследование с удалением всех наследованных ACEs:
icacls 'C:\Share\Veteran\' /inheritance:r
Также icacls можно использовать, чтобы изменить владельца файла или каталога:
icacls 'C:\Share\Veteran\' /setowner resource\a.ivanov /T /C /L /Q
Бэкап (экспорт) текущих NTFS разрешений каталога
Перед существенным изменением разрешений (переносе, обновлении ACL, миграции ресурсов) на NTFS папке (общей сетевой папке) желательно создать резервную копию старых разрешений. Данная копия позволит вам вернуться к исходным настройкам или хотя бы уточнить старые права доступа на конкретный файл/каталог.
Для экспорта/импорта текущих NTFS разрешений каталога вы также можете использовать утилиту icacls. Чтобы получить все ACL для конкретной папки (в том числе вложенных каталогов и файлов), и экспортировать их в текстовый файл, нужно выполнить команду
icacls 'C:\Share\Veteran' /save c:\ps\veteran_ntfs_perms.txt /t /c
В зависимости от количества файлов и папок, процесс экспорта разрешений может занять довольно продолжительное время. После окончания выполнения команды отобразится статистика о количестве обработанных и пропущенных файлов.
Successfully processed 3001 files; Failed processing 0 files
Откройте файл veteran_ntfs_perms.txt с помощью любого текстового редактора. Как вы видите, он содержит полный список папок и файлов в каталоге, и для каждого указаны текущие разрешения в формате SDDL (Security Descriptor Definition Language).
К примеру, текущие NTFS разрешения на корень папки такие:
D:PAI(A;OICI;FA;;;BA)(A;OICIIO;FA;;;CO)(A;OICI;0x1200a9;;;S-1-5-21-2340243621-32346796122-2349433313-23777994)(A;OICI;0x1301bf;;;S-1-5-21-2340243621-32346796122-2349433313-23777993)(A;OICI;FA;;;SY)(A;OICI;FA;;;S-1-5-21-2340243621-32346796122-2349433313-24109193)S:AI
Данная строка описывает доступ для нескольких групп или пользователей. Мы не будем подробно углубляться в SDDL синтаксис (при желании справку по нему можно найти на MSDN, или вкратце формат рассматривался в статье об управлении правами на службы Windows). Мы для примера разберем небольшой кусок 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
С помощью ранее созданного файла veteran_ntfs_perms.txt вы можете восстановить NTFS разрешения на каталог. Чтобы задать NTFS права на объекты в каталоге в соответствии со значениями в файле с резервной копией ACL, выполните команду:
icacls C:\share /restore c:\PS\veteran_ntfs_perms.txt /t /c
По окончанию восстановления разрешений также отобразится статистика о количестве обработанных файлов:
Successfully processed 114 files; Failed processing 0 files
С учетом того, что в резервной копии ACL указываются относительные, а не абсолютные пути к файлам, вы можете восстановить разрешения в каталоге даже после его перемещения на другой диск/каталог.
Сброс NTFS разрешений в Windows
С помощью утилиты icacls вы можете сбросить текущие разрешения на указанный файл или каталог (и любые вложенные объекты):
icacls C:\share\veteran /reset /T /Q /C /RESET
Данная команда включит для указанного объекта наследование NTFS разрешений с родительского каталога, и удалит любые другие права.
Копирование NTFS прав между папками
Вы можете использовать текстовый файл с резервной копией ACL для копирования NTFS разрешений с одного каталога на другой/
Сначала создайте бэкап NTFS разрешений корня папки:
icacls 'C:\Share\Veteran' /save c:\ps\save_ntfs_perms.txt /c
А замет примените сохраненные ACL к целевой папке:
icacls e:\share /restore c:\ps\save_ntfs_perms.txt /c
Это сработает, если исходная и целевая папка называются одинаково. А что делать, если имя целевой папки отличается? Например, вам нужно скопировать NTFS разрешения на каталог E:\PublicDOCS
Проще всего открыть файл save_ntfs_perms.txt в блокноте и отредактировать имя каталога. С помощью функции Replace замените имя каталога Veteran на PublicDOCS.
Затем импортируйте NTFS разрешения из файла и примените их к целевому каталогу:
icacls e:\ /restore c:\ps\save_ntfs_perms.txt /c
Get-Acl -Path 'C:\Share\Veteran' | Set-Acl -Path 'E:\PublicDOCS'
Если не нужно специальных «извращений» с правами, то можно воспользоваться и предыдущей, более простой и удобной утилитой — 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 не умеет ходить по вложенным папкам.
В итоге выкручиваемся используя оба средства 🙂
icacls не сохраняет ВЛАДЕЛЬЦЕВ, банально в SDDL-строках отсутствует O:S-1-……… как можно заметить, а при /restore тогда «Отказано в доступе!». А с cacls и подавно…
Когда в свойствах файла во вкладке Безопасность такое:
«У вас нет разрешения на просмотр текущих разрешений для этого объекта»;
а так же в колонке «Владелец» (System.FileOwner или {9B174B34-40FF-11D2-A27E-00C04FC30871},4) проводника пустое значение напротив объекта — короче говоря, нет прав READ_CONTROL (RC или 0x00020000) — придётся вслепую менять владельца (чтобы сохранить разрешения), если кнопка [Изменить] так же недоступна (даже
icacls …… /grant *S-1-5-32-544:(RC)
не удалось обработать ……cacls …… /E /G Администраторы:F
— Отказано в доступе).А если [Изменить] разрешения всё-таки позволяет (не показывая владельца), то тут уже сразу сужается круг предположительного владельца.
А ещё, как же «обязательная метка уровня неприкасаемости» (Mandatory Integrity Label)?
Интересная штука SDDLGen.exe с SDK-пакета — можно загрузить ключ реестра/папку и увидеть не только владельца (если запущено с соотетствующими правами) и аудиты, но даже группу и «уровни целостности»! Что-то мне захотелось увидеть такую колонку в проводнике…
Помимо папок/файлов/ключей реестра хотелось бы ещё управлять параметрами безопасности
• журналов = wevtutil set-log … /channelaccess:…;
• служб = sc sdshow | sc sdset (или только задавать .inf-политикой в MMC\Шаблоны безопасности\Системные службы) и устройств;
ну и хранящихся в REG_BINARY / REG_NONE такие параметры безопасности:
‼ «Службы компонентов\Настройки DCOM\» [HKCR\AppID\{……}\]
LaunchPermission и AccessPermission; хорошо, что «Разрешения на изменение настроек» = Power
sHellGet-ACL -Path hklm:\software\classes\appid\{……} | format-list
;‼ «Поставщики отслеживания» и сами «Группы сборщиков данных» (что в perfmon.msc) — [HKLM\SYSTEM\CurrentControlSet\Control\WMI\Security];
• принтеры [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers];
• общие файлы [HKLM\SYSTEM\CurrentControlSet\services\LanmanServer\Shares\Security];
думаю, это ещё далеко не всё перечисленное, ведь в реестре могут содержаться и любые другие двоичные параметры, значения которых напоминают ACE`шки… А вот «Назначение прав пользователя» (что с secpol.msc) совсем на ACE не похоже [HKLM\SECURITY\Policy\Accounts\…\Privilgs] — тут уже лучше .inf файлом в секции [Privilege Rights] (что даже удобнее любого другого редактора – главное не промахнуться и подписать нужный SID пользователя/группы в нужную Se…привилегию, а то можно случайно воткнуть в SeDenyInteractiveLogonRight вместо SeDenyRemoteInteractiveLogonRight)…
Хотя вот с принтерами и общими файлами можно было и в SubInACL…
Кстати, в
%AllUsersProfile%\Microsoft\Windows\WER\ReportQueue
приписана «недобавляемая с GUI» учётная записьNT AUTHORITY\ЗАПИСЬ ОГРАНИЧЕНА
(даже с *S-1-5-33 не прокатывает)! Но хуже всего, что для её восстановления в Системном мониторе\Группы сборщиков данных\Сеансы отслеживания событий запуска нужно:а) сохранять весь EventLog-Application например в XML`ку и исправить единственную SDDL-строку <Security>
O:BAG:BAD:(A;;0x200;;;SY)(A;;0x200;;;BA)(A;;0x200;;;SO)(A;;0x200;;;IU)(A;;0x200;;;SU)(A;;0x200;;;S-1-5-3)(A;;0x200;;;WR)(A;;0xffff;;;SY)(A;;0xff7f;;;BA)(A;;0xffff;;;S-1-5-80-880578595-1860270145-482643319-2788375705-1540778122)
</Security>, где A;;0x200;;;WR и есть та самая ЗАПИСЬ ОГРАНИЧЕНА с разрешением TRACELOG_LOG_EVENTб) Исправлять конкретный REG_BINARY в HKLM\SYSTEM\CurrentControlSet\WMI\Security (расшифровку нужного ID в соседнем ключе; а имена вписанных туда Event Trace Providers в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers)
Забыла как сделать чтоб владение и права передавались тому кто запустит батник?
Уважаемые коллеги, подскажите как быть. Голову себе сломал уже. Может у кого были подобные ситуации. Суть проблемы: был старый файловый сервер на 2003 в домене с кучей настроенных прав ntfs. Было решено все это дело перенести на новый сервер 2022 (тоже в домене). Что бы не мучаться с переносом данных и прав ntfs — просто подключили диски от старого сервера к новому. Все ок, шары работают, права на каталоги по группам AD на месте. Кроме одного НО. На старом сервере владельцем данных с полными правами была локальная группа server_OLD\Administrators. На новом сервере (видимо по sid группы) назначены точно такие же права локальной группе server_NEW\Administrators. Вроде все хорошо. Только пользователи включенные в локальную группу server_NEW\Administrators не имеют доступа к каталогам и данным в них. Такой доступ есть только у встроенной учетной записи .\Администратор. В какую сторону копать? Рад буду любой помощи.
Судя по описанию это так ведет себя UAC. Попробуйте просмотреть содержимое каталога по UNC пути \\server1\c$\share\
Также при локальном доступе можно запускать проводник с правами администратора:
https://winitpro.ru/index.php/2016/07/28/zapusk-provodnika-windows-ot-imeni-administratora/
Добрьій день. Есть Windows Server 2019r2 где установленьі google drive и disc O. После перезапуска им дается сетевой и полньій доступ. Чтоб при перезапуске не повторять постоянно одни и те же действия, хочу организовать подобное в bat файле и каким-то образом добавить его в автозагрузку. Как в таком случае бьіть,? За ранее благодарю.
Кто дает им доступ и куда? файервол, ntfs права?
Батник в автозагрузку добавить элементарно.
Я просто правой кнопкой — Свойства — Общий доступ и там даю доступ по сети и вьіставляю полньій доступ. К ним подлючение из внешней сети
Это через PowerShell автоматизируется совсем несложно:
1) Управление сетевыми папками с помощью PowerShell:
https://winitpro.ru/index.php/2022/03/14/upravlenie-setevymi-papkami-smb-powershell/
2) Управление ntfs правами из powershell:
https://winitpro.ru/index.php/2019/04/22/ntfs-razresheniya-na-papki-powershell/
Добрый день, спасибо за статью, пишите еще!
Вопрос, есть ли возможность рекурсивно скопировать права на директории от одной группы, для другой?
Пока что идея появилась такая:
icacls D:\Shared\123 /save D:\shared\123.txt /t /c
получаем список, находим в ней нужный нам блок. пример:(A;OICIID;0x1200a9;;;S-1-5-21-3570115663-1581718704) добавляем в конец строки нужный нам блок (D;OICIID;FA;;;S-1-5-21-3229325608-4126030483)
выполняем icacls D:\Shared\ /restore D:\shared\123.txt /t /c
И все работает. Но как быть, если таких строк несколько миллионов?
(В примере не полные SID групп)
Скопировать ACL:
Get-Acl D:\Shared\123 | Set-Acl D:\Shared\abc
https://winitpro.ru/index.php/2019/04/22/ntfs-razresheniya-na-papki-powershell/