【问题标题】:List all folders, where users (except admin) have allow full access列出所有文件夹,其中用户(管理员除外)允许完全访问
【发布时间】:2016-06-19 22:26:53
【问题描述】:

几年前,在我们公司的文件服务器上,我们曾经拥有宽松的权限。 这意味着,有些文件夹的用户往往拥有完全权限。这是一件坏事(用户玩弄权限,锁定系统(和备份)并且只给自己访问权限。

我的目标:

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

  • 文件夹完整路径
  • 安全身份参考

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

输出会很好:

路径,ACL
E:\share\projectfolder, 域\10JohnDoe
E:\share\commonfolder, 域\所有人
...

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

##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
    }
}

但我想,我不能像那样得到输出(到文件中!)。

【问题讨论】:

    标签: powershell acl fileserver


    【解决方案1】:

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

    我还简化了您的身份排除并将 if-test 更改为 foreach-loop,因此您不必运行整个 Get-ACL-line 两次。

    试试这个:

    ##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"
    

    【讨论】:

    • 您好,Frode,这似乎真的可以...谢谢!当然,如果没有真正了解对象和编程语言本身,这很难......
    • 没问题。我建议阅读一些教程来熟悉对象和管道,这在 PowerShell 中非常重要。我避免使用大多数别名和快捷方式(创建正则表达式时除外..% = Foreach-Object),以便您可以在 Technet 上找到这些 cmdlet 并阅读它们。了解您正在运行的代码很重要。这就是我们学习的方式。 :-) 祝你好运,欢迎来到 StackOverflow。顺便提一句。如果您认为这是正确的答案,请使用答案左侧的复选标记,以便我们关闭此问题。
    • 大多数访问权限用于继承(IsInherited 属性),因此除了其子文件夹之外,还值得测试$path 目录本身。以下是@DavidBrunner 的一些有用链接:Understanding Streams, Redirection, and Write-Host in PowerShellWrite-Host Considered Harmful
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多