Recherche de site Web

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-MsolService

Obtenir 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 -noTypeInformation

Obtenez 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 -withOutMFAOnly

Vé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 -adminsOnly

Vé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

Articles connexes