<#
    .SYNOPSIS
        This function compares the members of one group with the members of another. The comparison can be performed on objects that inherit from this group with the recursive mode

        Cette fonction compare les membres d'un groupe avec les membres d'un autre. La comparaisron peut être exécuté sur les objets qui héritent de ce groupe avec le mode recursif

    .DESCRIPTION
        This function compares the get-adgroupmember command result in recursive mode or not.
        It returns a table indicating the LDAP name of the objects as well as whether they are members of one or both groups.
        It requires the ActiveDirectory PowerShell module
    
     Cette fonction compare le résultat de commande get-adgroupmember en mode recursif ou non.
     Elle renvoie un tableau indiquant le nom LDAP des objets ainsi que s'ils sont membres d'un des deux groupes ou des deux.
     Elle s'appuye sur la commande Get-ADGroupMember et necessite le module ActiveDirectory

      

    .PARAMETER FistGroup
    Name of first group

    Nom du premier groupe 
    
    .PARAMETER SecondGroup
    Name of second group

    Nom du deuxième groupe
    
     .PARAMETER DomainController

     Set the domain controller to be used.  If omitted, a domain controller of the active domain is used.

     Permet de définir le contrôleur de domaine qui sera interrogé. Si omis un contrôleur de domaine du domaine Actif est utilisé.
     

     .PARAMETER Recusive
     

     If $true then the comparison is done on the members of the inherited groups
     If $false then the comparison is done on the direct members.
     $False is default value

     Si $true alors la comparaison se fait sur les membres des groupes imbriqués.
     Si $false alors la comparaison se fait sur les membres directes.
     $False est la valeur par défaut

    .EXAMPLE
    .\Compare-ADGroup.ps1 -FirstGroup "SDL-CT-Partage-Info" -SecondGroup "SG-Service-Technique" -Recursive $True


    Example of result :
    Exemple de résultat :
    
    UserDn   : CN=Patrick Dupond,OU=Utilisateurs,DC=htrab,DC=lan
    MemberOf : OnlyFirst

    UserDn   : CN=Philippe BARTH,OU=Utilisateurs,DC=htrab,DC=lan
    MemberOf : Both

    UserDn   : CN=Pierre Durand,OU=Utilisateurs,DC=htrab,DC=lan
    MemberOf : OnlySecond

    
    .NOTES
        Author:   Philippe BARTH 
        Version:  1.0
    #>


    # Déclaration des paramètres 
    param([string]$FirstGroup,[string]$SecondGroup,  [string]$DomainController = (Get-ADDomainController -Discover -Service GlobalCatalog).hostname,[string]$Recursive = $False)
    #gestion des erreurs
    Trap 
         {
         Write-Host $Error[0]
         continue
         } #End trap


#Load ActiveDirectory CmdLet
    
    if ((get-module | select name).name -notcontains "ActiveDirecTory")
        {
        Import-Module ActiveDirecTory
        } #End If Module AD
        
# If Recusive mode
if ($Recursive -eq $true)
        {
        $gSource = Get-ADGroupMember $FirstGroup -Server $domaincontroller -Recursive | Select -ExpandProperty distinguishedName

        $gdest = Get-ADGroupMember $SecondGroup -Server $domaincontroller  -Recursive | Select -ExpandProperty distinguishedName
        #write-host $gdest
        } #End If Recursive

# If Not Recusive mode
Else
    {
        $gSource = Get-ADGroupMember $FirstGroup -Server $domaincontroller  | Select -ExpandProperty distinguishedName
        $gdest = Get-ADGroupMember $SecondGroup -Server $domaincontroller   | Select -ExpandProperty distinguishedName
        
    } # End Else recursive
$result=@()
Foreach ( $user in $gsource)
    {
    if ( $gdest -contains $user) 
        {
        $result+= New-Object -TypeName PSObject -Property @{
                        MemberOf                   = "Both"
                        UserDn                   = $User
                  }
        } #End If $gdest -contains $user
    else 
        {
         $result+= New-Object -TypeName PSObject -Property @{
                        MemberOf                   = "OnlyFirst"
                         UserDn                   = $User
                  } 

        } #End Else
    } 
Foreach ( $user in $gdest)
    {
    if ( $gsource -notcontains $user) 
        {
        $result+= New-Object -TypeName PSObject -Property @{
                        MemberOf                   = "OnlySecond"
                        UserDn                   = $User
                        
                   }  #End new-object

        } #End else $gsource -contains $user
  
    }# End Foreach
return $result