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 🙂
Hello
Ça serait cool de faire un cours sur Office 365 dans un mode hybride Onpremise/Exchange Online
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?
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