Il n’est pas possible à proprement parler de désactiver un groupe Active Directory.
Voici le processus de désactivation choisit :
- Saisie des groupes dans un forms PowerShell.
- Vérification de l’existence du groupe dans l’AD.
- Vérification de l’emplacement du groupe (pour savoir si il est déjà en archive).
- Si le groupe n’est pas dans l’OU Archive, sauvegarde des utilisateurs dans un fichier CSV.
- 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.
- Déplacement du groupe dans l’OU Archive.
- Le groupe est vidé de ses utilisateurs.
- 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