Найдите адреса электронной почты в Office 365 с помощью PowerShell
Иногда нужно найти пользователя или почтовый ящик, который использует определенный адрес электронной почты. Особенно трудно найти псевдонимы, и вы не хотите открывать каждый почтовый ящик, чтобы проверить, использует ли он нужный вам адрес электронной почты.
Вы можете добавлять адреса электронной почты пользователям или группам в разных местах, но все они сводятся вместе на вашем сервере Exchange Online. Так что это то место, где мы будем искать.
Мы собираемся использовать новый модуль PowerShell для Exchange Online для этого. Если вы ранее не использовали его, вы можете следовать этому краткому руководству, чтобы установить его и подключиться к Exchange Online. Преимущество нового модуля заключается в том, что вы можете легко подключаться к разным арендаторам, и он поддерживает многофакторную аутентификацию (MFA).
Поиск адресов электронной почты с помощью PowerShell
Все адреса электронной почты почтового ящика перечислены в свойстве EmailAddresses командлета EXOMailbox. Мы можем искать любой адрес электронной почты, применяя фильтр к EmailAddresses. Преимущество фильтра заключается в том, что мы также можем использовать подстановочные знаки.
Давайте начнем с простого и поищем конкретный адрес электронной почты. В данном примере мы будем искать, кто использует адрес электронной почты exchange-support@domain.com.
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"}Результатом является один почтовый ящик, который содержит искомый адрес электронной почты.
Использование подстановочных знаков
Подстановочные знаки позволяют вам выполнять поиск по части адреса электронной почты. В PowerShell вы можете использовать * в качестве подстановочного знака, который можно размещать в любом месте строки.
Предположим, мы хотим найти все почтовые ящики, которые имеют адрес электронной почты, содержащий слово "поддержка". Мы будем использовать подстановочный знак перед и после слова Поддержка. Обратите внимание, что мы не используем оператор -eq, а используем оператор -like.
Когда вы ожидаете несколько результатов, наиболее полезно форматировать вывод в виде таблицы с помощью команды ft
Get all mailboxes that contain the word support
Get-EXOMailbox -Filter {EmailAddresses -like "*support*"} | ftОдин из недостатков вывода формата таблицы (ft) заключается в том, что не все свойства помещаются на вашем экране. Чтобы решить эту проблему, вы можете выбрать только нужные поля, автоматически изменить размер таблицы и перенести строки.
Get-EXOMailbox -Filter {EmailAddresses -like "*support*"} |
ft -Property DisplayName,RecipientType,Identity,EmailAddresses -AutoSize -WrapПоиск в распределительных списках
Команды PowerShell выше ищут по всем почтовым ящикам адрес электронной почты. Но адреса электронной почты также могут использоваться в распределительных списках или группах Office 365.
Чтобы просматривать списки рассылки, нам нужно использовать командлет Get-DistributionGroup из модуля Exchange Online.
В списке рассылки есть два поля электронной почты: PrimarySMTPAddress и EmailAddresses. Мы собираемся использовать последнее, так как оно также будет содержать все псевдонимы из списка рассылки.
Get-DistributionGroup -Filter {EmailAddresses -like "*support*"} |
ft -Property DisplayName,RecipientType,Identity,EmailAddresses -AutoSize -WrapПоиск адреса электронной почты в группах Office 365
Последнее место, где вы можете захотеть найти адрес электронной почты, — это группы Office 365. Группы имеют ту же структуру, что и распределительные группы, поэтому мы будем искать в поле emailaddresses.
Get-UnifiedGroup -Filter {EmailAddresses -like "*support*"} |
ft -Property DisplayName,RecipientType,Identity,EmailAddresses -AutoSize -WrapPowerShell: Список всех адресов электронной почты иAliasов
Используя этот принцип, мы также можем получить список всех адресов электронной почты и псевдонимов и, например, экспортировать его в файл CSV.
Получить список с адресами электронной почты немного сложнее, потому что поле EmailAddresses также содержит адреса SPO (используемые для функций SharePoint Online) и SIP-адреса. Поэтому нам нужно отфильтровать их.
Используя выражение, мы можем фильтровать поле EmailAddresses и выбирать только SMTP адрес. Оператор -clike является регистронезависимым оператором подобия.
Get-EXOMailbox |
Select-Object DisplayName,RecipientType,PrimarySmtpAddress, @{Name="Aliases";Expression={$_.EmailAddresses | Where-Object {$_ -clike "smtp:*"}}}Как вы можете видеть из результатов, псевдонимы содержат префикс smtp:. Мы также хотим удалить их перед экспортом результатов в файл csv. Оператор -join объединяет несколько псевдонимов с запятой между ними.
Get-EXOMailbox |
Select-Object DisplayName,RecipientType,PrimarySmtpAddress, @{Name="Aliases";Expression={($_.EmailAddresses | Where-Object {$_ -clike "smtp:*"} |
ForEach-Object {$_ -replace "smtp:",""}) -join "," }}Если вы хотите экспортировать результаты в Excel, вам нужно только добавить Export-Csv c:\path\filename.csv после этого:
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.csvВернуть более 1000 результатов
По умолчанию результаты ограничены 1000 записями. Если у вас больше 1000 почтовых ящиков, добавьте -ResultSize unlimited после Get-ExoMailbox команды:
Get-EXOMailbox -ResultSize unlimitedПоиск email-адреса во всех местах Office 365
Я создал небольшой скрипт, который будет искать во всех трех местах использование адреса электронной почты. Вы также можете искать по части адреса электронной почты. Результаты выводятся или могут быть экспортированы в CSV, если вам это нужно, с помощью команды Export-CSV.
Вы можете скачать полный скрипт здесь из моего репозитория на Github.
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 Завершение
Надеюсь, вы нашли эту статью полезной. Если у вас есть вопросы, просто оставьте комментарий ниже. Вам также могут понравиться следующие связанные статьи:
- Подключитесь к Exchange Online с помощью PowerShell
- Обновить пользователей из CSV-файла с помощью PowerShell





