Exporter le statut MFA des utilisateurs Office 365 avec PowerShell
L'un des rapports qui me manque vraiment dans le Centre d'administration Microsoft 365 est un aperçu clair de l'état MFA de chaque utilisateur. MFA est une mesure de sécurité très importante pour protéger votre locataire. Pour nous assurer que nos utilisateurs ont configuré MFA, nous allons utiliser PowerShell pour obtenir et exporter le statut MFA.
Vous pouvez également utiliser l’aperçu intégré dans le centre d’administration, mais cela prendrait beaucoup de temps. Avec PowerShell, nous pouvons facilement obtenir le statut MFA de tous les utilisateurs et créer une liste Excel avec tous les détails dont nous avons besoin.
J'ai créé un script qui peut faire plusieurs choses pour vérifier et signaler le statut MFA de vos utilisateurs :
- Répertorier le statut MFA de tous les utilisateurs
- Répertorier les types MFA configurés pour chaque utilisateur
- Obtenez tous les utilisateurs pour lesquels MFA n’est pas activé
- Vérifier le statut MFA d'un seul utilisateur
- Vérifiez si la MFA est appliquée
- Vérifie si un utilisateur est administrateur ou non
- Obtenez uniquement les utilisateurs sous licence et activés
A la fin de l'article, vous trouverez le script complet.
Note
J'ai également créé ce script basé sur Microsoft Graph. Il obtiendra un peu plus d'informations que ce script. Assurez-vous de le vérifier !
Obtenez le statut MFA avec PowerShell
Avec PowerShell, nous pouvons facilement obtenir le statut MFA de tous nos utilisateurs d'Office 365. La base du script est l'applet de commande Get-MsolUser, qui récupère les utilisateurs d'Azure Active Directory.
Get-MsolUser renvoie tous les détails de l'utilisateur, y compris le paramètre StrongAuthenticationMethods. Ce paramètre répertoriera toutes les méthodes d'authentification forte qu'un utilisateur utilise. Si ce paramètre est défini, nous savons que l'utilisateur utilise MFA.
Conseil
Ajoutez ce script à votre profil PowerShell afin de pouvoir vérifier facilement le statut MFA de vos utilisateurs. En savoir plus à ce sujet dans cet article.
Exigences
Vous devez avoir installé le module MsolService pour utiliser ce script. Assurez-vous que vous êtes connecté avant d'exécuter le script.
Connect-MsolServiceObtenir une liste de tous les utilisateurs et leur statut MFA
Vous pouvez simplement exécuter le script sans aucun paramètre pour obtenir une liste de tous les utilisateurs et leur statut MFA. Le script vérifiera si l'utilisateur est un administrateur et répertoriera le type MFA par défaut que l'utilisateur a défini.
Vous pouvez exporter le résultat à l'écran ou dans un fichier CSV si vous le souhaitez.
# Make sure you are connected to MsolService
Get-MFAStatus.ps1 | FT
# Or if you want an excel file
Get-MFAStatus.ps1 | Export-CSV c:\temp\mfastatus.csv -noTypeInformationObtenez uniquement les utilisateurs sans MFA
Si vous avez un grand locataire, vous souhaiterez probablement uniquement obtenir les utilisateurs sans MFA. Vous pouvez utiliser le commutateur withOutMFAOnly pour cela.
Get-MFAStatus.ps1 -withOutMFAOnlyVérifier le statut MFA des administrateurs
Les administrateurs devraient sans aucun doute avoir activé MFA. Pour vérifier rapidement l'état de tous vos comptes administrateur, vous pouvez utiliser le commutateur adminsOnly
Get-MFAStatus.ps1 -adminsOnlyVérifier le statut MFA sur une sélection d'utilisateurs
Le script vous permet également de vérifier l'état MFA d'un seul utilisateur ou de plusieurs utilisateurs.
Get-MFAStatus.ps1 -UserPrincipalName 'johndoe@contoso.com'
Si vous souhaitez vérifier l'état d'un seul service par exemple, vous pouvez procéder comme suit :
Get-MsolUser.ps1 -Department 'Finance' | ForEach-Object { Get-MFAStatus $_.UserPrincipalName }Le scénario complet
Vous pouvez trouver le script complet ci-dessous ou vous pouvez l'obtenir ici depuis mon Github. (Je recommande d'utiliser Github pour vous assurer que vous disposez de la dernière version).
Conseil
Obtenez rapidement le statut MFA de vos utilisateurs en ajoutant une référence au script dans votre profil PowerShell. Lisez tout cela dans cet article.
<#
Name: Get-MFAStatus
Author: R. Mens - LazyAdmin.nl
Version: 1.3
DateCreated: jan 2021
Purpose/Change: List all Configured MFA Types
Thanks to: Anthony Bartolo
#>
[CmdletBinding(DefaultParameterSetName="Default")]
param(
[Parameter(
Mandatory = $false,
ParameterSetName = "UserPrincipalName",
HelpMessage = "Enter a single UserPrincipalName or a comma separted list of UserPrincipalNames",
Position = 0
)]
[string[]]$UserPrincipalName,
[Parameter(
Mandatory = $false,
ValueFromPipeline = $false,
ParameterSetName = "AdminsOnly"
)]
# Get only the users that are an admin
[switch]$adminsOnly = $false,
[Parameter(
Mandatory = $false,
ValueFromPipeline = $false,
ParameterSetName = "AllUsers"
)]
# Set the Max results to return
[int]$MaxResults = 10000,
[Parameter(
Mandatory = $false,
ValueFromPipeline = $false,
ParameterSetName = "Licenend"
)]
# Check only the MFA status of users that have license
[switch]$IsLicensed = $true,
[Parameter(
Mandatory = $false,
ValueFromPipeline = $true,
ValueFromPipelineByPropertyName = $true,
ParameterSetName = "withOutMFAOnly"
)]
# Get only the users that don't have MFA enabled
[switch]$withOutMFAOnly = $false,
[Parameter(
Mandatory = $false,
ValueFromPipeline = $false
)]
# Check if a user is an admin. Set to $false to skip the check
[switch]$listAdmins = $true
)
# Connect to Msol
if ((Get-Module -ListAvailable -Name MSOnline) -eq $null)
{
Write-Host "MSOnline Module is required, do you want to install it?" -ForegroundColor Yellow
$install = Read-Host Do you want to install module? [Y] Yes [N] No
if($install -match "[yY]")
{
Write-Host "Installing MSOnline module" -ForegroundColor Cyan
Install-Module MSOnline -Repository PSGallery -AllowClobber -Force
}
else
{
Write-Error "Please install MSOnline module."
}
}
if ((Get-Module -ListAvailable -Name MSOnline) -ne $null)
{
if(-not (Get-MsolDomain -ErrorAction SilentlyContinue))
{
Connect-MsolService
}
}
else{
Write-Error "Please install Msol module."
}
# Get all licensed admins
$admins = $null
if (($listAdmins) -or ($adminsOnly)) {
$admins = Get-MsolRole | %{$role = $_.name; Get-MsolRoleMember -RoleObjectId $_.objectid} | Where-Object {$_.isLicensed -eq $true} | select @{Name="Role"; Expression = {$role}}, DisplayName, EmailAddress, ObjectId | Sort-Object -Property EmailAddress -Unique
}
# Check if a UserPrincipalName is given
# Get the MFA status for the given user(s) if they exist
if ($PSBoundParameters.ContainsKey('UserPrincipalName')) {
foreach ($user in $UserPrincipalName) {
try {
$MsolUser = Get-MsolUser -UserPrincipalName $user -ErrorAction Stop
$Method = ""
$MFAMethod = $MsolUser.StrongAuthenticationMethods | Where-Object {$_.IsDefault -eq $true} | Select-Object -ExpandProperty MethodType
If (($MsolUser.StrongAuthenticationRequirements) -or ($MsolUser.StrongAuthenticationMethods)) {
Switch ($MFAMethod) {
"OneWaySMS" { $Method = "SMS token" }
"TwoWayVoiceMobile" { $Method = "Phone call verification" }
"PhoneAppOTP" { $Method = "Hardware token or authenticator app" }
"PhoneAppNotification" { $Method = "Authenticator app" }
}
}
[PSCustomObject]@{
DisplayName = $MsolUser.DisplayName
UserPrincipalName = $MsolUser.UserPrincipalName
isAdmin = if ($listAdmins -and $admins.EmailAddress -match $MsolUser.UserPrincipalName) {$true} else {"-"}
MFAEnabled = if ($MsolUser.StrongAuthenticationMethods) {$true} else {$false}
MFAType = $Method
MFAEnforced = if ($MsolUser.StrongAuthenticationRequirements) {$true} else {"-"}
}
}
catch {
[PSCustomObject]@{
DisplayName = " - Not found"
UserPrincipalName = $User
isAdmin = $null
MFAEnabled = $null
}
}
}
}
# Get only the admins and check their MFA Status
elseif ($adminsOnly) {
foreach ($admin in $admins) {
$MsolUser = Get-MsolUser -ObjectId $admin.ObjectId | Sort-Object UserPrincipalName -ErrorAction Stop
$MFAMethod = $MsolUser.StrongAuthenticationMethods | Where-Object {$_.IsDefault -eq $true} | Select-Object -ExpandProperty MethodType
$Method = ""
If (($MsolUser.StrongAuthenticationRequirements) -or ($MsolUser.StrongAuthenticationMethods)) {
Switch ($MFAMethod) {
"OneWaySMS" { $Method = "SMS token" }
"TwoWayVoiceMobile" { $Method = "Phone call verification" }
"PhoneAppOTP" { $Method = "Hardware token or authenticator app" }
"PhoneAppNotification" { $Method = "Authenticator app" }
}
}
[PSCustomObject]@{
DisplayName = $MsolUser.DisplayName
UserPrincipalName = $MsolUser.UserPrincipalName
isAdmin = $true
"MFA Enabled" = if ($MsolUser.StrongAuthenticationMethods) {$true} else {$false}
"MFA Default Type"= $Method
"SMS token" = if ($MsolUser.StrongAuthenticationMethods.MethodType -contains "OneWaySMS") {$true} else {"-"}
"Phone call verification" = if ($MsolUser.StrongAuthenticationMethods.MethodType -contains "TwoWayVoiceMobile") {$true} else {"-"}
"Hardware token or authenticator app" = if ($MsolUser.StrongAuthenticationMethods.MethodType -contains "PhoneAppOTP") {$true} else {"-"}
"Authenticator app" = if ($MsolUser.StrongAuthenticationMethods.MethodType -contains "PhoneAppNotification") {$true} else {"-"}
MFAEnforced = if ($MsolUser.StrongAuthenticationRequirements) {$true} else {"-"}
}
}
}
# Get the MFA status from all the users
else {
$MsolUsers = Get-MsolUser -EnabledFilter EnabledOnly -MaxResults $MaxResults | Where-Object {$_.IsLicensed -eq $isLicensed} | Sort-Object UserPrincipalName
foreach ($MsolUser in $MsolUsers) {
$MFAMethod = $MsolUser.StrongAuthenticationMethods | Where-Object {$_.IsDefault -eq $true} | Select-Object -ExpandProperty MethodType
$Method = ""
If (($MsolUser.StrongAuthenticationRequirements) -or ($MsolUser.StrongAuthenticationMethods)) {
Switch ($MFAMethod) {
"OneWaySMS" { $Method = "SMS token" }
"TwoWayVoiceMobile" { $Method = "Phone call verification" }
"PhoneAppOTP" { $Method = "Hardware token or authenticator app" }
"PhoneAppNotification" { $Method = "Authenticator app" }
}
}
if ($withOutMFAOnly) {
# List only the user that don't have MFA enabled
if (-not($MsolUser.StrongAuthenticationMethods)) {
[PSCustomObject]@{
DisplayName = $MsolUser.DisplayName
UserPrincipalName = $MsolUser.UserPrincipalName
isAdmin = if ($listAdmins -and ($admins.EmailAddress -match $MsolUser.UserPrincipalName)) {$true} else {"-"}
MFAEnabled = $false
MFAType = "-"
MFAEnforced = if ($MsolUser.StrongAuthenticationRequirements) {$true} else {"-"}
}
}
}else{
[PSCustomObject]@{
DisplayName = $MsolUser.DisplayName
UserPrincipalName = $MsolUser.UserPrincipalName
isAdmin = if ($listAdmins -and ($admins.EmailAddress -match $MsolUser.UserPrincipalName)) {$true} else {"-"}
"MFA Enabled" = if ($MsolUser.StrongAuthenticationMethods) {$true} else {$false}
"MFA Default Type"= $Method
"SMS token" = if ($MsolUser.StrongAuthenticationMethods.MethodType -contains "OneWaySMS") {$true} else {"-"}
"Phone call verification" = if ($MsolUser.StrongAuthenticationMethods.MethodType -contains "TwoWayVoiceMobile") {$true} else {"-"}
"Hardware token or authenticator app" = if ($MsolUser.StrongAuthenticationMethods.MethodType -contains "PhoneAppOTP") {$true} else {"-"}
"Authenticator app" = if ($MsolUser.StrongAuthenticationMethods.MethodType -contains "PhoneAppNotification") {$true} else {"-"}
MFAEnforced = if ($MsolUser.StrongAuthenticationRequirements) {$true} else {"-"}
}
}
}
}
Conclusion
L'activation de MFA est l'une des étapes importantes pour protéger votre locataire. Avec ce script PowerShell, vous pouvez facilement vérifier le statut MFA de vos utilisateurs.
Assurez-vous également de consulter cet article avec 20 autres conseils de sécurité pour Office 365.
Si vous avez trouvé ce script utile, partagez-le. Si vous avez des questions, déposez simplement un commentaire ci-dessous.
Vous aimerez peut-être également l’un des scripts de rapport PowerShell suivants :
- Rapport sur les autorisations de la boîte aux lettres
- Rapport sur la taille de la boîte aux lettres
- Rapport de taille OneDrive
