Exchange Online PowerShell

Exchange Online PowerShell cmdlets for Microsoft 365 email management.

Module Setup & Connection

Install-Module -Name ExchangeOnlineManagement

Install Exchange Online module

Import-Module ExchangeOnlineManagement

Import Exchange Online module

Connect-ExchangeOnline

Connect to Exchange Online

Connect-ExchangeOnline -UserPrincipalName admin@domain.com

Connect with specific account

Connect-ExchangeOnline -CertificateThumbprint <thumbprint> -AppId <appid> -Organization tenant.onmicrosoft.com

Connect with certificate authentication

Disconnect-ExchangeOnline

Disconnect from Exchange Online

Get-Command -Module ExchangeOnlineManagement

List all Exchange Online cmdlets

Mailbox Management

Get-Mailbox

Get all mailboxes

Get-Mailbox -Identity user@domain.com

Get specific mailbox

Get-Mailbox -RecipientTypeDetails UserMailbox

Get user mailboxes only

Get-Mailbox -RecipientTypeDetails SharedMailbox

Get shared mailboxes

New-Mailbox -Name "John Doe" -UserPrincipalName john@domain.com

Create new mailbox

Set-Mailbox -Identity user@domain.com -ProhibitSendQuota 50GB

Set mailbox quota

Enable-Mailbox -Identity user@domain.com

Enable mailbox for user

Disable-Mailbox -Identity user@domain.com

Disable mailbox

Remove-Mailbox -Identity user@domain.com

Remove mailbox

Get-MailboxStatistics -Identity user@domain.com

Get mailbox size statistics

Get-Mailbox | Get-MailboxStatistics | Select DisplayName,TotalItemSize

Get all mailbox sizes

Shared Mailbox Management

New-Mailbox -Shared -Name "Support Team" -PrimarySmtpAddress support@domain.com

Create shared mailbox

Set-Mailbox -Identity shared@domain.com -Type Shared

Convert mailbox to shared

Add-MailboxPermission -Identity shared@domain.com -User user@domain.com -AccessRights FullAccess

Grant full access to shared mailbox

Remove-MailboxPermission -Identity shared@domain.com -User user@domain.com -AccessRights FullAccess

Remove full access permission

Add-RecipientPermission -Identity shared@domain.com -Trustee user@domain.com -AccessRights SendAs

Grant Send As permission

Get-MailboxPermission -Identity shared@domain.com

List mailbox permissions

Distribution Group Management

Get-DistributionGroup

Get all distribution groups

Get-DistributionGroup -Identity "Group Name"

Get specific group

New-DistributionGroup -Name "Team Group" -PrimarySmtpAddress team@domain.com

Create distribution group

Set-DistributionGroup -Identity team@domain.com -DisplayName "New Name"

Update group properties

Remove-DistributionGroup -Identity team@domain.com

Delete distribution group

Add-DistributionGroupMember -Identity team@domain.com -Member user@domain.com

Add member to group

Remove-DistributionGroupMember -Identity team@domain.com -Member user@domain.com

Remove member from group

Get-DistributionGroupMember -Identity team@domain.com

List group members

Mail Flow Rules (Transport Rules)

Get-TransportRule

Get all mail flow rules

Get-TransportRule -Identity "Rule Name"

Get specific rule

New-TransportRule -Name "Disclaimer" -ApplyHtmlDisclaimerText "<p>Disclaimer</p>"

Create mail flow rule

Set-TransportRule -Identity "Rule Name" -Priority 0

Change rule priority

Enable-TransportRule -Identity "Rule Name"

Enable rule

Disable-TransportRule -Identity "Rule Name"

Disable rule

Remove-TransportRule -Identity "Rule Name"

Delete rule

Anti-Spam & Protection

Get-HostedContentFilterPolicy

Get anti-spam policies

Set-HostedContentFilterPolicy -Identity Default -SpamAction MoveToJmf

Configure spam action

Get-HostedOutboundSpamFilterPolicy

Get outbound spam filter policy

Get-MalwareFilterPolicy

Get malware filter policies

Get-PhishFilterPolicy

Get anti-phishing policies

Get-SafeLinksPolicy

Get Safe Links policies (Defender)

Get-SafeAttachmentPolicy

Get Safe Attachments policies (Defender)

Mail Contact & User Management

Get-MailContact

Get all mail contacts

New-MailContact -Name "External User" -ExternalEmailAddress external@company.com

Create mail contact

Set-MailContact -Identity contact@domain.com -DisplayName "New Name"

Update mail contact

Remove-MailContact -Identity contact@domain.com

Remove mail contact

Get-MailUser

Get all mail users

Get-User

Get all users

Calendar & Resource Mailboxes

Get-Mailbox -RecipientTypeDetails RoomMailbox

Get room mailboxes

Get-Mailbox -RecipientTypeDetails EquipmentMailbox

Get equipment mailboxes

New-Mailbox -Room -Name "Conference Room A" -PrimarySmtpAddress room-a@domain.com

Create room mailbox

New-Mailbox -Equipment -Name "Projector 1" -PrimarySmtpAddress proj1@domain.com

Create equipment mailbox

Set-CalendarProcessing -Identity room-a@domain.com -AutomateProcessing AutoAccept

Enable auto-accept for room

Set-CalendarProcessing -Identity room-a@domain.com -BookingWindowInDays 180

Set booking window

Get-CalendarProcessing -Identity room-a@domain.com

Get calendar processing settings

Email Address Policies & Addresses

Get-EmailAddressPolicy

Get email address policies

Update-EmailAddressPolicy -Identity "Default Policy"

Apply email address policy

Set-Mailbox -Identity user@domain.com -EmailAddresses @{Add="smtp:alias@domain.com"}

Add email alias

Set-Mailbox -Identity user@domain.com -PrimarySmtpAddress newprimary@domain.com

Change primary email address

Get-Recipient -Filter {EmailAddresses -like "*@olddomain.com"}

Find recipients with specific domain

Message Tracking & Logs

Get-MessageTrace -SenderAddress sender@domain.com -StartDate (Get-Date).AddDays(-7)

Track messages from sender

Get-MessageTrace -RecipientAddress recipient@domain.com -StartDate (Get-Date).AddDays(-1)

Track messages to recipient

Get-MessageTraceDetail -MessageTraceId <id> -RecipientAddress user@domain.com

Get detailed message trace

Start-HistoricalSearch -ReportTitle "Search" -StartDate 1/1/2024 -EndDate 1/31/2024

Start historical message search

Get-HistoricalSearch

Get historical search status

Mailbox Permissions & Delegation

Add-MailboxPermission -Identity user@domain.com -User delegate@domain.com -AccessRights FullAccess

Grant full access permission

Remove-MailboxPermission -Identity user@domain.com -User delegate@domain.com -AccessRights FullAccess

Remove full access permission

Add-RecipientPermission -Identity user@domain.com -Trustee delegate@domain.com -AccessRights SendAs

Grant Send As permission

Add-MailboxFolderPermission -Identity user@domain.com:\Calendar -User delegate@domain.com -AccessRights Editor

Grant calendar permissions

Get-MailboxPermission -Identity user@domain.com

List mailbox permissions

Get-MailboxFolderPermission -Identity user@domain.com:\Calendar

List calendar permissions

Mailbox Audit & Compliance

Set-Mailbox -Identity user@domain.com -AuditEnabled $true

Enable mailbox auditing

Get-Mailbox -ResultSize Unlimited | Set-Mailbox -AuditEnabled $true

Enable audit for all mailboxes

Search-MailboxAuditLog -Identity user@domain.com -StartDate 1/1/2024

Search mailbox audit log

Get-MailboxAuditBypassAssociation

Get audit bypass associations

New-ComplianceSearch -Name "Search" -ExchangeLocation All -ContentMatchQuery "subject:confidential"

Create compliance search

Inbox Rules & OWA Policies

Get-InboxRule -Mailbox user@domain.com

Get user inbox rules

Remove-InboxRule -Mailbox user@domain.com -Identity "Rule Name"

Remove inbox rule

Get-OwaMailboxPolicy

Get Outlook Web App policies

Set-OwaMailboxPolicy -Identity Default -DirectFileAccessOnPublicComputersEnabled $false

Configure OWA policy

Quarantine & Blocked Senders

Get-QuarantineMessage

Get quarantined messages

Release-QuarantineMessage -Identity <id>

Release message from quarantine

Delete-QuarantineMessage -Identity <id>

Delete quarantined message

Get-BlockedSenderAddress

Get blocked sender addresses

Set-HostedContentFilterPolicy -Identity Default -BlockedSenders @{Add="spam@spammer.com"}

Add blocked sender

Reports & Statistics

Get-Mailbox | Get-MailboxStatistics | Sort-Object TotalItemSize -Descending

Get mailboxes by size

Get-Mailbox -ResultSize Unlimited | Measure-Object

Count total mailboxes

Get-DistributionGroup | Measure-Object

Count distribution groups

Get-Mailbox | Get-MailboxStatistics | Select DisplayName,ItemCount,@{n="Size(MB)";e={[math]::Round($_.TotalItemSize.Value.ToMB(),2)}}

Mailbox size report

Get-Mailbox | Export-Csv mailboxes.csv -NoTypeInformation

Export mailbox list to CSV

Bulk Operations

Import-Csv users.csv | ForEach-Object {New-Mailbox -Name $_.Name -UserPrincipalName $_.UPN}

Bulk create mailboxes from CSV

Get-Mailbox | Set-Mailbox -RetainDeletedItemsFor 30

Bulk set deleted item retention

Get-Mailbox -RecipientTypeDetails SharedMailbox | Export-Csv shared-mailboxes.csv

Export shared mailboxes

Import-Csv members.csv | ForEach-Object {Add-DistributionGroupMember -Identity "Group" -Member $_.Email}

Bulk add group members

Session Connection Procedure

# Step 1: Verify module installation

Get-Module -ListAvailable ExchangeOnlineManagement

# Step 2: Install module if missing

Install-Module -Name ExchangeOnlineManagement -Force

# Step 3: Import module

Import-Module ExchangeOnlineManagement

# Step 4: Connect to Exchange Online

Connect-ExchangeOnline

# Step 5: Verify connection

Get-Mailbox -ResultSize 1

# Alternative: Connect with UPN

Connect-ExchangeOnline -UserPrincipalName admin@domain.com

# Alternative: Connect with certificate

Connect-ExchangeOnline -CertificateThumbprint <thumbprint> -AppId <appid> -Organization tenant.onmicrosoft.com

Session Disconnection Procedure

# Step 1: Verify active session

Get-ConnectionInformation

# Step 2: Disconnect from Exchange Online

Disconnect-ExchangeOnline -Confirm:$false

# Step 3: Verify disconnection

Get-ConnectionInformation (should be empty)

# Step 4: Remove module (optional)

Remove-Module ExchangeOnlineManagement