我正在尝试查找所有不继承权限的文件夹。
这似乎有效,排序:
DIR“C:\ temp”-directory -recurse | GET-ACL |选择-ExpandProperty访问| ? -property IsInherited -eq $ false
...但它遗漏了实际的文件夹名称。
如何在最终输出中包含文件夹名称?这对我来说有点棘手,因为我需要过滤对象内的对象(Access)上的属性(无论GET-ACL返回什么)。
有什么想法吗?
答案 0 :(得分:5)
划伤,我是个白痴。
DIR“C:\ temp”-directory -recurse | GET-ACL |其中{$ _.Access.IsInherited -eq $ false}
答案 1 :(得分:3)
我认为其他答案与您的请求不匹配:建议的命令会为您提供所有非继承访问规则,但是继承文件夹也可能具有此类规则。
我一直在寻找更好的方法来实现同一目标,但目前这是我找到的唯一方法:
Get-ChildItem C:\temp -recurse | Select @{Name='Path';Expression={$_.FullName}},@{Name='InheritedCount';Expression={(Get-Acl $_.FullName | Select -ExpandProperty Access | Where { $_.IsInherited }).Count}} | Where { $_.InheritedCount -eq 0 } | Select Path
概念是:如果一个文件夹至少有一个继承的访问规则,则启用继承,如果它有0个继承的规则,则继承被禁用。
答案 2 :(得分:1)
您可以使用Add-Member在每个ACE对象上添加路径作为属性:
dir c:\temp -Directory -Recurse | ForEach-Object {
$Path = $_.FullName
try {
Get-Acl $Path |
select -ExpandProperty Access |
where { $_.IsInherited -eq $false } |
Add-Member -MemberType NoteProperty -Name Path -Value $Path -PassThru
}
catch {
Write-Error $_
}
}
我还在一个try块中包含Get-Acl,因为它会引发终止错误。
答案 3 :(得分:1)
所有答案对我来说仍然是一种解决方法。我找到了这个解决方案来实际回答所提出的问题(仅限文件夹):
$folders = gci -recurse C:\My\Path\Here
foreach ($path in $folders)
{
if ($path.PSIsContainer -eq $false)
{
continue
}
if ((get-acl $path.fullname).AreAccessRulesProtected -eq $true)
{
$path.fullname
}
}
对于返回的 get-acl 对象的 .AreAccessRulesProtected
属性:
True = 继承已被禁用
False = 继承仍然启用
.AreAccessRulesProtected 属性的来源: https://petri.com/identify-folders-with-blocked-inheritance-using-powershell
我还通过自己的测试确认这是文件夹继承的正确属性。
答案 4 :(得分:0)
Luca的答案给了我带有[名称的[]文件夹的误报。不知道为什么。
适应了Rohn的脚本,以打印实际上没有从父级继承的ACL。如果文件夹中有全部内容-则表示已启用继承功能,但如果所有文件夹中有全部权限-则手动添加了一些权限-表示已禁用继承功能。
Write-Output "`nNoninheritable permissions:`n"
dir "E:\Projects" -Directory -Recurse | ForEach-Object {
$Path = $_.FullName
try {
$TotalACLs = (Get-Acl $Path | select -ExpandProperty Access).Count
$InheritedCount = (Get-Acl $Path | select -ExpandProperty Access | where { $_.IsInherited -eq $false } | Add-Member -MemberType NoteProperty -Name Path -Value $Path -PassThru | Select Path).Count
if ($InheritedCount) {
Write-Output $InheritedCount" out of "$TotalACLs" in "$Path
}
}
catch {
Write-Error $_
}
}
示例结果:
不可继承的权限:
在E:\ Projects \ Active Project中,7之2
在E:\ Projects \ Active Projects \ Claire \ 7中,2之8。圣诞节\
4个项目中,有4个位于E:\ Projects \ Active Projects \ Closed Projects \ Andrea \ IT \ 14.07 Kath-CIMS