none
Exportation GPO par OU RRS feed

  • Question

  • Bonjour l'équipe, 

    Pourriez vous s'il vous plait m'informer par quel moyen je pourrais faire une exportation des GPOs par OU (une ou plusieurs) avec toutes les GPOLinks et InheritedGPOlinks en détail sur un html ? 

    Merci bcp pour votre support. 

    mercredi 8 décembre 2021 08:40

Toutes les réponses

  • ci-dessous le Script powershell 

    $OUS = Get-ADOrganizationalUnit -Filter {name -like "*Axa Computers*"} |select -expandproperty distinguishedname 


    foreach ($OU in $OUS){
    $counter = 0
    $gpos = Get-GPInheritance -target "$OU" |select -ExpandProperty inheritedgpolinks 

    foreach ($gpo in $gpos){
    $counter++
    $gponame = $gpo.displayname
    write-host $counter","$gponame 


    mercredi 8 décembre 2021 10:16
  • Bonjour oukaouna

    C'est toujours le même principe :

    • Collecte des info et mise en variable
    • Export dans un fichier au format désiré.

    Ci-dessous, un exemple complet, que j'ai largement commenté pour la compréhension.

    J'ai fait le choix d'utiliser le module PSWriteHTML pour l'export en HTML car ce dernier offre des possibilités plus qu'intéressantes pour un rapport avec ce format : mise en forme conditionnelle, zones qui peuvent s'étendre ou se contracter, multi-onglets, trie, ... bref du html dynamique.

    #region Utilisation de TLS1.2
    # Paramétrage pour utiliser TLS1.2 pour mettre à jour les modules sur powershellGallery à partir du 01/04/2020
    # ref : https://devblogs.microsoft.com/powershell/powershell-gallery-tls-support/
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    #endregion Utilisation de TLS1.2
    
    #region Vérification si les modules sont installés, si non téléchargement ou arrêt
    Write-Output "Vérification que le module GroupPolicy est installé"
    If (-not (Get-Module -ListAvailable -Name GroupPolicy))
    {
        Write-Output "Le Module n'existe pas sur la machine"
        break
    }
    
    Write-Output "Vérification que le module PSWriteHtml est installé"
    If (-not (Get-Module -ListAvailable -Name PSWriteHtml))
    {
        # On fait l'installation pour l'utilisateur courant, on pourrait le faire pour tous les utilisateurs de la machine tout aussi bien, mais il faudrait pour ce faire exécuter le script en "Run As Administrator"
        Try
        {
            Write-Output "Le module PSWriteHtml n'est pas installé"
            Write-Output "Téléchargement et installation ... : "
            Install-Module PSWriteHTML -Force -Scope CurrentUser -ErrorAction stop
        }
        Catch
        {
            Write-Output "Le module n'a pu être installé. Fin du script."
            Write-Output "Une erreur est survenue. Message d'erreur : $_."
            Break
        }
    }
    #endregion Vérification si les modules sont installés, si non téléchargement ou arrêt
    
    #region Importation des modules pour avoir les cmdlets disponibles
    Write-Output "Import du module PSWriteHtml ... "
    Import-Module PSWriteHTML
    Write-Output "Import du module GroupPolicy ... "
    Import-Module GroupPolicy
    #endregion Importation des modules pour avoir les cmdlets disponibles
    
    #region Declarations
    # Date utilisée pour horodater les noms de fichier
    $Date = Get-Date -Format "dd_MM_yyyy"
    $ReportPath = "$PSScriptRoot\GPOReport-du-$Date.html"
    Write-Output "Nom du fichier rapport qui sera généré : $ReportPath"
    #endregion Declarations
    
    #region collecte de toutes les OUs
    $OUS = Get-ADOrganizationalUnit|Select-Object -ExpandProperty DistinguishedName
    #endregion collecte de toutes les OUs
    
    #region Initialisation
    $GPOLinks = @()
    #endregion Initialisation
    
    #region Paramétrage du comportement par défaut de certaines cmdlets
    Write-Output "Paramétrage du comportement par défaut de certaines cmdlets : "
    $PSDefaultParameterValues = @{
        "New-HTMLSection:HeaderBackGroundColor" = "Green"
        "New-HTMLSection:CanCollapse"           = $true
    }
    $PSDefaultParameterValues
    #endregion Paramétrage du comportement par défaut de certaines cmdlets
    
    #region traitement de chaque OU
    foreach ($OU in $OUS)
        {
        # Collecte des GPOs liées à l'OU en cours de traitement
        $GPOs = Get-GPInheritance -Target $OU
    
        foreach ($gpo in $GPOs)
            {
            $GpoInfo = Get-Gpo -Name $gpo.Displayname
            $GPOLinks += $GpoInfo
            }
        }
    #endregion traitement de chaque OU
    
    #region Export de $Export au format html
    New-HTML -FilePath $ReportPath  -Online -ShowHTML {
        #1er Onglet : Inventaire GPO
        New-HTMLTab -Name 'GPO Info' {
            # Ici on va mettre les informations qu'on a préalablement mis dans la variable $GpoLinks
            New-HTMLSection -HeaderText "Liaison des GPOs" {
                # Selection des propriétés de $GpoLinks qui m'intéressent
                $GPOLinks | Select-Object -Property ContainerName, Path, GpoInheritanceBlocked, GPOLinks, InheritedGpoLinks, Description, CreationTime, ModificationTime
                # Nota : Il y a d'autres propriétés qui peuvent également être ajoutées au besoin
                New-HTMLTable -DataTable $GPOLinks {
                    New-TableContent -ColumnName "Path", "GpoInheritanceBlocked", "GPOLinks", "InheritedGpoLinks", "Description", "CreationTime", "ModificationTime" -Alignment center
                    New-TableContent -ColumnName "ContainerName" -Alignment center -Color White -BackGroundColor Green
                    # ici je fais une mise en forme conditionnelle sur InheritedGpoLinks. Je mets en rouge si héritage bloqué pour attirer l'attention
                    New-TableCondition -Name "InheritedGpoLinks" -ComparisonType string -Operator like -Value "True" -BackgroundColor red -Color white
                }#end new-htmltable
            }#end new-htmlSection
        <# Je conviens que c'est un peu ridicule ici, d'avoir mis un onglet (Tab) alors qu'on n'en a qu'un seul. 
        L'intéret réside cependant dans le fait que tu peux avoir collecté d'autres infos et les mettre soit dans un autre onglet, soit dans une autre section, ou même dans une autre table dans la même section.
        Il suffit de répliquer le bloc ci-dessus. 
        #>
       } #end-NewHtmlSection
    } #end New-Html
    
    Write-Output "Rapport disponible : $ReportPath"
    #endregion Export de $Export au format html
    
    

    C'est largement adaptable au besoin. Dans le même rapport, tu pourrais

    • ajouter les GPOs avec les sections Computers et/ou Users désativées
    • GPOs qui ne sont liées à aucune OU
    • GPOs vides de tout paramètre
    • GPOs sans propriétaire
    • GPOs enforced et ordre d'application des GPO par OU.
    • OUs avec Héritage des GPOs bloqué.
    • GPOs avec un logon Script (Utilisateur - Computer - Utilisateur et/ou Computer)
    • ...

    et tout cela dans le même rapport, en jouant avec les onglets (tab), sections ou tables, selon le besoin. 

    Ce qui importe ce n'est pas tant le code en tant que tel, mais la méthodologie.

    Nota : je n'ai pas pris le temps de le tester, il pourrait rester une coquille typographique.

    Cordialement

    Olivier

    mercredi 8 décembre 2021 11:21