web-dev-qa-db-ja.com

Powershellを使用してフォルダーのアクセス許可を再帰的に設定しますか?

再帰的に調べたいディレクトリがあり、すべてのフォルダにアクセス許可を設定します。したがって、操作の順序は次のようになります。

  1. フォルダからすべてのACLを削除
  2. フォルダにACLを追加
  3. ACLを設定

以下のコードを試しましたが、エラーが発生しています

呼び出す必要のあるメソッドSetSecurityDescriptorが存在しないため、ACLを設定できません。

_foreach ($folder in Get-ChildItem -Path c:\perms -Recurse -Directory) {
    $AccessRule = New-Object System.Security.Accesscontrol.FileSystemAccessRule ("user", "FullControl", "ContainerInherit,ObjectInherit", "InheritOnly", "Allow")
    $acl = Get-Acl $folder
    $acl.SetAcccessRule($AccessRule)
    Set-Acl -Path $folder.FullName -AclObject $acl
}
_

エラーメッセージが表示されなくなり、ACLが追加されましたが、基本的にはフォルダーからすべてのACLを削除して、新しいACLを追加したいと考えています。

スクリプトを次のように更新しました。

_$acl = Get-Acl -Path "c:\perms"
$acl.SetAccessRuleProtection($true,$false)
$acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) | Out-Null }
$ace = New-Object System.Security.Accesscontrol.FileSystemAccessRule ("user", "FullControl", "ContainerInherit,ObjectInherit", "InheritOnly", "Allow")
$acl.AddAccessRule($ace)
Set-Acl -Path "c:\perms" -AclObject $acl
_

複数の_$ace_を追加する場合は、_$ace2_、_$ace3_を宣言してから$acl.AddAccessRule($ace2)$acl.AddAccessRule($ace3)を呼び出すだけです。

4
xaisoft

SetAccessRuleProtection() を使用して、継承を無効にし、継承されたACEを削除します。

_$acl.SetAccessRuleProtection($true, $false)
_

RemoveAccessRule() を使用して、既存の(継承されていない)ACEを削除します。

_$acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) | Out-Null }
_

AddAccessRule() を使用して、新しいACEを追加します。

_$ace = New-Object Security.AccessControl.FileSystemAccessRule "user", ...
$acl.AddAccessRule($ace)
...
_

これは、最上位のフォルダーに対してのみ実行してください。以下のすべての場所で継承を有効にしておくと、変更が自動的に反映されます。

2
Ansgar Wiechers