Office 365 : Créer des utilisateurs avec PowerShell

I. Présentation

Bien que l'interface d'administration d'Office 365 permet d'importer un CSV pour automatiser la création d'un lot d'utilisateurs, il reste intéressant de le réaliser par un script pour avoir plus d'options sur le paramétrage des utilisateurs, ainsi que la possibilité d'automatiser la création des utilisateurs dans Office 365.

Imaginons un fichier CSV qui vient s'alimenter automatiquement et un script qui s'exécute à intervalle régulier pour créer les utilisateurs manquants du côté d'Office 365.

Dans ce tutoriel, nous allons concevoir un fichier de données au format CSV que nous allons ensuite utiliser pour créer des utilisateurs dans Office 365, le tout via un script PowerShell.

II. Le format du CSV

Très simplement, nous allons avoir un CSV avec 3 colonnes : nom, prénom et mot de passe. On pourrait en ajouter d'autres pour ajouter par exemple le pays, le numéro de téléphone, le département, etc... Libre à vous d'en ajouter.

Voici à quoi il ressemblera sachant que le nom des colonnes peut-être modifié :

NOM;PRENOM;PASSWORD
BURNEL;Florian;MonPassw0rdDeFou

Ce CSV contient une ligne d'en-tête et une seule ligne de données qui permettra de créer l'utilisateur "Florian BURNEL" en lui attribuant comme mot de passe "MonPassw0rdDeFou". Bien entendu le CSV peut-être créé à partir d'un export d'une autre application (voire même d'un AD).

III. Le script PowerShell

Nous allons désormais construire le script PowerShell par étape pour que vous soyez en mesure de bien le comprendre. Je ne veux pas vous noyer dans le code.

A. Module MSOnline et authentification sur les services Microsoft Online

Pour cette partie, je vous invite à lire mon tutoriel dédié à ce sujet où vous pourrez récupérer le bout de code pour notre script : Se connecter à Office 365 en PowerShell

B. Importer le CSV et le parcourir

Le CSV sera notre source de données, on va donc stocker son contenu dans une variable et préparer la boucle ForEach pour parcourir son contenu. Ceci donnera le bout de code suivant :

## Récupérer le contenu du fichier CSV
$CSV = Import-Csv -Path "C:\office365.csv" -Delimiter ";" -Encoding Default

foreach($User in $CSV){
  # Code manquant dans la boucle pour indiquer les actions à effectuer
}

Dans l'exemple ci-dessus, le fichier CSV est "C:\office365.csv" il faut donc adapter selon votre configuration et j'utilise le point-virgule comme délimiteur.

La boucle va nous permettre de parcourir chaque ligne du fichier CSV à partir des données stockées dans la variable $CSV.

C. Récupérer les valeurs

Nous allons récupérer les données du CSV pour les exploiter, à savoir le nom, prénom, le mot de passe, etc... Autant d'information que vous avez besoin d'utiliser pour la création au sein d'Office 365.

Ce qui nous donnera, par exemple :

## Récupérer le contenu du fichier CSV
$CSV = Import-Csv -Path "C:\office365.csv" -Delimiter ";" -Encoding Default

foreach($User in $CSV){
    $UserName = $User.PRENOM
    $UserSurname = $User.NOM
    $UserDisplayName = $User.PRENOM + " " + $User.NOM
    $UserPassword = $User.PASSWORD
}

Les valeurs "PRENOM", "NOM" et "PASSWORD" correspondent aux noms des colonnes du fichier CSV. Ces valeurs doivent être adaptées selon le nom de vos colonnes du CSV.

D. Attribuer une licence aux utilisateurs

Ce qui est essentiel d'importer de votre CSV ou de définir dans une variable (si c'est identique pour tous les utilisateurs), c'est la ou les licences que vous souhaitez attribuer à vos utilisateurs. Sans licence, ils n'auront pas de droits dans Office 365 pour pouvoir utiliser les différents services et applications.

Je consacre un court article à propos des noms des licences dans Office 365 : Comment récupérer le nom des licences Office 365 en PowerShell ?

Mais par exemple, voici à quoi peut ressembler une liste de licences à attribuer :

    # Licence à attribuer à l'utilisateur (2 dans ce cas)
    $UserLicense = "<nom-entité>:EXCHANGEENTERPRISE_STUDENT","<nom-entité>:OFFICESUBSCRIPTION_STUDENT"

Vous devez inclure la déclaration de la licence dans la boucle ForEach à la suite des variables de récupération des données.

E. Générer l'UPN de l'utilisateur

A moins que vous intégriez directement l'adresse e-mail dans le CSV, sinon il faudra la constituer manuellement en jouant avec les variables.

Note : L'UPN ou UserPrincipalName est utilisé comme identifiant unique au sein d'Office 365.

Par exemple, pour générer des UPN sous la forme "prenom.nom" on utilisera ceci :

    # UPN sous la forme [email protected]
    $UserPrincipalName = ($UserName).ToLower() + "." + ($UserSurname).ToLower() + "@it-connect.fr"

On concatène simplement le prénom et le nom séparé par un point, et on ajoute à la fin "@it-connect.fr", le tout en passant tout en minuscule par l'intermédiaire de ToLower().

Note : On peut imaginer créer une fonction qui ressort l'adresse e-mail en retirant auparavant tous les caractères spéciaux qui pourrait gêner dans une adresse e-mail.

Pour rappel, voici à quoi ressemble la boucle pour le moment :

## Récupérer le contenu du fichier CSV
 $CSV = Import-Csv -Path "C:\office365.csv" -Delimiter ";" -Encoding Default

foreach($User in $CSV){
 $UserName = $User.PRENOM
 $UserSurname = $User.NOM
 $UserDisplayName = $User.PRENOM + " " + $User.NOM
 $UserPassword = $User.PASSWORD

# Licence à attribuer à l'utilisateur (2 dans ce cas)
 $UserLicense = "<nom-entité>:EXCHANGEENTERPRISE_STUDENT","<nom-entité>:OFFICESUBSCRIPTION_STUDENT"

# UPN sous la forme [email protected]
 $UserPrincipalName = ($UserName).ToLower() + "." + ($UserSurname).ToLower() + "@it-connect.fr"
 }

Passons à la suite.

F. Création de l'utilisateur

C'est l'étape tant attendu, j'en suis sûr ! La création de l'utilisateur au sein de votre compte Office 365. Cette création s'appuie sur le commandlet New-MsolUser.

    # Créer l'utilisateur
    New-MsolUser    -DisplayName $UserDisplayName -FirstName $UserName -LastName $UserSurname `
                    -UserPrincipalName $UserPrincipalName `
                    -StrongPasswordRequired $false -PasswordNeverExpires $true -Password $UserPassword `
                    -LicenseAssignment $UserLicense -UsageLocation "FR"

La commande ci-dessus permet de créer chaque utilisateur du CSV avec les infos lui correspondantes et que l'on récupère dans le CSV.

  • DisplayName : Le nom affiché
  • FirstName et LastName : Le prénom et le nom
  • UserPrincipalName : L'adresse e-mail (unique)
  • LicenseAssigment : Licence(s) assignée(s)
  • Password : Le mot de passe
  • StrongPasswordRequired : Pouvoir définir un mot de passe à partir du CSV sans être "embêté" par la complexité
  • PasswordNeverExpires : Le mot de passe n'expire jamais, vrai ou faux

Il y a des options supplémentaires disponibles avec cette commande, notamment pour stocker des infos supplémentaires dans le profil de chaque utilisateur : New-MsolUser

Enfin, on peut imaginer insérer la création dans un try/catch pour gérer les exceptions (et les erreurs), comme ceci :

try{
    # Créer l'utilisateur
    New-MsolUser    -DisplayName $UserDisplayName -FirstName $UserName -LastName $UserSurname `
                    -UserPrincipalName $UserPrincipalName `
                    -StrongPasswordRequired $false -PasswordNeverExpires $true -Password $UserPassword `
                    -LicenseAssignment $UserLicense -UsageLocation "FR"

    Write-Host "Utilisateur $UserDisplayName créé avec succès !" -ForegroundColor Green

}catch{

    Write-Host "ATTENTION ! Impossible de créer l'utilisateur $UserDisplayName" -ForegroundColor Red

}

Il ne reste plus qu'à rassemble tous les bouts de code pour former le script.

IV. Le script complet

Pour faciliter la récupération du script, le voici d'un seul bloc :

## Authentification Office 365
$UserAdmin = "[email protected]"
$Credentials = Get-Credential -Credential $UserAdmin
Connect-MsolService -Credential $Credentials
$MsoExchangeURL = "https://ps.outlook.com/PowerShell-LiveID?PSVersion=5.0.10586.122"
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $MsoExchangeURL -Credential $Credentials -Authentication Basic -AllowRedirection

## Importer les paramètres de la session Office 365 Microsoft Online
Import-PSSession $Session

## Récupérer le contenu du fichier CSV
$CSV = Import-Csv -Path "C:\office365.csv" -Delimiter ";" -Encoding Default

foreach($User in $CSV){
    $UserName = $User.PRENOM
    $UserSurname = $User.NOM
    $UserDisplayName = $User.PRENOM + " " + $User.NOM
    $UserPassword = $User.PASSWORD

    # Licence à attribuer à l'utilisateur (2 dans ce cas)
    $UserLicense = "<nom-entité>:EXCHANGEENTERPRISE_STUDENT","<nom-entité>:OFFICESUBSCRIPTION_STUDENT"

    # UPN sous la forme [email protected]
    $UserPrincipalName = ($UserName).ToLower() + "." + ($UserSurname).ToLower() + "@it-connect.fr"

try{
    # Créer l'utilisateur
    New-MsolUser    -DisplayName $UserDisplayName -FirstName $UserName -LastName $UserSurname `
                    -UserPrincipalName $UserPrincipalName `
                    -StrongPasswordRequired $false -PasswordNeverExpires $true -Password $UserPassword `
                    -LicenseAssignment $UserLicense -UsageLocation "FR"

    Write-Host "Utilisateur $UserDisplayName créé avec succès !" -ForegroundColor Green

}catch{

    Write-Host "ATTENTION ! Impossible de créer l'utilisateur $UserDisplayName" -ForegroundColor Red

}

}

Ce script pourra être amélioré par vos soins, mais il constitue une base de travail intéressant et il est fonctionnel. N'hésitez pas à commenter 🙂

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

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.

Nombre de posts de cet auteur : 5471.Voir tous les posts

3 thoughts on “Office 365 : Créer des utilisateurs avec PowerShell

  • Hello
    Ça serait cool de faire un cours sur Office 365 dans un mode hybride Onpremise/Exchange Online

    Répondre
  • bonjour,
    je n’arrive pas à faire fonctionner le script. j’ai deux érreurs :

    PS C:\Users\drosine> $MsoExchangeURL = « https://smtp.office365.com/PowerShell-LiveID?PSVersion=5.1.18362.1171 »
    PS C:\Users\drosine> $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $MsoExchangeURL -Credential $Credentials -Authentication Basic -AllowRedirection
    New-PSSession : [smtp.office365.com] La connexion au serveur distant smtp.office365.com a échoué avec le message
    d’erreur suivant: Accès refusé. Pour plus d’informations, voir la rubrique d’aide about_Remote_Troubleshooting.
    Au caractère Ligne:1 : 12
    + $Session = New-PSSession -ConfigurationName Microsoft.Exchange -Conne …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : OpenError: (System.Manageme….RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotin
    gTransportException
    + FullyQualifiedErrorId : AccessDenied,PSSessionOpenFailed
    PS C:\Users\drosine>
    PS C:\Users\drosine> ## Importer les paramètres de la session Office 365 Microsoft Online
    PS C:\Users\drosine> Import-PSSession $Session
    Import-PSSession : Impossible de valider l’argument sur le paramètre «Session». L’argument est Null. Spécifiez une
    valeur valide pour l’argument, puis réessayez.
    Au caractère Ligne:1 : 18
    + Import-PSSession $Session
    + ~~~~~~~~
    + CategoryInfo : InvalidData : (:) [Import-PSSession], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.ImportPSSessionCommand

    vu que le script date de 2016, j’ai modifié la version de powershell et l’url office365.

    pouvez vous m’aider à corriger ce problème?

    Répondre
    • Hello,
      Je vois que c’est indiqué « Accès refusé » : le compte que vous utilisez a bien un niveau de droits suffisant pour se connecter à l’administration du tenant ?
      Cordialement,
      Florian

      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.