Войти

Показать полную графическую версию : [решено] парсинг NTFS разрешений каталога и подкаталогов


yanus74
23-07-2013, 16:25
Здравствуйте!
Появилась необходимость провести аудит файловых ресурсов.
Для этих целей подошел бы скрипт, а вот тут я не силен, и прошу помощи у сообщества.
Задача стоит такая
входные данные: путь к папке с которой необходимо собрать данные ( что-то вроде c:\моя_шара)
а на выходе получить txt файл вот с таким результатом:

1 имя папки
нтфс доступ:
перечисление
1.2 имя папки
нтфс доступ:
перечисление
1.2 имя папки
нтфс доступ:
1.2.3 имя папки
нтфс доступ:
перечисление
1.2.3 имя папки
нтфс доступ:
перечисление
1.2.3.4 имя папки
нтфс доступ:
перечисление
1.2.3.4.5 имя папки
нтфс доступ:
перечисление
1.2.3.4 имя папки
нтфс доступ:
перечисление
1.2.3 имя папки
нтфс доступ:
перечисление


*разделитель "табуляция"
**"1.*" - уровень папки от родительской

можно уровень папки заменить на полный путь ^.^

Если есть другой способ получить желаемое, рад буду услышать совет.
Заранее спасибо за помощь!

exo
23-07-2013, 16:35
именно скриптом нужно? или подойдёт программа AccessEnum (http://technet.microsoft.com/ru-ru/sysinternals/bb897332.aspx)

yanus74
23-07-2013, 17:18
exo, подойдет любой способ, главное на выходе получить данные в текстовом виде, так их обрабатывать будет проще.
Спасибо за ссылку на программу, сейчас испробую ее.

yanus74
23-07-2013, 17:33
exo, программа хорошая, но выводит только разрешения на чтение/запись.
а например наследуется ли эти разрешения, она не говорит.
охота получить исчерпывающию информацию, как например после выполнения программы icacls:
C:\Users\support_921>icacls "F:\Документы\ПГ ЗМЗ\Управление персоналом"
F:\Документы\ПГ ЗМЗ\Управление персоналом OFFICE\anu:(CI)(RX)
OFFICE\Документы Служба персонала:(OI)(CI)(M)
OFFICE\dds:(OI)(CI)(M)
OFFICE\fdv:(OI)(CI)(M)
OFFICE\bold:(OI)(CI)(RX)
NT AUTHORITY\Прошедшие проверку:(I)(CI)(RX)
OFFICE\Domain Admins:(I)(OI)(CI)(F)
OFFICE\psd:(I)(OI)(CI)(M)

Успешно обработано 1 файлов; не удалось обработать 0 файлов

yanus74
24-07-2013, 08:23
я тут подумал, примерно должен быть такой алгоритм:
1. сохраняем список всех каталогов в txt файл: dir /s /b /a:d >dir.txt
2. открываем тхт файл
3. узнаем сколько строк, и пишем в переменную
4. цикл от 1 до N
5. в txt файл result записываем строку N
6. в цикле считываем N строку и подставляем ее в команду icacls, результат записывает в тхт файл result

вопросы по 2,3 ( как реализовать) и по 5,6 пунктам ( конкретней, как указать N строку)

Anonymоus
24-07-2013, 10:59
yanus74, временные файлы для списка, подсчёт строк - зачем так переусложнять? Всё одним циклом делается.
@Echo Off
Set BaseDir=C:\Temp
Set Result=result.txt
:: Пишем результат для корневой директории
icacls "%BaseDir%">"%Result%"
:: Пишем результат для всех вложенных директорий
For /F "delims=" %%A In ('Dir "%BaseDir%" /A:D /B /S') Do (
icacls "%%~A">>"%Result%"
)

yanus74
24-07-2013, 15:02
Anonymоus, спасибо!
но тут такая проблемка проявилась, результаты работы скрипта, не получиться парсить автоматически.
дело в том, что результат выполнения icacls выглядит таким образом:
d:\шара Все:(OI)(CI)(F)
между d:\шара и Все:(OI)(CI)(F) есть пробел.
а т.к. пробелы также присутствую и в названиях каталогов, то из-за этого не получится корректно разделить путь и права доступа.
я тут подумал, что можно как-то модифицировать скрипт.
что бы в тхт файл result записывался путь каталога из %%A, а в результате вывода icacls вырезать этот путь.
Можете модифицировать скрипт, с учетом этого момента?)
Спасибо вам за помощь!

Anonymоus
24-07-2013, 21:44
yanus74, думаю, этот вариант вам пригодится больше.
@Echo Off
SetLocal EnableDelayedExpansion

Set BasePath=C:\Temp
Set Result=result.txt

:: Перезаписываем лог
Echo [%Date% %Time%]: Started>"%Result%"
Echo.>>"%Result%"
:: Работа с корневой директорией
Call :icacls-fmt "%BasePath%"
:: Обход всех вложенных директорий
For /F "delims=" %%A In ('Dir "%BasePath%" /A:D /B /S') Do (
Call :icacls-fmt "%%~A"
)
Pause&Exit /B

:icacls-fmt
Echo [%~1]
:: Получаем разрешения, игнорируя последнюю строку о удачном завершении
For /F "delims=" %%A In ('icacls "%~1"^|Find /V ";" ') Do (
Set MarginLeft=&&Set $Path=%~1&&Set Data=%%A
:: Убираем лишний отступ с начала строк
Call :fmt $Path
:: Быстрая, нересурсозатратная в отличии от вызова find, проверка на наличие вхождения пути
If Not "!Data:%~1=!"=="!Data!" (
:: Пишем путь и исправленную строку
Echo [%~1]>>"%Result%"
Echo !Data:%~1=!>>"%Result%"
) Else (
:: Не трогаем строку, выводим как есть
Echo !Data!>>"%Result%"
)
)
Echo.>>"%Result%"
Exit /B

:fmt
:: Быстрый подсчёт длины строки
Set StrLen.S=A!%~1!
Set StrLen=0
For /L %%P In (12,-1,0) Do (
Set /A "StrLen|=1<<%%P"
For %%I In (!StrLen!) Do If "!StrLen.S:~%%I,1!"=="" Set /A "StrLen&=~1<<%%P"
)
:: Убираем отступ
For /L %%B In (1,1,!StrLen!) Do (Set MarginLeft= !MarginLeft!)
Set Data=!Data:%MarginLeft%=!
Exit /B
Лог тогда получается вот в таком формате:
[24.07.2013 20:43:12,19]: Started

[C:\Temp]
BUILTIN\Администраторы:(I)(F)
BUILTIN\Администраторы:(I)(OI)(CI)(IO)(F)
NT AUTHORITY\система:(I)(F)
NT AUTHORITY\система:(I)(OI)(CI)(IO)(F)
BUILTIN\Пользователи:(I)(OI)(CI)(RX)
NT AUTHORITY\Прошедшие проверку:(I)(M)
NT AUTHORITY\Прошедшие проверку:(I)(OI)(CI)(IO)(M)

[C:\Temp\fontconfig]
BUILTIN\Администраторы:(I)(F)
BUILTIN\Администраторы:(I)(OI)(CI)(IO)(F)
NT AUTHORITY\система:(I)(F)
NT AUTHORITY\система:(I)(OI)(CI)(IO)(F)
BUILTIN\Пользователи:(I)(OI)(CI)(RX)
NT AUTHORITY\Прошедшие проверку:(I)(M)
NT AUTHORITY\Прошедшие проверку:(I)(OI)(CI)(IO)(M)

[C:\Temp\Low]
BUILTIN\Администраторы:(I)(F)
BUILTIN\Администраторы:(I)(OI)(CI)(IO)(F)
NT AUTHORITY\система:(I)(F)
NT AUTHORITY\система:(I)(OI)(CI)(IO)(F)
BUILTIN\Пользователи:(I)(OI)(CI)(RX)
NT AUTHORITY\Прошедшие проверку:(I)(M)
NT AUTHORITY\Прошедшие проверку:(I)(OI)(CI)(IO)(M)
Обязательная метка\Низкий обязательный уровень:(OI)(CI)(NW)

[C:\Temp\mozilla-temp-files]
BUILTIN\Администраторы:(I)(F)
BUILTIN\Администраторы:(I)(OI)(CI)(IO)(F)
NT AUTHORITY\система:(I)(F)
NT AUTHORITY\система:(I)(OI)(CI)(IO)(F)
BUILTIN\Пользователи:(I)(OI)(CI)(RX)
NT AUTHORITY\Прошедшие проверку:(I)(M)
NT AUTHORITY\Прошедшие проверку:(I)(OI)(CI)(IO)(M)

[C:\Temp\pdk-Inquisitor]
BUILTIN\Администраторы:(I)(F)
BUILTIN\Администраторы:(I)(OI)(CI)(IO)(F)
NT AUTHORITY\система:(I)(F)
NT AUTHORITY\система:(I)(OI)(CI)(IO)(F)
BUILTIN\Пользователи:(I)(OI)(CI)(RX)
NT AUTHORITY\Прошедшие проверку:(I)(M)
NT AUTHORITY\Прошедшие проверку:(I)(OI)(CI)(IO)(M)

yanus74
25-07-2013, 07:34
Anonymоus, просто супер, спасибо!




© OSzone.net 2001-2012