2023-12-16 16:53:59 +01:00
#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 )
2023-12-16 16:56:04 +01:00
{
throw ( " Aucun indice d `' ajout / retrait pour $groupname " )
}
2023-12-16 16:53:59 +01:00
$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
}
}