Меню Закрыть

Cписок прав доступа к сетевой папке (шаре) на PowerShell

Практически в любой организации со временем образуется большое количество сетевых шар с огромным количеством подкаталогов. Зачастую права на эти шары даются и группам, и напрямую пользователям, причем если это делалось до вас, то определить текущие права доступа становится непростой задачей.
Привожу скрипт на PowerShell, который собирает информацию по всем подкаталогам и правам доступа к ним в заданной папке, а затем выгружает её в файл CSV в удобном для анализа виде —

$folder = "\\file.domaino.ru\Departments\"
$resc = gci $folder | where {$_.extension -like ""}
$out = foreach($r in $resc)
{
$s = get-acl $r.fullname

foreach($inherit in $s.Access)
    {
 $inherit | add-member -membertype noteproperty -name Path -value $r.fullname -passthru |
    select Path, IdentityReference, filesystemrights
 }
}
$out | Export-Csv -Encoding "Unicode" -Path "c:\FolderReport.csv" -Delimiter ";"

Также не редка ситуация, когда требуется найти явно назначенные, не наследуемые права на каталоги. Для получения списка таких прав, потребуется немного изменить скрипт —

$folder = "\\file.domain.corp\Share\"
$resc = gci $folder | where {$_.extension -like ""}
$out = foreach($r in $resc)
{
$s = get-acl $r.fullname

foreach($inherit in $s.Access)
 {
 if ($inherit.IsInherited -like "False")
     {
  $inherit | add-member -membertype noteproperty -name Path -value $r.fullname -passthru |
        select Path, IdentityReference, filesystemrights
  }
 }
}
$out | Export-Csv -Encoding "Unicode" -Path "c:\FolderReport.csv" -Delimiter ";"

Надеюсь эти простые инструменты помогут вам в работе 🙂

14 комментариев

  1. Сергей

    Спасибо за пример, однако в указанном коде выполняется отбор всех элементов файловой системы, у которых пустое расширение. Это может привести к тому, что в отчет не попадут папки с непустым расширением и файлы с пустым расширением.
    Я бы рекомендовал вторую строку записать в виде:
    $resc = gci $folder | where {$_.mode -like «d????»}
    В этом случае отбор происходит по атрибутам элемента (где так же можно указать дополнительные атрибуты)
    А в случае, если необходимо рекурсивно обойти весь каталог:
    $resc = gci $folder -recurse | where {$_.mode -like «d????»}

  2. Андрей

    Спасибо большое, что поделились таким ценным скриптом!
    Именно такая задача и появилась: собрать все ACL на сетевом диске. А с PowerShell совсем не знаком и сам бы не сваял такое)

    Не сочтите за наглость))), но было бы замечательно добавить сбор прав с подкатологов. Что-то подобное есть здесь: http://windowsnotes.ru/powershell-2/upravlenie-acl-iz-powershell/

    Ещё раз спасибо за выложенный в Интернет инструмент)))

    • Kvazar

      Добрый день. Достаточно во второй строке после gci указать -recurse

    • Kvazar

      И еще небольшое добавление — чтобы ограничить глубину сбора информации по каталогам, используйте:
      $level = $folder.Split(‘\’).count
      $resc = gci -recurse $folder | where { $_.PSIsContainer -and ($_.fullname.Split(‘\’).count -le ($level + 2)) }

      где +2 — глубина поиска

  3. Олег

    Добрый день. Большое спасибо за столь ценный инструмент.
    Подскажите, а возможно модифицировать первый скрипт, чтобы раскрывались группы пользователей до конечных пользователей?

    • Kvazar

      Скрипт выводит список и групп, и пользователей, которые имеют права на папку. Для получения информации о составе групп необходимо использовать как вариант такую строку:
      import-module ActiveDirectory
      Get-ADgroup -filter * | Get-ADGroupMember

  4. Александр

    Извините за ламерский вопрос, но как добавить в вывод помимо логина пользователя ещё и его ФИО?
    И так же не могу в выходном файле раскрыть группу.
    Буду весьма признателен за помощь!

  5. Tietatter

    Всё красиво работает 🙂
    Как теперь обратно применить права к папкам из файла используя эту выгрузку?

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *