获取不继承权限的文件夹的名称

时间:2014-08-04 20:18:57

标签: powershell

我正在尝试查找所有不继承权限的文件夹。

这似乎有效,排序:

DIR“C:\ temp”-directory -recurse | GET-ACL |选择-ExpandProperty访问| ? -property IsInherited -eq $ false

...但它遗漏了实际的文件夹名称。

如何在最终输出中包含文件夹名称?这对我来说有点棘手,因为我需要过滤对象内的对象(Access)上的属性(无论GET-ACL返回什么)。

有什么想法吗?

5 个答案:

答案 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