17/11/2024

PowerShell

PowerShell et Active Directory : Modifier le domaine des adresses mails

I. Présentation

logo-mail1Récemment, j'ai eu la nécessité de modifier l'ensemble des adresses e-mail des utilisateurs de l'Active Directory, ceci dans le but de changer le domaine présent dans l'adresse e-mail. Par exemple, on imagine passer toutes les adresses [email protected] en [email protected].

Je n'étais pas très motivé à l'idée de modifier cela au sein de plusieurs centaines de comptes utilisateurs... J'ai donc créé un script en PowerShell qui allait travailler pour moi. Cela permet aussi de faire un one shot lors de la migration plutôt qu'au cas par cas.

Ce script est fonctionnel, testé dans un environnement de production.

II. Le script PowerShell

Le script en lui-même n'est pas très long, mais, j'ai ajouté des commentaires pour qu'il soit compréhensible plus facilement et adaptable grâce aux trois variables :

  • DomainOld : Domaine actuel (qui doit être remplacé)
  • DomainNew : Domaine à venir (qui remplace DomainOld)
  • Base : Où se placer dans l'annuaire pour effectuer la recherche d'utilisateurs à modifier, si l'on se place sur la racine de l'annuaire tous les utilisateurs seront concernés.
# Chargement du module PowerShell pour Active Directory
Import-Module ActiveDirectory

# Définir le domaine actuel (DomainOld) et le domaine nouveau (DomainNew)
$DomainOld = "neoflow.fr"
$DomainNew = "it-connect.fr"

# Définir la base dans l'annuaire
$Base = "OU=Collaborateurs,DC=it-connect,DC=fr"

### PHASE DE MODIFICATION DES ADRESSES MAILS
# Lister les utilisateurs de l'annuaire (avec le champ mail compris)
Get-ADUser -Filter * -Properties mail -SearchBase $Base  | foreach{
    # Si l'adresse email n'est pas null, on peut changer le domaine
    if  ($_.mail -ne $null){    

        # Définir la variable $MailNew qui est égal à l'adresse email actuelle de l'utilisateur
        # dans laquelle on remplace le domaine actuel par le domaine nouveau.
        $MailNew = ($_.mail).Replace("$DomainOld","$DomainNew")

        # Pour chaque utilisateur qui dispose d'une adresse email
        # On définit une nouvelle adresse email égale à $MailNew
        Set-ADUser -Identity $_.DistinguishedName -EmailAddress $MailNew
    }
}

### PHASE DE CONTROLE DES CHANGEMENTS
# Lister les utilisateurs de l'annuaire (avec le champ mail compris)
Get-ADUser -Filter * -Properties mail -SearchBase $Base | foreach{

        # Si la valeur Active Directory pour le champ mail contient la valeur du nouveau domaine (DomainNew)
        # Cela signifie que l'adresse est bien changée dans l'annuaire -> On affiche un message OK
        if ($_.mail -match $DomainNew){
           Write-Host $_.Name ": Bascule de l'adresse -->" $_.mail ": OK" -ForegroundColor Green
        # Si l'adresse mail est différente : 
        }else{
           Write-Host $_.Name ": Pas d'adresse / Adresse différente de" $DomainOld "("$_.mail")" -ForegroundColor Red
        }
}

Lorsque l'on exécutera le script, un résultat sera affiché pour chaque utilisateur.

  • S'il y a eu un changement :

Nom Prénom : Bascule de l'adresse --> [email protected] : OK

  • S'il n'y a pas eu de changement :

Nom Prénom : Pas d'adresse / Adresse différente de it-connect.fr ( )

Nom Prénom : Pas d'adresse / Adresse différente de it-connect.fr ([email protected])

En fait, si l'utilisateur est un cas particulier est que son adresse e-mail n'a rien à voir avec votre entreprise, par exemple @123.fr dans ce cas le changement ne sera pas effectué. Pourtant ce n'est pas une erreur en soi, mais c'est toujours intéressant de le préciser dans les résultats. Il en est de même pour un utilisateur qui n'a pas d'adresse mail, le résultat sera également logique dans ce cas.

Ce script n'est sûrement pas parfait, mais il fonctionne ! Si vous avez des améliorations à proposer ou des questions, n'hésitez pas à laisser un commentaire.

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

3 commentaires sur “PowerShell et Active Directory : Modifier le domaine des adresses mails

  • Bonjour,

    Je voudrai avoir confirmation, le script ne vaut que pour des boites mails « externes » au serveur (j’entends par là qui ne sont pas gérées par un Exchange postérieur à 2003 dans l’organisation) ?

    Il pourrait être adapté avec des cmdlets Exchange pour modifier les adresses mail d’un Exchange de l’organisation ? Si oui il faudrait donc exécuter le « script modifié » depuis l’EMS plutôt qu’un shell PS classique ?

    Merci pour vos réponses, et surtout votre partage ^_^

    Répondre
    • Bonsoir AyA,

      Effectivement, j’ai utilisé ce script dans le cadre d’une migration de nom de domaine avec la messagerie Zarafa. Concernant Exchange, je ne connais pas le produit, mais je vais tenter de répondre à vos questions.

      J’imagine qu’il est d’adapter le script pour Exchange en utilisant les commandlets adéquats, ou alors il faudrait modifier un autre attribut que « mail » correspondant à l’attribut du schéma dans lequel Exchange enregistre les adresses e-mails. Concernant l’exécution, je pense qu’elle peut être faite depuis un Shell classique du moment que l’on utilise des commandes « classiques ».

      En espérant avoir tout de même éclairci vos interrogations.
      Florian

      Répondre
  • Bonsoir,
    Merci pour votre réponse, ne perdez pas de temps à faire de recherches car je n’ai pas de besoin ponctuel mais juste de la curiosité 😉
    A titre d’info je pense qu’un tel script (modifié « Exchange ») devrait être lancé depuis l’EMS (Exchange Management Shell) car les cmdlets propres à Exchange ne fonctionnent pas dans le shell PS classique.
    Bonne continuation !

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.