再帰的に調べたいディレクトリがあり、すべてのフォルダにアクセス許可を設定します。したがって、操作の順序は次のようになります。
以下のコードを試しましたが、エラーが発生しています
呼び出す必要のあるメソッド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)
を呼び出すだけです。
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)
...
_
これは、最上位のフォルダーに対してのみ実行してください。以下のすべての場所で継承を有効にしておくと、変更が自動的に反映されます。