В моей среде у меня есть несколько проектов, которые включают выполнение отчетов аудита NTFS ACL и различные действия по очистке ACL на нескольких файловых серверах. Есть две основные причины, по которым я не могу выполнять эти действия локально на серверах:
1) У меня нет локального доступа к серверам, так как они фактически принадлежат и управляются другой компанией.
2) Это серверы SNAP NAS, работающие под управлением модифицированной ОС Linux (называемой GuardianOS ), так что даже если бы я мог получить локальный доступ, я не уверен в наличии инструментов для выполнения нужных мне операций.
С этим я закончил тем, что развернул свой собственный инструмент отчетности аудита ACL, который рекурсивно спускался бы по файловой системе, начиная с указанного пути верхнего уровня, и выдавал бы отчет HTML обо всех группах/пользователях, с которыми он столкнулся в ACL, как а также показ изменений в разрешениях по мере спуска по дереву. При разработке этого инструмента я обнаружил, что сетевые накладные расходы были наихудшей частью выполнения этих операций, и за счет многопоточности процесса я мог добиться значительно большей производительности.
Тем не менее, я все еще застрял в поиске хорошего инструмента для выполнения модификаций и очистки ACL. Ваши стандартные готовые инструменты (cacls, xcacls, Explorer) кажутся однопоточными и испытывают значительное снижение производительности при работе в сети. Я посмотрел на создание своей собственной программы настройки ACL, которая является многопоточной, но единственный API, с которым я знаком, — это материал .NET FileSystemAccessRule, и проблема в том, что если я устанавливаю разрешения для папки, она автоматически хочет «поток» разрешения вниз. Это вызывает проблему, потому что я хочу сделать «поток» самостоятельно, используя многопоточность.
Я знаю, что NTFS «позволяет» унаследованным разрешениям быть несогласованными, потому что я видел, как папка/файл перемещается на одном томе между двумя родительскими папками с разными унаследованными разрешениями, и старые разрешения сохраняются как «унаследованные».
Вопросы
1) Есть ли способ установить ACL, который применяется к текущей папке и всем дочерним элементам (ваш стандартный ACL «Применяется к файлам, папкам и подпапкам»), но не должен автоматически стекать к дочерним объектам? По сути, я хочу иметь возможность сказать Windows, что «Да, этот ACL должен применяться к дочерним объектам, но пока просто установите его непосредственно для этого объекта».
Просто чтобы было предельно ясно, я знаю о параметрах ACL для применения "только к этой папке", но тогда я теряю наследование, которое является требованием, поэтому этот параметр не подходит для моего варианта использования.
2) Кто-нибудь знает какие-либо хорошие алгоритмы или методологии для выполнения модификаций ACL в многопоточном режиме? Я чувствую, что любой рекурсивный обход файловой системы должен работать в теории, особенно если вы просто определяете новый ACL для папки верхнего уровня и просто хотите «очистить» все подпапки. Вы бы поставили новый ACL на верхнем уровне, а затем рекурсивно удалили все явные ACE, а затем «передали бы» унаследованные разрешения вниз.
(К вашему сведению, этот вопрос частично продублирован от ServerFault, так как это действительно проблема системного администратора и программирования.Что касается другого вопроса, я спрашивал, знает ли кто-нибудь какие-либо инструменты, которые могут выполнять быструю настройку ACL по сети.)