Существует ли API для установки ACL NTFS только для определенной папки без пропуска разрешений?

В моей среде у меня есть несколько проектов, которые включают выполнение отчетов аудита 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 по сети.)


person David Archer    schedule 11.06.2009    source источник


Ответы (1)


Нашел ответ в статье MS KB:

Разрешения на доступ к файлам, установленные для файлов и папок с помощью интерфейса служб Active Directory (ADSI) и утилиты набора ресурсов ADSI, ADsSecurity.DLL, не распространяются автоматически вниз по поддереву на существующие папки и файлы.

Причина, по которой вы не можете использовать ADSI для настройки ACE для распространения на существующие файлы и папки, заключается в том, что ADSSecurity.dll использует низкоуровневую функцию SetFileSecurity для установки дескриптора безопасности для папки. Не существует флага, который можно было бы установить с помощью SetFileSecurity для автоматического распространения записей ACE на существующие файлы и папки. Флаг управления SE_DACL_AUTO_INHERIT_REQ установит только флаг SE_DACL_AUTO_INHERITED в дескрипторе безопасности, связанном с папкой.

Поэтому я должен использовать низкоуровневую функцию Win32 API SetFileSecurity (которая помечена как устаревшая в ее запись MSDN), чтобы установить ACL, и это должно предотвратить его автоматическое стекание вниз.

Конечно, я скорее вырву себе глаза ложкой, чем попытаюсь P/Invoke использовать какой-нибудь устаревший Win32 API со всеми его недостатками, так что в конечном итоге я могу просто использовать старый инструмент NT4 под названием FILEACL, который похож на CACLS, но имеет возможность использовать API SetFileSecurity, поэтому изменения не распространяются автоматически.

person David Archer    schedule 11.06.2009