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

5f0d552i  于 2023-11-18  发布在  Shell
关注(0)|答案(6)|浏览(131)

我正在尝试查找所有没有继承权限的文件夹。
这似乎是工作,sort:

DIR "C:\temp" -directory -recurse | GET-ACL | select -ExpandProperty Access | ? -property IsInherited -eq $false

字符串
.但它忽略了实际的文件夹名称。
如何在最终输出中包含文件夹名称?这对我来说有点棘手,因为我需要在对象(GET-ACL返回的任何内容)中过滤对象(Access)上的属性。
有什么想法吗?

nnvyjq4y

nnvyjq4y1#

算了,我是个白痴。

DIR "C:\temp" -directory -recurse | GET-ACL | where {$_.Access.IsInherited -eq $false}

字符串

mfpqipee

mfpqipee2#

我认为其他答案并不真正符合您的要求:命令建议给予你所有的非继承的访问规则,但也继承文件夹可能有这样的规则。
我一直在寻找一种更好的方法来实现你的目标,但目前这是我找到的唯一方法:

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

字符串
其概念是:如果文件夹至少有1个继承的访问规则,则启用继承,如果它有0个继承的规则,则禁用继承。

0yg35tkg

0yg35tkg3#

所有的答案对我来说仍然是一个解决方案。我发现这个解决方案实际上回答了所问的问题(仅限文件夹):

$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 =继承仍然启用
. AreaRulesProtected属性:https://petri.com/identify-folders-with-blocked-inheritance-using-powershell
我还通过自己的测试确认了这是文件夹继承的正确属性。

wlsrxk51

wlsrxk514#

可以使用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 $_
    }
}

字符串
我还将Get-Acl Package 在try块中,因为它会抛出终止错误。

6ljaweal

6ljaweal5#

Luca的回答给了我一个错误的答案,不知道为什么。
修改了Rohn的脚本,以打印实际上没有从父级继承的acl数量。如果folder has some of all -这意味着继承已启用,但某些权限是手动添加的,如果all of all -这意味着继承已禁用。

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中有2个
在E:\Projects\Active Projects\Claire\7. CHRISTMAS\中有2个,共8个
在E:\Projects\Active Projects\Closed Projects\Andrea\IT\14.07 Kath - CIMS中获得4分,共4分

unguejic

unguejic6#

我知道这是一个老问题,但我正在寻找一个简短而简单的解决方案,所以我想我也会发布我的答案。
正如Luca所指出的,接受的答案显示了所有未被继承的规则,包括在实际启用继承的目录上设置的规则。
为我工作的解决方案如下:

Get-ChildItem C:\PathHere -Directory -Recurse | Get-Acl | where { $_.AreAccessRulesProtected }

字符串
这将返回Get-Acl命令的输出,但如果您更喜欢Get-ChildItem的输出,则可以如下所示:

Get-ChildItem C:\PathHere -Directory -Recurse | where { (Get-Acl $_.FullName).AreAccessRulesProtected }


如果你只想检查顶层文件夹,你也可以删除-Recurse,或者用-Depth 2-Depth 3等替换它。

相关问题