Script – Désactivation groupe AD

Il n’est pas possible à proprement parler de désactiver un groupe Active Directory.

Voici le processus de désactivation choisit :

  1. Saisie des groupes dans un forms PowerShell.
  2. Vérification de l’existence du groupe dans l’AD.
  3. Vérification de l’emplacement du groupe (pour savoir si il est déjà en archive).
  4. Si le groupe n’est pas dans l’OU Archive, sauvegarde des utilisateurs dans un fichier CSV.
  5. Si le fichier a bien été créé, changement de la description du groupe pour indiquer la date de désactivation, l’initiateur et le chemin du log.
  6. Déplacement du groupe dans l’OU Archive.
  7. Le groupe est vidé de ses utilisateurs.
  8. Si le groupe est bien vide, la désactivation est terminée.
#######################################################################################################
#
# Script de désactivation des groupes AD
#
# Auteur : Romain LETOT - Administrateur Systèmes & réseaux
# Date de Création : 17/07/2023
#
# Objet : 
# Ce script permet de procéder à une "désactivation" des groupes AD obsolète.
# Dans un premier temps, les membres du/des groupe(s) indiqués sont sauvegardés dans un fichier csv dans un partage.
# Ensuite on vient supprimer les membres du/des groupe(s) puis on change la description en affichant la date et l'initiateur de la désactivation en description.
# Enfin on déplace le groupe dans l'OU Archives dans l'AD
#
# Modifications : 
#
#
#######################################################################################################


#Variables Générales
$DATE = Get-Date -Format "yyyyMMdd-HH-mm-ss"
$DATEFORMAT1 = Get-Date -Format "dd/MM/yyyy"
$CURRENTUSER = $Env:UserName


#Variables Domaines
$OUTARGET = "OU=Groupes,OU=Archives,DC=senumerique,DC=local"


#Fenêtre de saisie des groupes à traiter
add-type -assembly System.Windows.Forms
    $form=New-Object System.Windows.Forms.Form
    $form.StartPosition='CenterScreen'
    $btn=New-Object System.Windows.Forms.Button
    $btn.Text='OK'
    $btn.DialogResult='Ok'
    $btn.Dock='bottom'
    $form.Controls.Add($btn)
    $btnCancel=New-Object System.Windows.Forms.Button
    $btnCAncel.Text='Annuler'
    $btnCancel.DialogResult='Cancel'
    $btnCancel.Dock='bottom'
    $form.Controls.Add($btnCancel)
    $tb=New-Object System.Windows.Forms.Textbox
    $tb.Multiline=$true
    $tb.Dock='Fill'
    $form.Controls.Add($tb)
    $form.add_load({$tb.Select()})
        
        if($form.ShowDialog() -eq 'Ok'){
            $tb.lines
        }else{
            Write-Host 'Annulation de la tâche' -fore red
           }

#Vérification si la saisie est vide 
if ([string]::IsNullOrEmpty($tb.lines)) {
    Write-Host "Erreur : Aucune donnée n'a été saisie" -ForegroundColor Red
    Exit
    }

Else {

    #Début de boucle Foreach
    Foreach($GROUP in $tb.lines){
       
        Write-Host "Traitement du groupe $GROUP"   
        Write-Host "Date d'exécution du traitement : $DATEFORMAT1 - Intervenant : $CURRENTUSER"

       
        #Variables Logs
        $PATHLOGS = "C:\admin\Backup_GRP\$GROUP-$DATE-LOG.txt"
        $PATHCSV = "C:\admin\Backup_GRP\ARCHIVES\$GROUP-SAVE.csv"


####################################################################################################
####################### Contrôle de l'existence du groupe dans l'AD ################################
####################################################################################################



                Try {
                    Get-ADGroup -identity $GROUP -ErrorAction Stop | Out-Null
                    Write-Host "Le groupe $GROUP existe dans le domaine."
        
                    Add-Content $PATHLOGS "Traitement du groupe $GROUP"
                    Add-Content $PATHLOGS "Date d'exécution du traitement : $DATEFORMAT1 - Intervenant : $CURRENTUSER"
                    Add-Content $PATHLOGS "---------------------------"
                    Add-Content $PATHLOGS "Le groupe $GROUP existe dans le domaine."
            
                    #Si le groupe existe, on détermine son emplacement et et vérifie si il est déjà dans l'OU Archive
                    $OUSOURCE = Get-ADGroup $GROUP | Select-Object DistinguishedName
                    Write-Host "Ancien Emplacement : $OUSOURCE"
                    Add-Content $PATHLOGS "Ancien Emplacement : $OUSOURCE" 
            
                        if ($OUSOURCE -like "@{DistinguishedName=CN=$GROUP,OU=Groupes,OU=Archives,DC=senumerique,DC=local}") {
                            Write-Host "Le groupe se trouve déjà dans l'OU Archive"
                            Add-Content $PATHLOGS "Le groupe se trouve déjà dans l'OU Archive"      
                        }
                        
                        Else {
            
                            Get-AdGroupMember -identity $GROUP | Select-Object @{ expression={$_.SamAccountName}; label="User&Group" } | Export-csv -path $PATHCSV -NoTypeInformation
                            (Get-Content $PATHCSV) | Foreach-Object {$_ -replace '"', ''} | Out-File $PATHCSV
            
                            #Vérification de la présence du fichier de log
                            $TESTPATH = Test-Path -Path $PATHCSV
            
                            If ($TESTPATH -eq "true") {
                                Write-Host "Le fichier de BACKUP a été créé sous $PATHCSV" -ForegroundColor Green
                                Add-Content $PATHLOGS "Le fichier de BACKUP a été créé sous $PATHCSV"
            
                                #Récupération du champ description dans le champ info et remplacement du champ description
                                $OLDDESCRIPTION = Get-ADGroup $GROUP -Properties * | Select-Object description
                                Set-ADGroup -identity $GROUP -Add @{info="$OLDDESCRIPTION"}
                                Set-ADGroup -identity $GROUP -Description "Groupe désactivé le $DATEFORMAT1 par $CURRENTUSER - Log sous $PATHCSV"
            
                                #Déplacement du groupe dans l'OU Archives
                                $DNSOURCE = (Get-ADGroup -Identity $GROUP).DistinguishedName
                                Move-ADObject -Identity $DNSOURCE -TargetPath $OUTARGET
            
                                #Vider le groupe de ses utilisateurs
                                Set-ADGroup -Identity $GROUP -clear member
            
                                #Vérification du contenu du groupe
                                $GRPEMPTY = Get-ADGroupMember $GROUP
            
                                    if ($null -eq $GRPEMPTY) {
                                    Write-Host "Le groupe a été déplacé dans l'OU Archive et a été vidé sur l'AD." -ForegroundColor Green
                                    Write-Host "---------------------------"
                                    Add-Content $PATHLOGS "Le groupe a été déplacé dans l'OU Archive et a été vidé sur l'AD."
                                    }
            
                                    Else {
                                    Write-Host "Une erreur s'est produite, veuillez vérifier le groupe sur l'AD." -ForegroundColor Red
                                    Write-Host "---------------------------"
                                    Add-Content $PATHLOGS "Une erreur s'est produite, veuillez vérifier le groupe sur l'AD."
                                    }
                        
                            }
                        
                    
                             Else {
                                Write-Host "Une erreur s'est produite, veuillez vérifier la présence du fichier de backup sous $PATHCSV" -ForegroundColor Red
                                Write-Host "Arrêt de la désactivation du groupe $GROUP sur l'AD." -ForegroundColor Red
                                Add-Content $PATHLOGS "Une erreur s'est produite, veuillez vérifier la présence du fichier de backup sous $PATHCSV"
                                Add-Content $PATHLOGS "Arrêt de la désactivation du groupe $GROUP sur l'AD"
                            }
                        }
                    }

                    Catch {
                        Write-Host "Le groupe $GROUP n'existe pas dans le domaine."
                        Write-Host "---------------------------"
                        Add-Content $PATHLOGS "Le groupe $GROUP n'existe pas dans le domaine."
                        Add-Content $PATHLOGS "---------------------------"
                        }


        Write-Host "`n`nAppuyez sur [ENTREE] pour fermer" -nonewline ; Read-Host

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *