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 :
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 »
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.