Sep 08 2010

Powershell: Rechercher un paramètre de GPO.

Dans cet article nous allons voir comment faire un script qui recherche des paramètres de GPO,  ce point a été abordé par Lindsay Harris dans cet article et celui ci. L’avantage de sa méthode est que les critères de recherche peuvent être vraiment détaillés, par contre la méthode consiste a exporter toutes les GPOs de votre domaine au format XML et effectuer une analyse de ces fichiers, le traitement du script peut donc s’avérer très long si vous disposez de beaucoup de GPOs. La méthode que je vous propose est plus performante en termes de temps de traitement mais offre des critères de recherche plus limités, à vous de voir celle qui vous convient le mieux.

Comme nous l’indique Florian Frommherz dans ce récent post il existe une fonction de recherche de GPO dans la GPMC, vous pouvez d’ailleurs regarder une video de démonstration sur Technet pour plus de détails. La recherche d’un critère est très rapide mais limitée, car elle se présente sous la forme d’une liste déroulante. Le but de ce post est de retranscrire cette méthode de recherche avec un script PowerShell, un fois les GPOs filtrées selon notre critère de recherche nous pourrons effectuer des opérations sur celles ci grâce au Group Policy CmdLets.

Afin de voir quelle requête est lancée par la GPMC lors de la recherche d’un paramètre de GPO nous allons activer le mode verbose de log de la console. Réalisons maintenant une recherche de toutes les GPOs ayant le paramètre “redirection de dossiers” de configuré dans la partie utilisateur de la stratégie.

Puis nous allons consulter le fichier %TEMP%\gpmgmt.log afin de voir quelle opération a été tracée:

[VERBOSE] CGPMSearch::DumpCriteria(): Dumping 1 criteria ================
[VERBOSE] CGPMSearch::DumpCriteria(): Property: “gpoUserExtensions”
[VERBOSE] CGPMSearch::DumpCriteria():    Operation – Contains
[VERBOSE] CGPMSearch::DumpCriteria():     Value (string) “{25537BA6-77A8-11D2-9B6C-0000F8080861}“.
[VERBOSE] CGPMSearch::DumpCriteria(): End criteria dump ==================

Le filtre de recherche se fait via un simple attribut LDAP de l’objet de GPO situé dans le container “CN=System,CN=Policies,DC=%domain%“. Utilisons adsiedit.msc afin de voir plus en détails les attributs d’un objet de stratégie de groupes:

On remarque que l’attribut gPCUserExtensionNames est de la forme [%GUID1% %GUID2% ….], Le GUID est une valeur fixe qui correspond au type de critère recherché: {25537BA6-77A8-11D2-9B6C-0000F8080861} pour la redirection de dossiers dans la partie utilisateur de la GPO. Une GPO pouvant avoir plusieurs types de paramètres d’activés, par exemple “script de logon” et “redirection de dossiers”, les GUIDs sont mis simplement les uns à la suite des autres dans cet attribut.

Pour la partie des paramètres ordinateur de la GPO c’est le même principe sauf qu’il s’agit de l’attribut gPCMachineExtensionNames de la GPO. Il nous reste donc à inventorier les différents GUID correspondant aux paramètres de GPOs proposés dans la liste déroulante en effectuant une recherche via la GPMC et en analysant le fichier de log. Vu le nombre de paramètres de recherche possibles, 30 pour la configuration utilisateur et 35 pour la configuration ordinateur, les résultats sont disponibles dans ce fichier Excel à télécharger:

En Powershell il nous suffit de faire une simple recherche avec Get-ADObject pour rechercher les GPOs contenant une redirection de dossiers, le filtre recherche les objets de type GPO (ObjectClass=GroupPolicyContainer) et ayant l’attribut gPCUserExtensionNames qui contient le GUID correspondant à la redirection de dossiers:

$ObjGPOs = Get-ADObject -Filter {(ObjectClass -eq "groupPolicyContainer") -and (gPCUserExtensionNames -like *{25537BA6-77A8-11D2-9B6C-0000F8080861}*)}

Si le résultat retourné par $ObjGPOs n’est pas nul, nous pouvons grâce au CmdLet Get-GPOReport (ne pas oublier d’importer le module Grouppolicy)  exporter le rapport des GPOs trouvées au format HTML, pour cela nous avons besoin d’entrer en paramètre de la commande (-guid) le GUID de la GPO, mais sans les caractères “{}”:

Import-Module GroupPolicy;
if ($ObjGPOs -ne $Null) {
foreach($ObjGPO in $ObjGPOs)
    {      $guid = [System.Text.RegularExpressions.Regex]::Replace($ObjGPO.Name,"[{}]","")
    $pathtosavef = "C:\export\" +  (get-GPO -guid $guid).DisplayName + ".html"
    get-GPOReport -guid $guid -ReportType html -Path $pathtosavef
    }
}

L’exemple ci dessus exporte les rapports de GPO au format %Nom_GPO%.html dans le dossier c:\export. Nous allons donc faire un script qui demande si nous recherchons un configuration ordinateur ou utilisateur puis le type de paramètre de GPO à chercher, nous lançons donc le script search_GPO_2008.ps1 avec comme paramètre optionnel -report qui indique le chemin de destination des fichiers html:

Dans l’exemple ci dessus nous recherchons une GPO ordinateur pour lequel un paramètre de service est configuré à travers les préférences de stratégie de groupe , nous indiquons donc 2 puis 20. Si vous n’indiquez pas de paramètre -report, aucun rapport html n’est généré mais les informations sur le nom de la GPO, son GUID et sa date de création sont tout de même affichés.Pour télécharger le script c’est ici:


Pour ceux qui ne sont pas encore sous Active Directory 2008, voici un script équivalent pour la version 2003, réalisé à l’aide des Quest AD Cmdlets, la fonction d’export au format HTML n’est pas disponible car il n’y a pas (à ce jour), de CmdLets pouvant réaliser cette opération. Ci dessous le lien pour télécharger search_GPO_2003.ps1:

Le principe de fonctionnement est le même:

Vous pouvez adapter le script search_GPO_2008.ps1 afin de faire d’autres types de manipulations sur les GPOs issues de vôtre filtre de recherche, par exemple les sauvegarder dans un dossier particulier avec le CmdLet Backup-GPO etc…

This post is also available in: Anglais

No Comments

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

*

WordPress Themes

Blossom Icon Set

Software Top Blogs