web-dev-qa-db-ja.com

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を割り当てる単純なものが必要です。

3
user10711

テストされていませんが、次のようなものはどうですか?

$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] ;
    }
2