PowerShell ile MFA Durumunu Office 365 kullanıcılarını dışarı aktarma
Microsoft 365 Yönetim Merkezi'nde gerçekten özlediğim raporlardan biri, her kullanıcının MFA durumuna ilişkin net bir genel bakıştır. MFA, kiracınızı korumak için gerçekten önemli bir güvenlik önlemidir. Kullanıcılarımızın MFA'yı yapılandırdığından emin olmak için MFA Durumunu almak ve dışa aktarmak için PowerShell'i kullanacağız.
Ayrıca Yönetici Merkezindeki yerleşik genel bakışı da kullanabilirsiniz, ancak bu gerçekten zaman alıcı olacaktır. PowerShell ile ise tüm kullanıcıların MFA Durumunu kolaylıkla alıp, ihtiyacımız olan tüm detayların yer aldığı bir Excel listesi oluşturabiliyoruz.
Kullanıcılarınızın MFA durumunu kontrol etmek ve raporlamak için birkaç şey yapabilen bir komut dosyası oluşturdum:
- Tüm kullanıcıların MFA Durumunu listeleyin
- Her kullanıcı için yapılandırılmış MFA türlerini listeleme
- MFA'yı etkinleştirmeyen tüm kullanıcıları edinin
- Tek bir kullanıcının MFA durumunu kontrol edin
- MFA'nın uygulanıp uygulanmadığını kontrol edin
- Bir kullanıcının yönetici olup olmadığını kontrol eder
- Yalnızca lisanslı ve etkin kullanıcıları edinin
Makalenin sonunda betiğin tamamını bulacaksınız.
Not
Bu betiği Microsoft Graph'a dayalı olarak da oluşturdum. Bu komut dosyasından biraz daha fazla bilgi alacaktır. Kontrol ettiğinizden emin olun!
PowerShell ile MFA Durumunu Alın
PowerShell ile tüm Office 365 kullanıcılarımızın MFA Durumunu kolaylıkla alabiliyoruz. Betiğin temeli, kullanıcıları Azure Active Directory'den alan Get-MsolUser cmdlet'idir.
Get-MsolUser, StrongAuthenticationMethods parametresi de dahil olmak üzere tüm kullanıcı ayrıntılarını döndürür. Bu parametre, kullanıcının kullandığı tüm güçlü kimlik doğrulama yöntemlerini listeleyecektir. Bu parametre ayarlandığında kullanıcının MFA kullandığını anlarız.
Tavsiye
Kullanıcılarınızın MFA Durumunu kolayca kontrol edebilmek için bu betiği PowerShell Profilinize ekleyin. Bu makalede bunun hakkında daha fazla bilgi edinin.
Gereksinimler
Bu betiği kullanabilmek için MsolService modülünün kurulu olması gerekir. Komut dosyasını çalıştırmadan önce bağlandığınızdan emin olun.
Connect-MsolServiceTüm kullanıcıların ve MFA Durumlarının bir listesini alma
Tüm kullanıcıların ve MFA Durumlarının bir listesini almak için betiği herhangi bir parametre olmadan çalıştırabilirsiniz. Betik, kullanıcının yönetici olup olmadığını kontrol edecek ve kullanıcının ayarladığı varsayılan MFA türünü listeleyecektir.
Sonucu ekrana veya isterseniz bir CSV dosyasına aktarabilirsiniz.
# 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 -noTypeInformationYalnızca MFA'sı olmayan kullanıcıları alın
Büyük bir kiracınız varsa, muhtemelen yalnızca MFA'sız kullanıcıları almak istersiniz. Bunun için withOutMFAOnly anahtarını kullanabilirsiniz.
Get-MFAStatus.ps1 -withOutMFAOnlyYöneticilerin MFA Durumunu kontrol edin
Yöneticilerin şüphesiz MFA'yı etkinleştirmiş olması gerekir. Tüm yönetici hesaplarınızın durumunu hızlı bir şekilde kontrol etmek için Yalnızca yöneticiler anahtarını kullanabilirsiniz.
Get-MFAStatus.ps1 -adminsOnlyKullanıcı seçiminin MFA durumunu kontrol edin
Komut dosyası ayrıca tek bir kullanıcının veya birden fazla kullanıcının MFA Durumunu kontrol etmenize de olanak tanır.
Get-MFAStatus.ps1 -UserPrincipalName 'johndoe@contoso.com'
Örneğin tek bir departmanın durumunu kontrol etmek istiyorsanız aşağıdakileri yapabilirsiniz:
Get-MsolUser.ps1 -Department 'Finance' | ForEach-Object { Get-MFAStatus $_.UserPrincipalName }Senaryonun tamamı
Komut dosyasının tamamını aşağıda bulabilirsiniz veya buradan Github'ımdan alabilirsiniz. (En son sürüme sahip olduğunuzdan emin olmak için Github'ı kullanmanızı öneririm).
Tavsiye
PowerShell Profilinizdeki betiğe bir referans ekleyerek kullanıcılarınızın MFA Durumunu hızlı bir şekilde alın. Bu makalede bununla ilgili her şeyi okuyun.
<#
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 {"-"}
}
}
}
}
Kapanıyor
MFA'nın etkinleştirilmesi kiracınızı korumanın önemli adımlarından biridir. Bu PowerShell scripti ile kullanıcılarınızın MFA durumunu kolaylıkla kontrol edebilirsiniz.
Office 365 için diğer 20 güvenlik ipucunun yer aldığı bu makaleye de göz atmayı unutmayın.
Bu scripti faydalı bulduysanız lütfen paylaşın. Herhangi bir sorunuz varsa aşağıya bir yorum bırakmanız yeterli.
Aşağıdaki PowerShell rapor komut dosyalarından birini de beğenebilirsiniz:
- Posta kutusu izinleri raporu
- Posta kutusu boyutu raporu
- OneDrive boyut raporu
