Мой хороший друг и коллега Yaroslav T. творчески переосмыслил присутствующие в интертете решения для анализа неиспользуемых групповых политик и создал скрипт, которых должен быть в арсенале администраторов\аудиторов\InfoSec специалистов.
Скрипт значительно длиннее одной строки, но однозначно относится к категории “полезняшек”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
$GPOfiles = Get-GPO -All $report = @() foreach ($gf in $GPOfiles) { $gpoStatus = $gf.GpoStatus $rItem = @() [xml]$gpreport = $gf | Get-GPOReport -ReportType Xml $gpoName = $gpreport.GPO.Name $gpoLinks = $gpreport.GPO.LinksTo $gpoSFilt = ($gpreport.gpo.SecurityDescriptor.Permissions.TrusteePermissions | Where-Object { $_.standard.GPOGroupedAccessEnum -eq "Apply Group Policy"}).Trustee.Name.'#text' -join ";" if ($gpreport.GPO.Computer.ExtensionData -eq $Null -and $gpreport.GPO.User.ExtensionData -eq $Null) { $GPOEmpty = "TRUE" } else { $GPOEmpty = "FALSE" } if ( $null -eq $gpoLinks ) { $rItem = [psCustomObject] @{ Name = $gpoName SecurityFiltering = $gpoSFilt Location = "" LinkPath = "*GPO_NOT_LINKED*" LinkEnabled = "" LinkNoOverride = "" IsEmptyGPO = $GPOEmpty GpoStatus = $gpoStatus } $report += $rItem } else { foreach ($l in $gpoLinks) { $rItem = [psCustomObject] @{ Name = $gpoName SecurityFiltering = $gpoSFilt Location = $l.SOMname LinkPath = $l.SOMPath LinkEnabled = $l.Enabled LinkNoOverride = $l.NoOverRide IsEmptyGPO = $GPOEmpty GpoStatus = $gpoStatus } $report += $rItem } } } $report | Export-Csv C:\TMP\gporeport.csv -NoTypeInformation |
Результат экспортируется в CSV файл, который в дальнейшем удобно анализировать в Excel –