Назад | Перейти на главную страницу

Powershell: ввод конвейера в Set-Acl

есть испорченная папка с несовместимыми ACL, которые мне нужно унифицировать. Я надеялся добиться этого с помощью PowerShell. Итак, я пытаюсь найти все файлы, в которых отсутствует требуемая группа, и применяю права через Set-Acl:

Get-Acl | where {$_.accesstostring -notlike "*domain\required_grp*"} | Set-Acl $dir $acl 

В отличие от icacls, Set-Acl требует, чтобы вы были владельцем файла, чтобы иметь возможность изменять ACL. Поэтому:

$dir= Get-Acl .\reference_file
$acl= $ACL.SetOwner([System.Security.Principal.NTAccount]$my_account)

Ну, при запуске команды я получаю следующую ошибку:

Set-Acl : The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input. At line:1 char:95

Я почти уверен, что проблема в формате вывода, передаваемого в Set-Acl, но не могу понять, что именно. Спасибо за любой вклад, очень признателен.

Лука

Я считаю, что вы сбиваете с толку PowerShell, потому что вы отправляете массив списков ACL по конвейеру, но не перебираете каждый из них. Кроме того, он считает, что CMDlet Set-ACL ожидает, что путь будет отправлен по конвейеру.

$acl= Get-Acl .\reference_file
$acl= $ACL.SetOwner([System.Security.Principal.NTAccount]$my_account)
Get-ChildItem | ? { (Get-ACL $_).accesstostring -notlike "*domain\groupname*"} | % { Set-ACL $_.Fullname $acl }

У меня это работает. Он получает каждый файл или папку, проверяет, соответствует ли этот ACL вашему выражению, и при необходимости устанавливает ACL.