NTFS权限使用PowerShell进行审计

我正在一个项目中,我需要能够审核NTFS格式的Windows文件服务器上的各种用户和用户组权限。 我想使用PowerShell,并通过远程文件共享recursionsearch,或者它可以在服务器上运行,并输出所有的权限,无论是对于所有用户还是指定的用户或用户组。 我们的目标是能够使用此function定期审核用户和用户组,以确保不会发生权限蠕变,并且所有权限都由不同的系统pipe理员以相同的方式进行设置。 最后,在我们更改组策略中的用户组时,它将用于确定我们需要进行更改的位置。 有没有什么常见的方法来处理这个问题? PowerShell能够经受住这个任务吗? 是否有可能让PowerShell将结果输出为可读格式?

几个月前,我阅读了一篇精彩的文章,通过远程运行脚本处理类似的情况,使用Get-ACL cmdletrecursion列出acl的path,并通过Export-CSV cmdletpipe道输出以获得良好的概述:

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

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

类似Judaslscariot1651提供的链接。 我更多的是把我所知道的很好的快照,然后通过运行一个脚本来比较它。 我通过输出到XML来比较文件许可权限,然后使用Compare-Object将其与我的基准XML文件进行Compare-Object 。 可能不准确,但只是我这样做的方式…

注意:这是当时正在进行的一项工作,面向我需要注意的特定path,我从读取registry键值中拉出。 你可能需要什么的主要依据就是“收集关于…的信息”。 我只是想提供所有的代码来显示我在做什么/我在做什么。

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