Аудит NTFS разрешений на PowerShell

Powershell LogoПри работе с файловыми ресурсами мой самый нелюбимый процесс это документирование существующих разрешений на папки и анализ того что было и что стало. Иначе выражаясь проведение аудита не тот процесс который мне нравиться и надо каким то образом было упростить это действо.

Мой подопытный – файловый сервер на основе Windows Server 2003 (по большому счету значения это никакого не имеет) с набором неких общих папок.

По старой традиции на помощь приходит PowerShell.

Кратко о приведенном ниже скрипте.

В переменной $folder задается имя анализируемой папки, далее производится анализ всех дочерних папок и результат пишется в файл D:\Reports\FolderReport.csv

# get-FolderPermissions.ps1

$folder = "\\FILESRV-01\ShareName\"
$in = Get-ChildItem $folder | where {$_.extension -eq ""}
$result = foreach($res in $in) {
$s = get-acl $res.fullname
foreach($inherit in $s.Access) {
$inherit | add-member -membertype noteproperty -name Path -value $res.fullname -passthru |
select Path, IsInherited, IdentityReference, filesystemrights
}
}
$result | Export-Csv -Encoding "Unicode" -Path "D:\Reports\FolderReport.csv" -Delimiter ","

Несколько расширенный второй вариант скрипта, отличие от первого в том что список папок он берет из файла folders.txt и затем создает csv-отчеты в папке $reportFolder

# get-FoldersPermissions2.ps1

$folders = Get-Content "folders.txt"
$reportFolder = "D:\Reports\"

foreach ($folder in $folders) {
$source = Get-ChildItem $folder | where {$_.extension -eq ""}
$result = foreach($res in $source) {
$s = Get-Acl $res.fullname
foreach($inherit in $s.Access) {
$inherit | Add-Member -membertype noteproperty -name Path -value $res.fullname -passthru | Select Path, IsInherited, IdentityReference, filesystemrights
}
}
$logName = $folder.Replace("\", "_")
$logName = $LogName.Replace(":", "")
$result | Export-Csv -Encoding "Unicode" -Path "$($reportFolder)report_$logName.csv" -Delimiter ","
}

Надеюсь что предложенный инструмент будет вам полезен.
Комментарии и замечания приветствуются.


Информация об авторе

Сергей Мариничев.
Вы можете присоединиться ко мне в Facebook или в Twitter.

Если Вам понравилась статья, то вы можете подписаться на RSS.
А также бесплатно подписаться по E-mail и получать актуальную информацию в числе первых.

Получать обновления на email

Вы можете оставить комментарий.

21 Комментариев »

 
  • 1# xck (2 комм.):

    Спасибо, работает! Возможно ли указать «глубину» проверки т.е. если шарный каталог содержит большое количество подкаталогов, а результат нужен к примеру только по корневому и вложенным папкам первого уровня?

      Цитировать

    • 2# Сергей Мариничев (687 комм.):

      глубину не задать т.к. для get-children доступно только два дополнительных ключа include и exclude.

      чисто теоретически можно сделать при рекурсивном обходе некие счетчики которые будут следить за уровнем и при превышении лимита ругаться или что то делать.

        Цитировать

  • 3# xck (2 комм.):

    Если возможно напишу статью на своем сайте с ссылкой на источник естественно?

      Цитировать

  • 5# Руслан (6 комм.):

    Спасибо за скрипт!
    Подскажите пожалуйста, можно ли еще узнать NTFS права не только на папки но и на файлы в них?
    С выше описанным скриптом показывает только разрешения на папки.

      Цитировать

    • 6# Сергей Мариничев (687 комм.):

      можно, но только от этого особого толку не будет т.к. разрешения наследуются от папки.
      в строке:

      $in = Get-ChildItem $folder | where {$_.extension -eq «»}

      удалите хвост:

      $in = Get-ChildItem $folder

        Цитировать

  • 7# Руслан (6 комм.):

    Я использую второй код, который читает директории из файла.
    Пожалуйста представьте измененный полный код под чтение разрешенений файлов. Как именно подредактировать Ваш код я не понял. Спасибо

      Цитировать

    • 8# Сергей Мариничев (687 комм.):

      там просто замена одной строки на другую.

      в куске
      foreach ($folder in $folders) {
      $source = Get-ChildItem $folder | where {$_.extension -eq «»}
      $result = foreach($res in $source) {

      выделенную строку замените на
      $source = Get-ChildItem $folder -Recurse

        Цитировать

      • 9# Руслан (6 комм.):

        Благодарю Вас Сергей!
        Теперь аудит NTFS разрешений действительно стал проще.
        Если Вам не трудно, могли бы Вы сделать так, чтобы тот код который читает данные из folders.txt выводил в файл NTFS разрешения только по файлам исключая каталоги. Это связана с тем, что при дальнейшей обработки выходного файла(report_$logName.csv) получается очень тяжелым.

          Цитировать

      • 10# Сергей Мариничев (687 комм.):

        На той неделе по возможности напишу.
        Кстати вы можете самостоятельно это дописать, только надо добавить проверку – если есть расширение писать в лог, если нет то это папка.

          Цитировать

      • 11# Руслан (6 комм.):

        К сожалению я синтаксис PS не знаю. Если бы это было на PHP, то я бы без труда это сделал:)

          Цитировать

  • 12# Сергей Мариничев (687 комм.):

    В строке
    $source = Get-ChildItem $folder | where {$_.extension -eq «»}
    измените условие равенства на

    $source = Get-ChildItem $folder | where {$_.extension -ne «»}

    в этом случае будут писаться разрешения на все что имеет расширение и папки будут игнорироваться.

      Цитировать

  • 13# Андрей Гончаров (4 комм.):

    Помогите, пожалуйста!

    PS C:\11> C:\11\get-FolderPermissions.ps1
    Get-Acl : Не удается проверить аргумент для параметра «Path». Аргумент пустой или имеет значение NULL. Укажите не пустой аргумент, не имеющий значение NULL, после чего пов
    торите выполнение команды.
    C:\11\get-FolderPermissions.ps1:6 знак:16
    + $s = get-acl <<<< $res.fullname
    + CategoryInfo : InvalidData: (:) [Get-Acl], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.GetAclCommand

    Add-Member : Не удается привязать аргумента к параметру "InputObject", так как он имеет значение NULL.
    C:\11\get-FolderPermissions.ps1:8 знак:27
    + $inherit | add-member <<<< -membertype noteproperty -name Path -value $res.fullname -passthru |
    + CategoryInfo : InvalidData: (:) [Add-Member], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.AddMemberCommand

    Export-Csv : Не удается привязать аргумента к параметру "InputObject", так как он имеет значение NULL.
    C:\11\get-FolderPermissions.ps1:12 знак:21
    + $result | Export-Csv <<<< -Encoding "Unicode" -Path "c:\11\FolderReport.csv" -Delimiter ","
    + CategoryInfo : InvalidData: (:) [Export-Csv], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.ExportCsvCommand

      Цитировать

  • 14# Сергей Мариничев (687 комм.):

    в строке
    $folder = «\\FILESRV-01\ShareName\»

    корректный путь указан?

      Цитировать

  • 15# Vadim Sterkin (24 комм.):

    А одна команда subinacl не годится для экспорта разрешений?

      Цитировать

  • 17# Андрей Гончаров (4 комм.):

    Да, проверил.

    # get-FolderPermissions.ps1

    $folder = «\\sorbona\link»
    $in = Get-ChildItem $folder | where {$_.extension -eq «»}
    $result = foreach($res in $in) {
    $s = get-acl $res.fullname
    foreach($inherit in $s.Access) {
    $inherit | add-member -membertype noteproperty -name Path -value $res.fullname -passthru |
    select Path, IsInherited, IdentityReference, filesystemrights
    }
    }
    $result | Export-Csv -Encoding «Unicode» -Path «c:\11\FolderReport.csv» -Delimiter «,»

      Цитировать

  • 18# Андрей Гончаров (4 комм.):

    \\sorbona\link проверил, работает. На самом серваке не нужно случаем .net 3.5.1 ?

    # get-FolderPermissions.ps1

    $folder = «\\sorbona\link»
    $in = Get-ChildItem $folder | where {$_.extension -eq «»}
    $result = foreach($res in $in) {
    $s = get-acl $res.fullname
    foreach($inherit in $s.Access) {
    $inherit | add-member -membertype noteproperty -name Path -value $res.fullname -passthru |
    select Path, IsInherited, IdentityReference, filesystemrights
    }
    }
    $result | Export-Csv -Encoding «Unicode» -Path «c:\11\FolderReport.csv» -Delimiter «,»

      Цитировать

    • 19# Сергей Мариничев (687 комм.):

      нет
      на сервере ничего не надо.
      У вас просблема в том что процедуре Get-ACL скармливается пустое значение а она этого не понимает.

      Предлагаю проверить на другом ресурсе и в аот таком варианте
      $in = Get-ChildItem $folder

      это вернет все элементы, а не только папки.

      PS кстати в вашей папке подпапки есть?

        Цитировать

 

Добавить комментарий

XHTML: Вы можете использовать тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>