Créer des utilisateurs sur Office 365 en PowerShell

Offce-365_ban

Si vous disposez d’un tenant Office 365, il peut être intéressant de voir comment vous pouvez vous y connecter en PowerShell afin d’exécuter des actions de masse pour par exemple créer un volume important d’utilisateurs ou réaliser des changements globaux sur l’ensemble de votre organisation en quelques lignes de commandes.

Etape 0 – Prérequis

En termes de prérequis, vous devez disposer des CmdLet spécifiques à Microsoft Office 365. Pour ce faire, vous devez installer les 2 outils suivants :

Une fois que c’est bon, démarrez une CmdLet PowerShell et vérifiez que vous disposez bien du nouveau module : MSOnline.

2016-04-19_17h08_22

Get-Module –ListAvailable

Vous pouvez également lister l’ensemble des CmdLet disponibles au sein de ce module, en utilisant la commande suivante :

Get-Command –Module MSOnline

Etape 1 – Se connecter au tenant Office 365 en PowerShell

Avant de pouvoir exécuter des CmdLet sur le tenant Office 365, vous devez tout d’abord vous y connecter. Pour cela, assurez-vous de bien disposer de votre login complet (votre adresse email sur O365) ainsi que le mot de passe qui vous a été attribué.

cls
Import-Module MSOnline

# Credentials
$user = "moi@domain.com"
$pwd = convertto-securestring "password_top_secret" -asplaintext -force
$cred = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList $user, $pwd

# Trying to connect to Office 365
try
{
 Connect-MsolService -Credential $cred
 Write-Host "[DEBUG] - Connection successful" -ForegroundColor Green
}

catch
{
  # Problem : displaying the Exception and Breaking the execution
  Write-host "[ERROR] - $($_.Exception.Message)" -ForegroundColor Red
  Break
}

Bien entendu, vous pouvez également définir à la main à chaque exécution l’objet $cred en utilisant simplement Get-Credential. De cette façon, c’est PowerShell qui vous demandera de saisir vos identifiants au moment de l’exécution du script (ce qui vous évite de mettre votre mot de passe en clair dans le script).

Une fois que vous êtes connecté au Tenant Office 365. Vous pouvez alors créer vos utilisateurs avec la CmdLet suivante : New-MsolUser.

Etape 2 – Création des utilisateurs et activation des licences

# Checking if the CSV exists - Please edit this variable with your value
$csvFile = "C:\Users\thibault\Desktop\accounts_to_create.csv"
Write-Host "[DEBUG] - Checking if the CSV file exist..." -ForegroundColor Yellow

if ((Test-Path $csvFile) -eq $false)
{
Write-Host "[DEBUG] - CSV file doest not exist or path is incorrect - Exiting" -ForegroundColor Red
Break
}

Write-Host "[DEBUG] - CSV file exists - We can continue." -ForegroundColor Green

$users_to_create = Import-Csv $csvFile -Delimiter ";" -Encoding Default
$user_already_exist = $null # Check if user already exist or not
$user_created = $null # To store each creation
$final_results = @()

Write-Host "[DEBUG] - We will create the accounts in the CSV file..." -ForegroundColor Yellow
$users_to_create
Read-Host "[CONFIRM] - Please press any key to continue..."

foreach ($user in $users_to_create)
{
# If returning YES so the user already exist
$user_already_exist = $all_users.UserPrincipalName -contains $user.userprincipalname
if ($user_already_exist -eq $false) # If FALSE, user not already exist, so we'll process to the creation (UPN)
{
# Trying to create user
try
{
# User creation
$user_created = New-MsolUser -UserPrincipalName $user.userprincipalname -DisplayName $user.displayname -FirstName $user.firstname -LastName $user.lastname -ForceChangePassword $true -StrongPasswordRequired $true -UsageLocation "FR"
Write-Host $("[DEBUG] - User created" + " - Temporary Password: " + $user_created.Password + " - DisplayName: " + $user_created.DisplayName + " - UserPrincipalName: " + $user_created.UserPrincipalName) -ForegroundColor Green
$final_results += $("[RESULTS] - Password: " + $user_created.Password + " - UserPrincipalName: " + $user_created.UserPrincipalName)

# Office 365 Main License Activation - Activating ALL the features of Office 365
Set-MsolUserLicense -UserPrincipalName $user.userprincipalname -AddLicenses "TENANTNAME:ENTERPRISEPREMIUM"
Write-Host $("[DEBUG] - License Office 365 activated for user: " + $user_created.UserPrincipalName ) -ForegroundColor Green

# Office 365 Plans / Features Limitation
# Defining a Licence level in which we're selecting all the features that will be disabled
$LimitFeatures = New-MsolLicenseOptions -AccountSkuId "TENANTNAME:ENTERPRISEPREMIUM" -DisabledPlans "EQUIVIO_ANALYTICS", "LOCKBOX_ENTERPRISE", "EXCHANGE_ANALYTICS", "SWAY", "MCOEV", "MCOMEETADV", "BI_AZURE_P2", "INTUNE_O365", "PROJECTWORKMANAGEMENT", "RMS_S_ENTERPRISE", "YAMMER_ENTERPRISE", "OFFICESUBSCRIPTION", "EXCHANGE_S_ENTERPRISE", "SHAREPOINTENTERPRISE", "SHAREPOINTWAC"
Set-MsolUserLicense -UserPrincipalName $user.userprincipalname -LicenseOptions $LimitFeatures
Write-Host $("[DEBUG] - Plans / Features limited for user: " + $user_created.UserPrincipalName ) -ForegroundColor Green
}

catch
{
# Problem for the user creation - Check error message
Write-Host $("[ERROR] - Problem during the creation / license activation of the following user: " + $user.UserPrincipalName + " - Exception message error: " + $_.Exception.Message) -ForegroundColor Red
#Break # No break because it can be only 1 user that has troubles
}
}

# Else the UPN already exists - no creation will be done
else
{
Write-Host $("[DEBUG] - Account already exist, skipping : " + $user.userprincipalname) -ForegroundColor Yellow
}
}

Write-Host "[DEBUG] - Results for the creation are below: `n" -ForegroundColor Cyan
$final_results
Write-Host "[DEBUG] - End of script execution - Don't forget to copy temporary password and sent them to Christelle !" -ForegroundColor Cyan

attributes

L’objectif de la portion de code ci-dessous est de procéder à la création des utilisateurs sur Office 365 puis d’activer un certaine configuration de licences au niveau du Tenant. Les utilisateurs sont créés à partir d’un fichier CSV qui se présente sous la forme suivante :

userprincipalname;displayname;firstname;lastname
firstname_lastname@domain.tld;NAME Firstname;Firstname;LASTNAME

Pour définir un niveau de licences précis à attribuer aux utilisateurs, on utilise la CmdLet New-MsolLicenseOptions pour définir quels seront les types de services à activer à nos utilisateurs. Mais pour ce faire, il faut connaître la convention de nommage de Microsoft concernant les différents services d’Office 365. Et pour cela, je vous invite à consulter les liens suivants :

On a ainsi la liste des ServicesPlan qui correspondent aux différents options possibles que l’on peut cocher lorsque l’on tente de créer un utilisateur via l’interface graphique – dans mon cas, je désactive donc tous les services ci-dessus afin de ne conserver que Skype Online (à adapter selon vos besoins) :

  • EQUIVIO_ANALYTICS
  • LOCKBOX_ENTERPRISE
  • EXCHANGE_ANALYTICS
  • SWAY
  • MCOEV
  • MCOMEETADV
  • BI_AZURE_P2
  • INTUNE_O365
  • PROJECTWORKMANAGEMENT
  • RMS_S_ENTERPRISE
  • YAMMER_ENTERPRISE
  • OFFICESUBSCRIPTION
  • EXCHANGE_S_ENTERPRISE
  • SHAREPOINTENTERPRISE
  • SHAREPOINTWAC

N’oubliez pas de remplacer TENANTNAME par le nom de votre TENANT dans les lignes de code ci-dessus et de choisir quelles sont les fonctionnalités que vous souhaitez attribuer aux utilisateurs (dans mon exemple je n’active que le service Skype Online).

licences

Par défaut, nous ne renseignons que le minimum d’informations pour la création des comptes, à savoir : prénom, nom, display name, location. Tous les autres attributs tels que le téléphone, fonction, service, bureau sont laissés à vide. Une fois la création, nous aurons en retour le mot de passe temporaire qui a été généré pour l’utilisateur et qui peut lui être transmis.