【PowerShell】GPOのリンクの一覧をCSV出力

久々にSE系の話題

Active DirectoryのGPOについて、修正する前に影響するOUを確認したり、逆にどのOUにもリンクされていない不要なポリシーを探すうえで、CSVに一覧で出力出来たら便利だなーと思ってPowerShellでスクリプトを作ってみました。

$objLogCsvArry = @();

$GPO_All = (Get-GPO -All)

foreach ($GPO in $GPO_All){
    [xml]$GPReport = (Get-GPOReport -Id $GPO.Id -ReportType xml)

    if($GPReport.GPO.LinksTo.Count -eq 0){
        $objLogCsv = New-Object PSCustomObject
        $objLogCsv | Add-Member  -NotePropertyMembers @{
            "GPOName"    = $GPO.DisplayName
            "SOMName"    = ''
            "SOMPath"    = ''
            "Enabled"    = ''
            "NoOverride" = ''
        }
        $objLogCsvArry += $objLogCsv
    } else {
        foreach($LinkTo in $GPReport.GPO.LinksTo){
            $objLogCsv = New-Object PSCustomObject
            $objLogCsv | Add-Member  -NotePropertyMembers @{
                "GPOName"    = $GPO.DisplayName
                "SOMName"    = $LinkTo.SOMName
                "SOMPath"    = $LinkTo.SOMPath
                "Enabled"    = $LinkTo.Enabled
                "NoOverride" = $LinkTo.NoOverride
            }
        $objLogCsvArry += $objLogCsv
        }
    }
}
$objLogCsvArry | Select-Object "GPOName","SOMName","SOMPath","Enabled","NoOverride" |
                 Sort-Object "GPOName","SOMPath" |
                 Export-Csv -Path ".\GPO_LinksTo.csv" -Encoding "Default" -NoTypeInformation

どこにもリンクされていないGPOの場合は、"GPOName"だけがセットされて、その他の項目はブランクの行が1行出力されるようになっています。
また、出力はカレントディレクトリに"GPO_LinksTo.csv"のファイル名で出力されるようになっていますが、そこは適宜見直してもらえればよいかと思います。

以上、参考までに。