198 lines
6.9 KiB
PowerShell
198 lines
6.9 KiB
PowerShell
#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
|
|
}
|
|
|
|
} |