代码之家  ›  专栏  ›  技术社区  ›  David Brunner

列出用户(管理员除外)允许完全访问的所有文件夹

  •  0
  • David Brunner  · 技术社区  · 8 年前

    几年前,在我们公司的文件服务器上,我们曾经拥有松散的权限。 也就是说,有些文件夹用户倾向于拥有完全权限。这是一件坏事(用户玩弄权限,锁定系统(以及备份),只允许自己访问。

    我的目标:

    逐个文件夹扫描文件服务器文件夹(文件太多)并输出

    • 文件夹完整路径
    • 安全标识参考

    如果除了域管理员或系统之外,还有人拥有完全访问权限。

    输出如下:

    Path, ACL
    E:\share\projectfolder, Domain\10JohnDoe
    E:\share\commonfolder, Domain\Everyone
    ...

    这就是我所拥有的,但还远远不够:

    ##define variable
    $path = "E:\Share"
    ## begin script
    
    foreach ($file in Get-Childitem $path -Recurse -Directory) {
        if (Get-Acl $file.FullName |
            select -ExpandProperty Access |
            where {$_.IdentityReference -notlike "AT\Domain Admins" -and
                $_.IdentityReference -notlike "NT AUTHORITY\SYSTEM" -and
                $_.AccessControlType -like "Allow" -and
                $_.FileSystemRights -like "FullControl"}
        ) {
            Write-Host $file.FullName >> e:\check_acl.txt
            Get-Acl $file.FullName |
                select -ExpandProperty Access |
                where {$_.IdentityReference -notlike "AT\Domain Admins" -and
                    $_.IdentityReference -notlike "NT AUTHORITY\SYSTEM" -and
                    $_.AccessControlType -like "Allow" -and
                    $_.FileSystemRights -like "FullControl"
                } >> e:\check_acl.txt
        }
    }
    

    但我想,我无法将输出(写入文件!)就像那样。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Frode F.    8 年前

    Write-Host 仅向控制台显示文本,无法保存。 Get-Acl >> check_acl.txt 将写入整个“对象”,而不仅仅是identityreference。您想要的是创建一个带有Path和ACL(identityreference)属性的自定义对象,并将其导出到csv。

    我还简化了身份排除,并将if测试改为foreach循环,这样您就不必运行整个 Get-ACL -行两次。

    试试这个:

    ##define variable
    $path = "E:\Share"
    $ExcludeUsers = 'AT\Domain Admins','NT AUTHORITY\SYSTEM','AT\AT-IT','AT\01STREW','AT\01BRUND','AT\01KNAFP','AT\01BECKC'
    ## begin script
    
    #Create regex-pattern to match all excluded users
    $ExcludeUsersRegex = ($ExcludeUsers | % { [regex]::Escape($_) }) -join '|'
    
    
    Get-Childitem $path -Recurse -Directory | ForEach-Object {
        $file = $_
    
        Get-Acl -Path $file.FullName |
        Select-Object -ExpandProperty Access |
        Where-Object {$_.IdentityReference -notmatch $ExcludeUsersRegex -and $_.AccessControlType -eq "Allow" -and $_.FileSystemRights -eq "FullControl"} |
        ForEach-Object {
            #Foreach ACL
            New-Object psobject -Property @{
                Path = $file.FullName
                ACL = $_.IdentityReference
            }
        }
    } | Select-Object -Property Path, ACL | Export-Csv e:\check_acl.csv -NoTypeInformation
    

    示例输出:

    "Path","ACL"
    "C:\Users\frode\Desktop\TEST\YES","CONTOSO\frode"
    "C:\Users\frode\Desktop\TEST\YES","CONTOSO\FrodesOtherAccount"