PowerShell ile Office 365'te E-posta Adreslerini Bulma
Bazen belirli bir e-posta adresini kullanan kullanıcıyı veya posta kutusunu bulmanız gerekir. Özellikle takma adları bulmak bazen zordur ve ihtiyacınız olan e-posta adresini kullanıp kullanmadığını kontrol etmek için her posta kutusunu açmak istemezsiniz.
Farklı konumlardaki kullanıcılara veya gruplara e-posta adresleri ekleyebilirsiniz ancak bunların tümü Exchange Online sunucunuzda bir araya gelir. İşte arayacağımız yer orası.
Bunun için yeni Exchange Online PowerShell Modülünü kullanacağız, eğer daha önce kullanmadıysanız bu kısa rehberi takip ederek kurulumunu yapıp Exchange Online’a bağlanabilirsiniz. Yeni modülün avantajı farklı kiracılara kolaylıkla bağlanabilmeniz ve MFA'yı desteklemesidir.
PowerShell ile E-posta adreslerini bulma
Bir posta kutusunun tüm e-posta adresleri EXOMailbox cmdlet'inin EmailAddresses özelliğinde listelenir. E-postaAdreslerine filtre uygulayarak herhangi bir e-posta adresini arayabiliriz. Filtrenin avantajı joker karakterleri de kullanabilmemizdir.
Basit başlayalım ve belirli bir e-posta adresini arayalım. Örnekte exchange-destek@alanadi.com e-posta adresini kimin kullandığını arayacağız.
# Make sure you are connected to Exchange Online
Connect-ExchangeOnline
# Search for the emailaddress
# -eq stands for equels, so the emailaddress must be exactly the same as the given string
Get-EXOMailbox -filter {EmailAddresses -eq "exchange-support@lazydev.onmicrosoft.com"}Sonuç, aradığımız e-posta adresini içeren bir posta kutusudur.
Joker karakterleri kullanma
Joker karakterler, e-posta adresinin bir bölümünde arama yapmanızı sağlar. PowerShell'de, * karakterini dizenin herhangi bir yerine yerleştirilebilecek bir joker karakter belirteci olarak kullanabilirsiniz.
Diyelim ki destek kelimesini içeren bir e-posta adresine sahip tüm posta kutularını bulmak istiyoruz. Destek kelimesinin önünde ve sonrasında joker karakter kullanacağız. -eq operatörünü değil, -like operatörünü kullandığımızı unutmayın.
Birden fazla sonuç beklediğinizde, çıktıyı bir tablodaki ft cmdlet'iyle biçimlendirmek en yararlı yöntemdir.
# Get all mailboxes that contain the word support
Get-EXOMailbox -Filter {EmailAddresses -like "*support*"} | ftFormat tablosu çıktısının (ft) bir dezavantajı, tüm özelliklerin ekranınıza sığmamasıdır. Bunu çözmek için yalnızca ihtiyacınız olan alanları seçebilir, tabloyu otomatik olarak boyutlandırabilir ve satırları sarabilirsiniz.
Get-EXOMailbox -Filter {EmailAddresses -like "*support*"} |
ft -Property DisplayName,RecipientType,Identity,EmailAddresses -AutoSize -WrapDağıtım Listelerinde Ara
Yukarıdaki PowerShell komutları, posta adresini tüm posta kutularında arar. Ancak e-posta adresleri Dağıtım listelerinde veya Office 365 Gruplarında da kullanılabilir.
Dağıtım listelerinde arama yapmak için Exchange Online modülündeki Get-DistributionGroup cmdlet'ini kullanmamız gerekecek.
Dağıtım listesinde iki e-posta alanı vardır: BirincilSMTPAdresi ve EmailAddresses. İkincisini kullanacağız çünkü bu aynı zamanda Dağıtım listesindeki tüm takma adları da içerecektir.
Get-DistributionGroup -Filter {EmailAddresses -like "*support*"} |
ft -Property DisplayName,RecipientType,Identity,EmailAddresses -AutoSize -WrapOffice 365 Gruplarında E-posta Adresini Arama
Bir e-posta adresini aramak isteyebileceğiniz son yer Office 365 Grupları'dır. Gruplar dağıtım gruplarıyla aynı yapıya sahip olduğundan emailaddresses alanında arama yapacağız.
Get-UnifiedGroup -Filter {EmailAddresses -like "*support*"} |
ft -Property DisplayName,RecipientType,Identity,EmailAddresses -AutoSize -WrapPowershell Tüm E-posta Adreslerini ve Takma Adları Listeleyin
Bu prensibi kullanarak ayrıca tüm e-posta adreslerini ve takma adları içeren bir liste alabilir ve bunu örneğin bir CSV dosyasına aktarabiliriz.
EmailAddresses alanı aynı zamanda SPO'yu (SharePoint Online özellikleri için kullanılır) ve SIP adreslerini de içerdiğinden, e-posta adreslerini içeren listeyi almak biraz daha zordur. Dolayısıyla bunları filtrelememiz gerekiyor.
Bir ifade kullanarak EmailAddresses alanını filtreleyebilir ve yalnızca SMTP adresini seçebiliriz. -clike operatörü, büyük/küçük harfe duyarlı bir benzeri operatörüdür.
Get-EXOMailbox |
Select-Object DisplayName,RecipientType,PrimarySmtpAddress, @{Name="Aliases";Expression={$_.EmailAddresses | Where-Object {$_ -clike "smtp:*"}}}Sonuçlarda görebileceğiniz gibi takma adlar smtp: önekini içeriyor. Sonuçları bir csv dosyasına aktarmadan önce bunları da kaldırmak istiyoruz. -join operatörü, birden fazla takma adı aralarında virgül koyarak birleştirir.
Get-EXOMailbox |
Select-Object DisplayName,RecipientType,PrimarySmtpAddress, @{Name="Aliases";Expression={($_.EmailAddresses | Where-Object {$_ -clike "smtp:*"} |
ForEach-Object {$_ -replace "smtp:",""}) -join "," }}Sonuçları excel'e aktarmak istiyorsanız, arkasına yalnızca Export-Csv c:\path\filename.csv eklemeniz gerekir:
Get-EXOMailbox |
Select-Object DisplayName,RecipientType,PrimarySmtpAddress, @{Name="Aliases";Expression={($_.EmailAddresses | Where-Object {$_ -clike "smtp:*"} |
ForEach-Object {$_ -replace "smtp:",""}) -join "," }} |
Export-Csv c:\temp\emailaddresses.csv1000'den fazla sonuç döndür
Varsayılan olarak sonuçlar 1000 kayıtla sınırlıdır. 1000'den fazla posta kutunuz varsa, Get-ExoMailbox cmdlet'inden sonra -ResultSize sınırsız ekleyin:
Get-EXOMailbox -ResultSize unlimitedTüm Office 365 konumlarında E-posta Adresini Arayın
Bir e-posta adresinin kullanımını üç konumda da arayacak küçük bir komut dosyası oluşturdum. Ayrıca e-posta adresinin bir bölümünde de arama yapabilirsiniz. Sonuçların çıktısı alınır veya Export-CSV cmdlet'i ile isterseniz CSV'ye aktarılabilir.
Komut dosyasının tamamını Github depomdan indirebilirsiniz.
param(
[Parameter(
Mandatory = $true,
HelpMessage = "Enter the Exchange Online or Global admin username"
)]
[string]$adminUPN,
[Parameter(
Mandatory = $true,
HelpMessage = "Emailaddress or part of it to find"
)]
[string]$emailAddress
)
Function ConnectTo-EXO {
<#
.SYNOPSIS
Connects to EXO when no connection exists. Checks for EXO v2 module
#>
process {
# Check if EXO is installed and connect if no connection exists
if ((Get-Module -ListAvailable -Name ExchangeOnlineManagement) -eq $null)
{
Write-Host "Exchange Online PowerShell v2 module is requied, 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 Exchange Online PowerShell v2 module" -ForegroundColor Cyan
Install-Module ExchangeOnlineManagement -Repository PSGallery -AllowClobber -Force
}
else
{
Write-Error "Please install EXO v2 module."
}
}
if ((Get-Module -ListAvailable -Name ExchangeOnlineManagement) -ne $null)
{
# Check if there is a active EXO sessions
$psSessions = Get-PSSession | Select-Object -Property State, Name
If (((@($psSessions) -like '@{State=Opened; Name=ExchangeOnlineInternalSession*').Count -gt 0) -ne $true) {
Connect-ExchangeOnline -UserPrincipalName $adminUPN
}
}
else{
Write-Error "Please install EXO v2 module."
}
}
}
Function Search-Mailboxes {
<#
.SYNOPSIS
Search for email address in the mailboxes
#>
process {
Write-Host "Searching in mailboxes for $emailAddress" -ForegroundColor Cyan
Get-EXOMailbox -filter "EmailAddresses -like '*$emailAddress*'"
}
}
Function Search-Distributionlists {
<#
.SYNOPSIS
Search for email address in the distributionlists
#>
process {
Write-Host "Searching in distributionlists for $emailAddress" -ForegroundColor Cyan
Get-DistributionGroup -Filter "EmailAddresses -like '*$emailAddress*'"
}
}
Function Search-Groups {
<#
.SYNOPSIS
Search for email address in the mailboxes
#>
process {
Write-Host "Searching in groups for $emailAddress" -ForegroundColor Cyan
Get-UnifiedGroup -Filter "EmailAddresses -like '*$emailAddress*'"
}
}
Function Search-DynamicDistributionlists {
<#
.SYNOPSIS
Search for email address in the distributionlists
#>
process {
Write-Host "Searching in dynamic distributionlists for $emailAddress" -ForegroundColor Cyan
Get-DynamicDistributionGroup -Filter "EmailAddresses -like '*$emailAddress*'"
}
}
Function Find-EmailAddress{
<#
.SYNOPSIS
Get all AD users
#>
process {
$result = @()
$result += Search-Mailboxes
$result += Search-Distributionlists
$result += Search-Groups
$result += Search-DynamicDistributionlists
$result | ForEach {
[pscustomobject]@{
"DisplayName" = $_.DisplayName
"RecipientType" = $_.RecipientType
"Identity" = $_.identity
"EmailAddresses" = $_.EmailAddresses
}
}
}
}
# Connect to Exchange Online
ConnectTo-EXO
Find-EmailAddress | Sort-Object DisplayName Kapanıyor
Umarım bu makaleyi faydalı bulmuşsunuzdur. Herhangi bir sorunuz varsa aşağıya bir yorum bırakmanız yeterli. Aşağıdaki ilgili makaleleri de beğenebilirsiniz:
- PowerShell ile Exchange Online'a bağlanın
- PowerShell ile kullanıcıları CSV dosyasından güncelleme





