Aller au contenu

Gestion des alias

Ce script PowerShell aide à la gestion des adresses mail ou alias des utilisateurs d'un domaine Active Directory.

# Chargement des modules nécessaires
Import-Module ActiveDirectory

# Fonction pour vérifier si une adresse email est déjà attribuée (adresse principale ou alias)
function Get-ADObjectByEmail {
    param (
        [string]$email
    )
    $emailFilter = "(proxyAddresses -eq 'SMTP:$email')"
    $user = Get-ADUser -Filter "EmailAddress -eq '$email' -or $emailFilter" -Properties EmailAddress, proxyAddresses
    if ($user -eq $null) {
        $group = Get-ADGroup -Filter $emailFilter -Properties proxyAddresses
        return $group
    }
    return $user
}

# Fonction pour rechercher des comptes similaires
function Search-SimilarAccounts {
    param (
        [string]$name
    )
    $nameParts = $name -split ' '
    $filter = "*$($nameParts[0])*"
    if ($nameParts.Length -gt 1) {
        $filter += "*$($nameParts[1])*"
    }

    $accounts = @()
    $accounts += Get-ADUser -Filter "SamAccountName -like '$filter' -and Enabled -eq 'True'" -Properties SamAccountName, DisplayName
    $accounts += Get-ADGroup -Filter "SamAccountName -like '$filter'" -Properties SamAccountName, DisplayName

    return $accounts
}

# Fonction pour ajouter un alias à un utilisateur ou un groupe
function Add-EmailAlias {
    param (
        [string]$targetUser,
        [string]$alias
    )
    $adObject = Get-ADObject -Filter {SamAccountName -eq $targetUser} -Properties objectClass, proxyAddresses

    if ($adObject -eq $null) {
        Write-Host "Le compte $targetUser n'existe pas."
        Log-Action "Le compte $targetUser n'existe pas."
        return
    }

    if ($adObject.proxyAddresses -contains "smtp:$alias") {
        Write-Host "Le compte $targetUser possède déjà l'alias $alias."
        Log-Action "Le compte $targetUser possède déjà l'alias $alias."
        return
    }

    if ($adObject.objectClass -eq 'group') {
        Write-Host "Le compte $targetUser est un groupe. Ajout de l'alias en cours..."
        Set-ADGroup -Identity $targetUser -Add @{proxyAddresses="smtp:$alias"}
        Write-Host "Alias ajouté avec succès au groupe $targetUser."
        Log-Action "Alias ajouté avec succès au groupe $targetUser."
    } elseif ($adObject.objectClass -eq 'user') {
        Write-Host "Le compte $targetUser est un utilisateur AD. Ajout de l'alias en cours..."
        Set-ADUser -Identity $targetUser -Add @{proxyAddresses="smtp:$alias"}
        Write-Host "Alias ajouté avec succès à l'utilisateur $targetUser."
        Log-Action "Alias ajouté avec succès à l'utilisateur $targetUser."
    } else {
        Write-Host "Le compte $targetUser n'est ni un utilisateur AD ni un groupe."
        Log-Action "Le compte $targetUser n'est ni un utilisateur AD ni un groupe."
    }
}

# Fonction pour journaliser les actions
function Log-Action {
    param (
        [string]$message
    )
    $timestamp = Get-Date -Format "yyyyMMddHHmmss"
    $logEntry = "$timestamp - $message"
    $logFile = "$PSScriptRoot\add_alias_proxyadresses.log"

    if (-not (Test-Path $logFile)) {
        New-Item -Path $logFile -ItemType File -Force
    }

    Add-Content -Path $logFile -Value $logEntry
}

# Fonction pour demander une confirmation
function Confirm-Action {
    param (
        [string]$message
    )
    $response = Read-Host "$message (O/N)"
    return $response -eq 'O'
}

# Fonction pour demander la sélection d'un compte
function Select-Account {
    param (
        [array]$accounts
    )

    if ($accounts.Length -eq 0) {
        Write-Host "Aucun compte correspondant trouvé."
        return $null
    }

    Write-Host "Comptes trouvés :"
    for ($i = 0; $i -lt $accounts.Length; $i++) {
        Write-Host "$($i + 1). $($accounts[$i].SamAccountName) - $($accounts[$i].DisplayName)"
    }
    Write-Host "0. Autre (nouvelle saisie)"

    $selection = Read-Host "Veuillez entrer le numéro du compte à sélectionner"
    if ($selection -eq '0') {
        return $null
    } elseif ($selection -match '^\d+$' -and $selection -gt 0 -and $selection -le $accounts.Length) {
        return $accounts[$selection - 1]
    } else {
        Write-Host "Sélection invalide."
        exit
    }
}

# Fonction pour demander et vérifier une adresse email
function Get-EmailInput {
    do {
        $email = Read-Host "Veuillez entrer l'adresse email à traiter"
        if ($email -match '^[\w\.-]+@[\w\.-]+\.\w+$') {
            return $email
        } else {
            Write-Host "Adresse email invalide. Veuillez réessayer."
        }
    } while ($true)
}

# Fonction pour demander et vérifier le nom d'utilisateur ou de groupe
function Get-TargetUserInput {
    do {
        $targetUser = Read-Host "Veuillez entrer le compte auquel ajouter l'alias"
        if ($targetUser -match '^[\w\.-]+$') {
            return $targetUser
        } else {
            Write-Host "Nom de compte invalide. Veuillez réessayer."
        }
    } while ($true)
}

# Fonction pour générer un rapport d'exécution
function Generate-Report {
    param (
        [string]$logFile
    )
    $reportFile = "$PSScriptRoot\Add_Alias_ProxyAdresses_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
    Copy-Item -Path $logFile -Destination $reportFile -Force
    Write-Host "Rapport d'exécution généré : $reportFile"
}

# Demande de l'adresse email à traiter
$email = Get-EmailInput

# Vérification de l'adresse email
$adObject = Get-ADObjectByEmail -email $email

if ($adObject -ne $null) {
    Write-Host "Impossible d'ajouter cette adresse en tant qu'alias car elle est déjà attribuée à $($adObject.SamAccountName)."
    Log-Action "Adresse $email déjà attribuée à $($adObject.SamAccountName)."

    if (Confirm-Action "Voulez-vous supprimer cette attribution ?") {
        if (Confirm-Action "Êtes-vous sûr de vouloir supprimer l'adresse $email de $($adObject.SamAccountName) ?") {
            try {
                if ($adObject.objectClass -eq 'user') {
                    Set-ADUser -Identity $adObject -Remove @{proxyAddresses="smtp:$email"}
                    Write-Host "Adresse $email supprimée de l'utilisateur $($adObject.SamAccountName)."
                    Log-Action "Adresse $email supprimée de l'utilisateur $($adObject.SamAccountName)."
                } elseif ($adObject.objectClass -eq 'group') {
                    Set-ADGroup -Identity $adObject -Remove @{proxyAddresses="smtp:$email"}
                    Write-Host "Adresse $email supprimée du groupe $($adObject.SamAccountName)."
                    Log-Action "Adresse $email supprimée du groupe $($adObject.SamAccountName)."
                }
            } catch {
                Write-Host "Une erreur s'est produite lors de la suppression de l'adresse $email."
                Log-Action "Erreur lors de la suppression de l'adresse $email de $($adObject.SamAccountName) : $_"
                exit
            }

            # Après suppression, proposer d'ajouter l'alias à un autre compte
            do {
                $targetUser = Get-TargetUserInput
                $similarAccounts = Search-SimilarAccounts -name $targetUser
                $selectedAccount = Select-Account -accounts $similarAccounts
            } while ($selectedAccount -eq $null)

            if (Confirm-Action "Voulez-vous ajouter l'alias $email à l'utilisateur (ou groupe) $($selectedAccount.SamAccountName) ?") {
                Add-EmailAlias -targetUser $selectedAccount.SamAccountName -alias $email
            } else {
                Write-Host "Ajout de l'alias annulé."
                Log-Action "Ajout de l'alias $email à $($selectedAccount.SamAccountName) annulé."
            }
        } else {
            Write-Host "Suppression annulée."
            Log-Action "Suppression de l'adresse $email annulée."
            exit
        }
    } else {
        Write-Host "Aucune modification effectuée."
        Log-Action "Aucune modification effectuée pour l'adresse $email."
        exit
    }
} else {
    Write-Host "L'adresse email $email n'est pas attribuée à un compte existant."
    Log-Action "L'adresse email $email n'est pas attribuée à un compte existant."

    # Demande du compte auquel ajouter l'alias
    do {
        $targetUser = Get-TargetUserInput
        $similarAccounts = Search-SimilarAccounts -name $targetUser
        $selectedAccount = Select-Account -accounts $similarAccounts
    } while ($selectedAccount -eq $null)

    if (Confirm-Action "Voulez-vous ajouter l'alias $email à l'utilisateur (ou groupe) $($selectedAccount.SamAccountName) ?") {
        Add-EmailAlias -targetUser $selectedAccount.SamAccountName -alias $email
    } else {
        Write-Host "Ajout de l'alias annulé."
        Log-Action "Ajout de l'alias $email à $($selectedAccount.SamAccountName) annulé."
    }
}

# Génération du rapport d'exécution
Generate-Report -logFile "$PSScriptRoot\add_alias_proxyadresses.log"