#Script créé par Nicolas Lang - Sous licence CC-BY-SA #https://nicolaslang.fr ipmo activedirectory Set-Location $( [environment]::GetFolderPath("MyDocuments") ) $now = Get-Date -Format dd/MM/yyyy $from = "moi@domaine.com" $to = "lui@domaine.com" $smtpserver = "serveurmail.domaine.fr" if (!(Get-Module -name ActiveDirectory)) {throw("Impossible de trouver le module Active Directory")} function addthis([string]$groupname=$(throw("Nom de groupe obligatoire")),[string]$name=$null,$added=$null,$removed=$null) { if ($added -eq $null -and $removed -eq $null) {throw("Aucun indice d'ajout / retrait pour $groupname")} $objet = New-Object psobject $objet | Add-Member -MemberType NoteProperty -name "Date" -value $now $objet | Add-Member -MemberType NoteProperty -Name "Group_name" -Value $groupname $objet | Add-Member -MemberType NoteProperty -Name "Name" -Value $name $objet | Add-Member -MemberType NoteProperty -Name "Added" -Value $added $objet | Add-Member -MemberType NoteProperty -Name "Removed" -Value $removed return $objet } #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# ########################## CREATION DE LA BASE DES GROUPES ################################## #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# $listegroupes = Get-ADGroup -Filter * -Properties members | Select-Object -Property name,members | Sort-Object -Property name $array = New-Object System.Collections.ArrayList foreach ($groupe in $listegroupes) { $objet = New-Object psobject $groupe.members = $($groupe.members | foreach {$_.split(",")[0] -replace("^CN=","")}) $objet | add-member -MemberType NoteProperty -Name "name" -Value $groupe.name $objet | Add-Member -MemberType NoteProperty -Name "members" -Value $groupe.members $array.Add($objet) | Out-Null } if (!(Test-Path referenceadgroupes.xml)) { $listegroupes | Export-Clixml referenceadgroupes.xml -Force } else { $referenceadgroupes = Import-Clixml referenceadgroupes.xml $array | Export-Clixml newgroups.xml -Force $newgroups = Import-Clixml newgroups.xml #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# ########################### VERIFICATION DE CHAQUE GROUPE ################################### #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# $arraygroups = New-Object System.Collections.ArrayList #|~~~~~~~~~~~~~~~~~~~~~~~~~~~|# #| Reference VS. nouveau |# #|~~~~~~~~~~~~~~~~~~~~~~~~~~~|# $i = 1 foreach ($groupe in $referenceadgroupes) { Write-Progress -Status "Analyse" -Activity $($groupe.name) -PercentComplete ($i / $($referenceadgroupes.count) * 100) $i ++ $obj = New-Object PSobject $compareit = $null $compareit = $newgroups | Where-Object {$_.name -eq $($groupe.name)} #_____________________________ #1) Le groupe n'est pas trouvé #_____________________________ if (!$compareit) { #Si le groupe n'est pas présent dans la nouvelle liste il a été retiré $arraygroups.Add($(addthis -groupname $groupe.name -removed "X")) | Out-Null } #_____________________________ #2) La propriété membres de reference et différence sont nuls #_____________________________ elseif($groupe.members.Count -eq 0 -and $compareit.members.Count -eq 0) { #on ne fait rien } #_____________________________ #3) L'une ou l'autre des propriétés membres est égale à zero, mais leur count diffère #_____________________________ #Une erreur est causée lorsque l'on compare une valeur et un $null. Il faut donc filtrer. #Si le nombre de membres de la reference = zéro ou celle du nouveau = 0 et que groupe.members.count et compare.membre.count sont différents alors [...] elseif(($groupe.members.count -eq 0 -or $compareit.members.count -eq 0) -and ($groupe.members.count -ne $compareit.members.count)) { if ($groupe.members.count -gt $compareit.members.Count) { $toadd = $groupe.members $groupname = $groupe.name $removed = "X" $added = $null } else { $toadd = $compareit.members $groupname = $compareit.name $removed = $null $added = "X" } foreach ($membre in $toadd) { $arraygroups.add($(addthis -groupname $groupname -name $($membre) -added $added -removed $removed)) } } #_____________________________ #4) aucun des cas précedents n'est valide #_____________________________ else { $changes = $null $changes = Compare-Object -ReferenceObject $groupe.members -DifferenceObject $compareit.members foreach ($change in $changes) { switch ($($change.sideindicator)) { "=>" {$arraygroups.add($(addthis -groupname $($groupe.name) -name $($change.inputobject) -added "X"));break} "<=" {$arraygroups.add($(addthis -groupname $($groupe.name) -name $($change.inputobject) -removed "X"));break} default {throw("Erreur pas d'indice!")} }#foreach ($change in $changes) } } }#foreach ($groupe in $referenceadgroupes) #|~~~~~~~~~~~~~~~~~~~~~~~~~~~|# #| Nouveau VS. reference |# #|~~~~~~~~~~~~~~~~~~~~~~~~~~~|# $i = 1 foreach ($groupe in $newgroups) { Write-Progress -Status "Recherche de nouveaux groupes" -PercentComplete ($i / $($referenceadgroupes.Count) * 100) -Activity $groupe.name $i++ $compareit = $null $compareit = $referenceadgroupes | Where-Object {$_.name -eq $($groupe.name)} if (!$compareit) { #Le groupe n'existe pas dans l'ancienne liste. Il est donc crée $arraygroups.Add($(addthis -groupname $groupe.name -added "X")) foreach ($member in $groupe.members) { $arraygroups.Add($(addthis -groupname $groupe.name -name $member -added "X")) } } } Move-Item .\newgroups.xml -Destination .\referenceadgroupes.xml -Force $arraygroups | Export-Csv -Path .\changements_groupes.csv -Delimiter ";" -Encoding UTF8 -NoTypeInformation -Append if ($arraygroups) { $body = $null foreach ($line in $arraygroups) { [string]$body += $line -replace("@{","") -replace(";","`t") -replace ("}","`n") } Send-MailMessage -from $from -to $to -SmtpServer $smtpserver -Subject "Ajouts dans les groupes AD le $now" -Body "Voici les groupes modifiés : `n$body" -Attachments .\changements_groupes.csv -Encoding UTF8 } }