Rechercher dans les GPO de votre Active Directory avec PowerShell

Bannière Active Directory

N’avez-vous jamais eu besoin de rechercher la présence d’un réglage précis dans l’ensemble de vos GPO ?

Personnellement, c’est un besoin que je rencontre très régulièrement lorsque je travaille avec des clients sur de très gros environnements Active Directory. Parfois, même les entreprises elles-mêmes avouent avoir perdu le contrôle et le suivi sur les GPO qui sont créées au sein de leur environnement. Si bien qu’il est parfois possible de découvrir des réglages qui sont appelés plusieurs fois ou même qui s’opposent au sein d’un même domaine Active Directory.

Malheureusement, il n’existe pas de moteur de recherches dans la GPMC (en tout cas pas nativement). Et pourtant, qu’est-ce que ça serait pratique, je vous laisse imaginer le Google de vos GPO directement dans la console… ça serait parfait. Mais bon, comme ça n’arrivera peut-être jamais, il faut bien trouver une solution alternative. 🙂

Je vous propose d’utiliser le script PowerShell suivant pour rechercher la présence d’un terme spécifique au sein de l’ensemble de vos GPO d’un domaine Active Directory spécifique :

# Get the string we want to search for 
$string = Read-Host -Prompt "What string do you want to search for?" 
 
# Set the domain to search for GPOs 
$DomainName = $env:USERDNSDOMAIN 
 
# Find all GPOs in the current domain 
write-host "Finding all the GPOs in $DomainName" 
Import-Module grouppolicy 
$allGposInDomain = Get-GPO -All -Domain $DomainName 
[string[]] $MatchedGPOList = @()

# Look through each GPO's XML for the string 
Write-Host "Starting search...." 
foreach ($gpo in $allGposInDomain) { 
    $report = Get-GPOReport -Guid $gpo.Id -ReportType Xml 
    if ($report -match $string) { 
        write-host "********** Match found in: $($gpo.DisplayName) **********" -foregroundcolor "Green"
        $MatchedGPOList += "$($gpo.DisplayName)";
    } # end if 
    else { 
        Write-Host "No match in: $($gpo.DisplayName)" 
    } # end else 
} # end foreach
write-host "`r`n"
write-host "Results: **************" -foregroundcolor "Yellow"
foreach ($match in $MatchedGPOList) { 
    write-host "Match found in: $($match)" -foregroundcolor "Green"
}

Le script n’est pas de moi et vous pouvez retrouver la publication originale sur l’article suivant (en anglais) : Search all GPOs in a domain for some text.

Assurez-vous par contre d’exécuter ce script sur une machine qui dispose de la GPMC. Si ce n’est pas le cas, pensez à l’installer sinon il ne fonctionnera pas ! 😉

Installation du composant Group Policy Management (console) depuis le Server Manager
Installation du composant Group Policy Management (console) depuis le Server Manager

Une fois que c’est fait, il vous suffit de l’exécuter dans une invite de commandes PowerShell ou bien l’ISE. La seule question qu’il va vous poser est le mot que vous recherchez. Et là, vous pourrez remplacer par un élément de réglage que vous cherchez.

Exécution du script PowerShell pour rechercher dans vos GPO
Exécution du script PowerShell pour rechercher dans vos GPO

Ce script est idéal si vous cherchez à résoudre les conflits et trouver les réglages qui sont appelés à plusieurs reprises dans différentes GPO.

Vous retrouverez également une seconde alternative de script PowerShell en consultant le second lien suivant (toujours en anglais) : Searching a GPO for a specific setting with Powershell.