Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] парсинг NTFS разрешений каталога и подкаталогов (http://forum.oszone.net/showthread.php?t=264822)

yanus74 23-07-2013 16:25 2189258

парсинг NTFS разрешений каталога и подкаталогов
 
Здравствуйте!
Появилась необходимость провести аудит файловых ресурсов.
Для этих целей подошел бы скрипт, а вот тут я не силен, и прошу помощи у сообщества.
Задача стоит такая
входные данные: путь к папке с которой необходимо собрать данные ( что-то вроде 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 2189265

именно скриптом нужно? или подойдёт программа AccessEnum

yanus74 23-07-2013 17:18 2189299

exo, подойдет любой способ, главное на выходе получить данные в текстовом виде, так их обрабатывать будет проще.
Спасибо за ссылку на программу, сейчас испробую ее.

yanus74 23-07-2013 17:33 2189308

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 2189573

я тут подумал, примерно должен быть такой алгоритм:
Код:

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 2189661

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 2189768

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

Anonymоus 24-07-2013 21:44 2190052

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 2190219

Anonymоus, просто супер, спасибо!


Время: 21:15.

Время: 21:15.
© OSzone.net 2001-