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

Рекурсивное изменение разрешений с помощью Powershell

Я пытаюсь написать сценарий в Powershell, который будет рекурсивно находить папки и на основе имени папки заменять ACL в папке.

У меня уже есть папки с правильными разрешениями. Я использую их как папки с шаблонами.

Folder1
Folder2
 - Subfolder1
 - Subfolder2 

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

Вот пример первого способа, которым я пытался с этим справиться.

$Prop = Get-Acl "Template\Subfolder1"
$Engd = Get-Acl "Template\Subfolder2"

foreach ($file in $(Get-ChildItem Folder2 -recurse)) {
  If ($_ = "Subfolder1") {
    set-acl $_ $Prop
    }
  If ($_ = "Subfolder2") {
    set-acl $_ $Engd
    }
}

Чем дальше я пытаюсь написать это, тем больше понимаю, что это будет все труднее и труднее. У меня есть сотни папок с названиями, похожими на Folder2 Folder3 ..... FolderN, все с одинаковой структурой папок и именами папок внутри. Мне просто нужно что-то простое, которое будет соответствовать имени папки и на основе имени назначить определенный предопределенный ACL.

Не проверено, но как насчет чего-то вроде этого:

$acls = @{};
Get-ChildItem Template |
    Where-Object { $_.PSIsContainer } |
    ForEach-Object {
        $acls[$_.Name] = Get-Acl $_.FullName ;
    }

Get-ChildItem Folder2 -Recurse |
    Where-Object { $_.PSIsContainer -and $acls.ContainsKey($_.Name) } |
    ForEach-Object {
        Set-Acl $_.FullName $acls[$_.Name] ;
    }