dimanche 3 août 2014

Powershell : Exporter les GPO contenant des Groupes Restreints

Bonjour à tous,

Je vous propose aujourd'hui  un script qui va vous permettre de récupérer les Stratégies de Groupes qui contiennent des Groupes Restreints.

Lors d'un audit Active Directory, il peut y avoir beaucoup de GPO à auditer et il est donc difficile de cibler certaines configurations de GPO, notamment celles avec des Groupes Restreints.

Le fonctionnement du script est assez simple, on récupère un rapport de GPO au format XML puis on analyse le XML pour détecter la présence de Groupes Restreints et on exporte la configuration. 

Le script permet soit de retourner un tableau contenant les GPO avec la configuration des Groupes Restreints  :


Soit d'exporter le rapport dans le format souhaité (XML ou HTML) :


Le résultat :



Voici le code  :



[CmdletBinding(DefaultParameterSetName="Default")]

Param(
    [Parameter(Mandatory=$true,Position=1,ParameterSetName="Report")]
    [String]$ReportFolder,

    [Parameter(Mandatory=$true,Position=2,ParameterSetName="Report")]
    [ValidateSet("XML","HTML")]
    [String]$ReportType
    )

Try { Import-Module GroupPolicy |Out-Null}
Catch { Write-Warning "Cannot load GroupPolicy module."; Break }

If($psCmdlet.ParameterSetName -eq "Report"){
    If(!(Test-Path $ReportFolder)){
        Write-Warning "The Report folder doesn't exist or isn't available."
        Break
        }

    If($ReportFolder.chars(($ReportFolder.Length -1)) -ne "\"){
       $ReportFolder = $ReportFolder + "\"
        }
}

$AllGPO = Get-GPO -All
$TabAllRestrictedGroupsPolicies = @()

$AllGPO | foreach {
   
    [XML] $XMLReport = Get-GPOReport -Guid $_.Id -ReportType XML
    $RestrictedGroups = $null
    $RestrictedGroups = $XMLReport.DocumentElement.Computer.ExtensionData.Extension.ChildNodes|Where{$_.name -match "RestrictedGroups"}
    If ($RestrictedGroups -ne $null){
        $TabRestrictedGroups = @()
        $RestrictedGroups | foreach {
            $obj = New-Object psobject
            Add-Member -InputObject $obj -type NoteProperty -Name GroupName -Value $_.GroupName.Name.InnerText
            Add-Member -InputObject $obj -type NoteProperty -Name MemberOf -Value $_.MemberOf.Name.InnerText
            Add-Member -InputObject $obj -type NoteProperty -Name Members -Value $_.Member.Name.InnerText
            $TabRestrictedGroups += $obj
            }
        $GPO = New-Object psobject
        Add-Member -InputObject $GPO -type NoteProperty -Name Name -Value $XMLReport.DocumentElement.Name
        Add-Member -InputObject $GPO -type NoteProperty -Name GUID -Value $XMLReport.DocumentElement.Identifier.Identifier.InnerText
        Add-Member -InputObject $GPO -type NoteProperty -Name RestrictedGroups -Value $TabRestrictedGroups
        $TabAllRestrictedGroupsPolicies += $GPO
        }
    }

If($TabAllRestrictedGroupsPolicies.count -eq 0){
    Write-Host "No Group Policy has been found with Restricted Groups configuration"
    Break
    }

Switch ($psCmdlet.ParameterSetName) {
    "Report"  {
        Write-Host "Exporting GPO Reports"
        $TabAllRestrictedGroupsPolicies|Foreach{
            Get-GPOReport -Guid $_.GUID -ReportType $ReportType -Path ($ReportFolder + $_.Name + "." + $ReportType)
            }  
        }
    "Default" {
        Return $TabAllRestrictedGroupsPolicies
        }
    }



Le script peut être une base pour récupérer d'autres paramètres de GPO (Security Options, User Rights Assignement, ...)

A très bientôt

Aucun commentaire:

Enregistrer un commentaire