使用 PowerShell 进行 NTFS 权限审核

使用 PowerShell 进行 NTFS 权限审核

我正在开展一个项目,需要能够审核 NTFS 格式的 Windows 文件服务器上的各种用户和用户组权限。我想使用 PowerShell 并让其递归搜索远程文件共享,或者可以在服务器本身上运行,并让其输出找到的所有权限,无论是针对所有内容还是针对指定的用户或用户组。目标是能够使用它来定期审核用户和用户组,以确保不会发生权限蔓延,并且所有权限都由不同的系统管理员以相同的方式设置。最后,它将用于识别在组策略中更改用户组时需要进行更改的位置。是否有任何常用的方法可以解决这个问题?PowerShell 能胜任这项任务吗?是否可以让 PowerShell 将结果输出为可读格式?

答案1

几个月前,我读过一篇精彩的文章,它处理了类似的情况,本质上是通过远程运行一个脚本来处理类似的情况,该脚本使用 Get-ACL cmdlet 以递归方式列出路径的 acl,并通过 Export-CSV cmdlet 传输输出以获得很好的概述:

http://jfrmilner.wordpress.com/2011/05/01/audit-ntfs-permissions-powershell-script/

答案2

在这种情况下,我认为 Sysinternals AccessChk 和 AccessEnum 工具可能更适合您。它们可以在文件和磁盘实用程序下找到这里

答案3

类似于链接犹大加略人1651提供。我更倾向于拍摄我所知道的好的快照,然后在需要时通过运行脚本进行比较。我通过将当前发现的权限输出到 XML 来比较文件权限,然后使用 将其与我的基线 XML 文件进行比较Compare-Object。可能不完全准确,但这就是我做事的方式……

注意:这是当时正在进行的工作,针对的是我需要观察的特定路径,这些路径是我从读取注册表项值中提取的。您可能需要的主要内容从“收集有关...的信息”附近开始。我只是想提供所有代码来展示我是如何/正在做什么的。



#Get date/time for file name
$d = Get-Date -format "yyyyMMdd"
# Pull instance names found on server 
$inst = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server').InstalledInstances

$warningpreference = "Continue"

foreach($i in $inst) 
{    $p = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL').$i
    $bin = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$p\Setup").SQLBinRoot
    $ver = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$p\MSSQLServer\CurrentVersion").CurrentVersion
    switch -wildcard ($ver) 
    {
        "9*" {$client = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\90').VerSpecificRootDir; break }
        "10*" {$client = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\100').VerSpecificRootDir; break }
    }

    $currentFile = $i + "_" + $d + ".xml"
    "Collecting information on $bin and $client for $i"
        $bin,$client | foreach { Get-ChildItem $_ -Recurse } |
                    Select FullName, CreationTimeUTC, LastWriteTimeUtc, PSIsContainer, Length,
                    @{Name='Owner';Expression={ (Get-Acl $_.PSPath).Owner }},
                    @{Name='ACLRights';Expression={ (Get-Acl $_.PSPath).Access | Select FileSystemRights }},
                    @{Name='ACLUser';Expression={ (Get-Acl $_.PSPath).Access | Select IdentityReference }},
                    @{Name='ACLAccessType';Expression={ (Get-Acl $_.PSPath).Access | Select AccessControlType}} |
                        Export-Clixml $currentFile
    "Current file is: $currentFile"

    $basefile = "baseline_$i.xml"
    if (Test-Path $basefile)
    {
        $base = Import-Clixml $basefile
        $current = Import-Clixml $currentFile
        #now compare
        $results = "Results_" + $i + "_" + $d + ".txt"
        Compare-Object $base $current -Property CreationTimeUTC, LastWriteTimeUtc, Length, FullName, Owner, AclRights, AclUser, AclAccessType |
            Out-File $results

        #determine if the results file shows any changes, if so wave a flag
        if ((Get-Content $results).Length -eq $null)
        {
            "ZERO Changes found"
        }
        else
        {
            "changes found"
        }
    }
    else
    {
        Write-Warning -Message "WARNING: No base file found to compare."
    }
}

相关内容