Аудит NTFS разрешений на PowerShell
При работе с файловыми ресурсами мой самый нелюбимый процесс это документирование существующих разрешений на папки и анализ того что было и что стало. Иначе выражаясь проведение аудита не тот процесс который мне нравиться и надо каким то образом было упростить это действо.
Мой подопытный – файловый сервер на основе Windows Server 2003 (по большому счету значения это никакого не имеет) с набором неких общих папок.
По старой традиции на помощь приходит PowerShell.
Кратко о приведенном ниже скрипте.
В переменной $folder задается имя анализируемой папки, далее производится анализ всех дочерних папок и результат пишется в файл D:\Reports\FolderReport.csv
$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
$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. |
А также бесплатно подписаться по E-mail и получать актуальную информацию в числе первых.
Вы можете оставить комментарий.
Спасибо, работает! Возможно ли указать «глубину» проверки т.е. если шарный каталог содержит большое количество подкаталогов, а результат нужен к примеру только по корневому и вложенным папкам первого уровня?
xckЦитировать
глубину не задать т.к. для get-children доступно только два дополнительных ключа include и exclude.
чисто теоретически можно сделать при рекурсивном обходе некие счетчики которые будут следить за уровнем и при превышении лимита ругаться или что то делать.
Сергей МариничевЦитировать
Если возможно напишу статью на своем сайте с ссылкой на источник естественно?
xckЦитировать
не вижу препятствий.
Сергей МариничевЦитировать
Спасибо за скрипт!
Подскажите пожалуйста, можно ли еще узнать NTFS права не только на папки но и на файлы в них?
С выше описанным скриптом показывает только разрешения на папки.
РусланЦитировать
можно, но только от этого особого толку не будет т.к. разрешения наследуются от папки.
в строке:
удалите хвост:
Сергей МариничевЦитировать
Я использую второй код, который читает директории из файла.
Пожалуйста представьте измененный полный код под чтение разрешенений файлов. Как именно подредактировать Ваш код я не понял. Спасибо
РусланЦитировать
там просто замена одной строки на другую.
в куске
foreach ($folder in $folders) {
$source = Get-ChildItem $folder | where {$_.extension -eq «»}
$result = foreach($res in $source) {
выделенную строку замените на
$source = Get-ChildItem $folder -Recurse
Сергей МариничевЦитировать
Благодарю Вас Сергей!
Теперь аудит NTFS разрешений действительно стал проще.
Если Вам не трудно, могли бы Вы сделать так, чтобы тот код который читает данные из folders.txt выводил в файл NTFS разрешения только по файлам исключая каталоги. Это связана с тем, что при дальнейшей обработки выходного файла(report_$logName.csv) получается очень тяжелым.
РусланЦитировать
На той неделе по возможности напишу.
Кстати вы можете самостоятельно это дописать, только надо добавить проверку – если есть расширение писать в лог, если нет то это папка.
Сергей МариничевЦитировать
К сожалению я синтаксис PS не знаю. Если бы это было на PHP, то я бы без труда это сделал:)
РусланЦитировать
В строке
$source = Get-ChildItem $folder | where {$_.extension -eq «»}
измените условие равенства на
$source = Get-ChildItem $folder | where {$_.extension -ne «»}
в этом случае будут писаться разрешения на все что имеет расширение и папки будут игнорироваться.
Сергей МариничевЦитировать
Помогите, пожалуйста!
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
Андрей ГончаровЦитировать
в строке
$folder = «\\FILESRV-01\ShareName\»
корректный путь указан?
Сергей МариничевЦитировать
А одна команда subinacl не годится для экспорта разрешений?
Vadim SterkinЦитировать
она немного не в том виде выводит данные но вполне пригодна для получения списка разрешений.
Сергей МариничевЦитировать
Да, проверил.
# 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 «,»
Андрей ГончаровЦитировать
\\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 «,»
Андрей ГончаровЦитировать
нет
на сервере ничего не надо.
У вас просблема в том что процедуре Get-ACL скармливается пустое значение а она этого не понимает.
Предлагаю проверить на другом ресурсе и в аот таком варианте
$in = Get-ChildItem $folder
это вернет все элементы, а не только папки.
PS кстати в вашей папке подпапки есть?
Сергей МариничевЦитировать