我们有一个具有许多明确权利的文件夹结构,例如
root Folder
- subfolder 1 (explicit acl, no inherit acl)
- subfolder 2 (explicit acl, no inherit acl)
--subsubfolder 1 (no explicit rights, inherit acl)
--subsubfolder 2 (explicit acl, no inherit acl)
等等
我想为所有显式 ACL 添加权限(系统帐户),但不为非显式 ACL 添加权限。当然,有些文件夹甚至管理员帐户也无法访问,所以我需要忽略错误。
有谁知道可以实现这个功能的脚本吗?
編輯1
感谢 Hardoman,这里为当前文件夹、子文件夹和文件提供了可行的解决方案,并且不会捕获错误......
$folders = (Get-ChildItem C:\Temp -Directory -Recurse) | select -ExpandProperty fullname
foreach ($item in $folders) {
$inheritance = (Get-Acl $item).access[0] | select -ExpandProperty isinherited
if ($inheritance -eq $false) {
icacls.exe $item /grant 'System:(OI)(CI)(RX)'
}
}
没有找到使用 set-acl 的解决方案,也许有人有想法,这是我当前的 set-acl 状态,但子文件夹即使被继承也无法获得权限。
$folders = (Get-ChildItem C:\Temp -Directory -Recurse) | select -ExpandProperty fullname
foreach ($item in $folders) {
$inheritance = (Get-Acl $item).access[0] | select -ExpandProperty isinherited
if ($inheritance -eq $false) {
try {
$acl = Get-Acl $item
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("System","FullControl, Synchronize", "ContainerInherit,ObjectInherit", "None", "Allow")
$acl.SetAccessRule($AccessRule)
Set-Acl $item $acl
}
catch {
"Failed to access folder $item"
"Exception type is $($_.Exception.GetType().Name)"
}
}
}
答案1
您需要为此编写一个 Powershell 脚本。您需要递归获取所有文件夹和子文件夹,检查每个文件夹的继承性并使用获取 ACL和设置ACLcommadlets 添加权限系统帐户。如果脚本无法访问该文件夹,Try/catch 将处理错误。
这是我为您编写的示例,假设您在 C:\temp 文件夹中递归作为示例。
$folders = (Get-ChildItem c:\temp -Directory -Recurse) | select -ExpandProperty fullname
foreach ($item in $folders) {
$inheritance = (Get-Acl $item).access[0] | select -ExpandProperty isinherited
if ($inheritance -eq $false) {
try {
$acl = Get-Acl $item
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule ("System","FullControl","Allow")
$acl.SetAccessRule($AccessRule)
$acl | Set-Acl $item
}
catch {
"Failed to access folder $item"
"Exception type is $($_.Exception.GetType().Name)"
}
}
}
PS 要使 Get-ChildItem 和 -Directory 正常工作,您需要安装 Powershell 4+。PS 2.0 中缺少此开关