diff --git a/Active Directory/ad_group_modifications.ps1 b/Active Directory/ad_group_modifications.ps1 new file mode 100644 index 0000000..6cfa6da --- /dev/null +++ b/Active Directory/ad_group_modifications.ps1 @@ -0,0 +1,198 @@ +#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 +} + +} \ No newline at end of file