Экспортируйте статус MFA пользователей Office 365 с помощью PowerShell
Одним из отчетов, который мне очень не хватает в центре администрирования Microsoft 365, является четкий обзор статуса MFA каждого пользователя. MFA — это действительно важная мера безопасности для защиты вашего арендатора. Чтобы убедиться, что наши пользователи настроили MFA, мы собираемся использовать PowerShell для получения и экспорта статуса MFA.
Вы также можете использовать встроенный обзор в Центре администрирования, но это займет много времени. С другой стороны, с помощью PowerShell мы можем легко получить статус MFA всех пользователей и создать список в Excel со всеми необходимыми данными.
Я создал скрипт, который может выполнить несколько действий для проверки и отчета о статусе MFA ваших пользователей:
- Список статуса MFA всех пользователей
- Список настроенных типов MFA для каждого пользователя
- Получите всех пользователей, у которых не включена MFA
- Проверьте статус MFA для одного пользователя
- Проверьте, применяются ли меры многофакторной аутентификации.
- Проверяет, является ли пользователь администратором или нет
- Получите только лицензированных и активированных пользователей
В конце статьи вы найдете полный текст.
Заметка
Я также создал этот скрипт на основе Microsoft Graph. Он будет получать немного больше информации, чем этот скрипт. Убедитесь, что вы ознакомились с ним!
Получите статус MFA с помощью PowerShell
С помощью PowerShell мы можем легко получить статус MFA для всех наших пользователей Office 365. Основой для скрипта является команда Get-MsolUser, которая получает пользователей из Azure Active Directory.
Get-MsolUser возвращает все данные пользователя, включая параметр StrongAuthenticationMethods. Этот параметр перечисляет все методы сильной аутентификации, которые использует пользователь. Если этот параметр установлен, то мы знаем, что пользователь использует многофакторную аутентификацию (MFA).
Совет
Добавьте этот скрипт в свой профиль PowerShell, чтобы вы могли легко проверить статус MFA ваших пользователей. Читайте об этом в этой статье.
Требования
Вам необходимо установить модуль MsolService, чтобы использовать этот скрипт. Убедитесь, что вы подключены, прежде чем выполнять скрипт.
Connect-MsolServiceПолучение списка всех пользователей и их статуса MFA
Вы можете просто запустить скрипт без каких-либо параметров, чтобы получить список всех пользователей и их статуса MFA. Скрипт проверит, является ли пользователь администратором, и отобразит тип MFA по умолчанию, установленный для пользователя.
Вы можете экспортировать результат на экран или в файл CSV, если хотите.
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Получите только пользователей без MFA
Если у вас есть крупный арендатор, то, вероятно, вы хотите получить только пользователей без MFA. Вы можете использовать переключатель withOutMFAOnly для этого.
Get-MFAStatus.ps1 -withOutMFAOnlyПроверьте статус MFA администраторов
Администраторы должны иметь включенную многофакторную аутентификацию без сомнений. Чтобы быстро проверить статус всех ваших учетных записей администраторов, вы можете использовать переключатель adminsOnly.
Get-MFAStatus.ps1 -adminsOnlyПроверьте состояние MFA для выбранных пользователей
Скрипт также позволяет проверить статус MFA для одного пользователя или нескольких пользователей.
Get-MFAStatus.ps1 -UserPrincipalName 'johndoe@contoso.com'
Если вы хотите проверить статус одного подразделения, например, то вы можете сделать следующее:
Get-MsolUser.ps1 -Department 'Finance' | ForEach-Object { Get-MFAStatus $_.UserPrincipalName }Полный сценарий
Вы можете найти полный скрипт ниже или получить его здесь из моего Github. (Я рекомендую использовать Github, чтобы убедиться, что у вас последняя версия).
Совет
Быстро получите статус MFA ваших пользователей, добавив ссылку на скрипт в свой профиль PowerShell. Узнайте об этом в статье.
<#
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 {"-"}
}
}
}
}
Завершение
Включение MFA является одной из важных мер для защиты вашего арендатора. С помощью этого скрипта PowerShell вы можете легко проверить статус MFA ваших пользователей.
Убедитесь, что вы также прочитали эту статью с 20 другими советами по безопасности для Office 365.
Если вы нашли этот скрипт полезным, пожалуйста, поделитесь им. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.
Вам также могут понравиться один из следующих скриптов отчетов PowerShell:
- Отчет о разрешениях почтового ящика
- Отчет о размере почтового ящика
- Отчет о размере OneDrive
