Si la console gpmc.msc permet de parcourir toutes les GPO ainsi que leurs liens, cela n’est pas directement possible avec Powershell et la commande Get-GPO qui ne retournera que les informations de base de la GPO.
Afin de pouvoir obtenir les liens dans Powershell, il faut ruser un peu ; dans les deux scripts Powershell suivants, j’ai donc utilisé une technique de sioux consistant à réaliser un rapport au format XML de la GPO (grâce à Get-GPOReport) et à parcourir ledit fichier XML pour y identifier les liens grâce aux balises <LinksTo>.
Ce premier script liste toutes les GPO qui n’ont aucun lien, activé ou non :
1 2 3 4 5 6 7 8 9 10 11 | Write-Host "Unlinked GPO listing script" Write-Host "===========================" Write-Host "Working… Please wait.`r`n" $GPOlist = Get-GPO -all foreach ( $GPO in $GPOList ){ [xml] $xmlreport = Get-GPOReport -Guid $GPO .Id -Report xml if ( $xmlreport .GPO.LinksTo.Count -eq 0){ Write-Host $GPO .DisplayName ; $count +=1} } Write-Host "`r`nUnlinked GPO count:" $count Write-Host "GPO parsed:" $gpolist .Length Write-Host "Done." |
Ce deuxième script attend en paramètre le nom d’une GPO et retourne dans la console Powershell les objets auxquels cette GPO est liée. Par exemple, on appellera le script ainsi : .\win_gpolinks.ps1 -gpo « SRV-2016-Security-V3 »
1 2 3 4 5 6 | Param ( [string] $gpoinput ) $gpo = Get-GPO $gpoinput [xml] $report = Get-GPOReport -Guid $gpo .Id -Report xml foreach ( $link in $report .GPO.LinksTo){ Write-Host $link .SOMPath } |
A noter qu’il est nécessaire d’avoir les RSAT d’installés sur la station (si ce n’est pas un DC) depuis laquelle le script est exécuté ; il peut également être nécessaire d’appeler Import-Module GroupPolicy pour exécuter les cmdlets Get-GPO et Get-GPOReport.