Существует ли API для установки списков ACL NTFS только для определенной папки без перенаправления разрешений? - PullRequest
1 голос
/ 11 июня 2009

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

1 Ответ

0 голосов
/ 11 июня 2009

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

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

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

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

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

...