Key Takeaways
- Understand how Exchange PowerShell commands, parameters, objects, and pipelines fit together.
- Choose the correct PowerShell management plane for Exchange Online, Security & Compliance, Exchange Server, and hybrid environments.
- Use identity, filtering, property selection, and pipeline patterns effectively at scale.
- Recognize how Exchange RBAC can affect cmdlets, parameters, scopes, and automation.
- Apply validation, WhatIf, error handling, verification, and evidence-collection patterns to administrative changes.
Mastering Exchange PowerShell: Parameters, Pipelines, Filtering, and Safe Administration
Exchange administrators usually start by learning individual commands: Get-Mailbox, Set-Mailbox, New-TransportRule, Get-MessageTraceV2, New-MigrationBatch, and so on.
That is useful, but it is not enough.
The real skill is understanding how Exchange PowerShell behaves as a management framework. Once you understand how commands, parameters, objects, pipelines, filters, RBAC, and safe execution fit together, unfamiliar cmdlets become much less intimidating.
You stop searching for one-off examples and start reasoning about the task in front of you.
Why Exchange PowerShell still matters
Graphical admin centers are excellent for small numbers of changes, guided workflows, and visual confirmation. PowerShell becomes essential when the work needs repeatability, speed, evidence, or scale.
A tested script can inventory thousands of mailboxes, find risky forwarding configurations, compare permissions, verify transport configuration, or produce a change record that can be reviewed later.
For Exchange Server, the Exchange Management Shell provides command-line administration for areas such as accounts, connectors, database properties, and distribution groups.
For Exchange Online, the ExchangeOnlineManagement module provides PowerShell administration for mailboxes, recipients, mail flow, and configuration, including REST-backed Exchange Online cmdlets designed for modern administration and bulk retrieval.
A simple rule of thumb is:
- Use the admin center when the task is interactive, simple, or highly visual.
- Use PowerShell when the task is repetitive, large-scale, auditable, or needs exact parameter control.
- Use scripts when the same task will recur, requires validation, or must produce consistent evidence.
- Use Microsoft Graph PowerShell alongside Exchange Online PowerShell for directory-wide Microsoft 365 automation and reporting, but do not assume Graph replaces every Exchange-specific administrative cmdlet.
The modern Exchange PowerShell landscape
Exchange administration is not one PowerShell session. The correct management plane depends on what you are trying to manage.
| Management area | Primary shell/module | Typical purpose |
|---|---|---|
| Exchange Online | ExchangeOnlineManagement; `Connect-ExchangeOnline` | Cloud mailboxes, recipients, mail flow, Exchange Online configuration, and EOP-related tasks |
| Security & Compliance / Purview | `Connect-IPPSSession` | Compliance Search, eDiscovery, retention, audit, DLP, and related compliance tasks |
| Exchange Server | Exchange Management Shell or remote PowerShell | Server, database, DAG, transport, virtual directory, certificate, and on-premises recipient management |
| Hybrid | Exchange Online PowerShell + Exchange Server EMS | Remote mailboxes, cloud archive, connectors, coexistence, migration, and identity-driven attributes |
Throughout this article:
- EXO means Exchange Online PowerShell.
- EMS means Exchange Management Shell.
- S&C means Security & Compliance PowerShell.
Connecting to Exchange Online PowerShell
For interactive administration, the standard pattern is to install or update the ExchangeOnlineManagement module and connect with Connect-ExchangeOnline.
Install-Module ExchangeOnlineManagement -Scope CurrentUser
Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline -UserPrincipalName admin@contoso.com
Get-ConnectionInformation
Disconnect-ExchangeOnline -Confirm:$false
For production operations, avoid connecting repeatedly inside loops. Connect once, run the operation, export results, and disconnect.
A script can keep connection cleanup predictable with try/finally:
Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline -UserPrincipalName admin@contoso.com
try {
# Run discovery, validation, and changes here.
}
finally {
Disconnect-ExchangeOnline -Confirm:$false
}
Connecting to Security & Compliance PowerShell
Security and compliance cmdlets are not all imported into the Exchange Online administrative session.
When a task involves Purview compliance, eDiscovery, retention compliance policy, compliance search, or related investigation workflows, connect to the compliance endpoint explicitly.
Import-Module ExchangeOnlineManagement
Connect-IPPSSession -UserPrincipalName complianceadmin@contoso.com
Get-Command *ComplianceSearch*
Get-Command *RetentionCompliance*
Connecting to Exchange Server on-premises
Exchange Server administration is built around the Exchange Management Shell and remote PowerShell.
A basic EMS session can begin with:
Get-ExchangeServer
Get-OrganizationConfig
A remote PowerShell pattern can look like this:
$Session = New-PSSession `
-ConfigurationName Microsoft.Exchange `
-ConnectionUri http://ex01.contoso.com/PowerShell/ `
-Authentication Kerberos
Import-PSSession $Session -DisableNameChecking
Get-Mailbox -ResultSize 10
Remove-PSSession $Session
In a remote session, commands execute in the remote server context. File paths, certificate imports, and exports can therefore behave differently from local PowerShell operations.
For current on-premises deployments, examples should be treated as Exchange Server Subscription Edition-first. Older environments require version and cumulative-update validation before applying examples in production.
Command discovery: how to find the right cmdlet
Command discovery is one of the most valuable Exchange PowerShell skills.
You do not need to memorize every cmdlet. Instead, learn how to search by noun, verb, and management area.
# Discover mailbox-related commands
Get-Command *Mailbox*
# Discover transport-related commands
Get-Command *Transport*
# Discover Get commands for recipient/reporting work
Get-Command -Verb Get -Noun *Recipient*
# Exchange Management Shell helper when available
Get-ExCommand *Mailbox*
PowerShell verbs also provide an early indication of intent and risk:
| Verb | Typical Exchange meaning | Operational risk |
|---|---|---|
| `Get` | Retrieve configuration, status, or statistics | Low; still consider privacy and data volume |
| `Set` | Modify an existing object | Medium to high; preview and verify |
| `New` | Create an object or request | Medium; verify naming and scope |
| `Remove` | Delete or detach an object, permission, rule, or request | High; confirm reversibility |
| `Enable` / `Disable` | Turn a capability on or off | Medium to high depending on the feature |
| `Add` / `Update` | Add membership, permission, copy, or calculated data | Medium; watch for duplicates and scope |
| `Test` | Run a diagnostic or validation test | Low to medium; may generate traffic or test objects |
That distinction matters. Seeing Get-Mailbox and Remove-Mailbox beside each other in command discovery should immediately tell you that they may operate on the same object, but they carry very different consequences.
Help, syntax, and examples
PowerShell help should be your first escalation point before searching the web.
Get-Help Set-Mailbox
Get-Help Set-Mailbox -Detailed
Get-Help Set-Mailbox -Full
Get-Help Set-Mailbox -Examples
Get-Help Set-Mailbox -Parameter Identity
Get-Help Set-Mailbox -Online
(Get-Command Set-Mailbox).ParameterSets |
Select-Object Name, Parameters
When a cmdlet exposes multiple command forms, you are often looking at different parameter sets. Do not mix parameters from unrelated sets simply because they appear on the same help page.
Parameters: the language of Exchange administration
Parameters tell a cmdlet exactly what to do. The same cmdlet can behave very differently depending on the parameter set and values supplied.
Set-Mailbox -Identity alex@contoso.com -Office 'London'
Set-Mailbox `
-Identity alex@contoso.com `
-HiddenFromAddressListsEnabled $true
Set-Mailbox `
-Identity alex@contoso.com `
-ForwardingSmtpAddress alerts@contoso.com `
-DeliverToMailboxAndForward $true
Common parameter types include:
| Parameter type | Example | How to read it |
|---|---|---|
| Identity | `-Identity alex@contoso.com` | Targets a specific object |
| Switch | `-Archive` | Presence of the switch enables its behavior |
| Boolean | `-HiddenFromAddressListsEnabled $true` | Requires an explicit true/false value |
| String | `-Office "London"` | Use quoted text when spaces or special characters are present |
| Multi-valued | `-AcceptMessagesOnlyFrom user1,user2` | Can accept multiple values depending on syntax |
| Date | `-StartDate "2026-08-01"` | Use unambiguous date formats in scripts |
| Size | `-ProhibitSendQuota 49GB` | Use units supported by the cmdlet |
Values such as Unlimited, $true, $false, and specialized Exchange types should not be treated as arbitrary text. Read the parameter help and examples, then test on one object before turning the command into a bulk script.
Parameter sets and conflict errors
Parameter sets are a common source of administrator confusion.
A cmdlet may support several operational modes. Each mode has its own required and optional parameters. When parameters from different modes are combined, PowerShell may be unable to determine which operation you intended.
(Get-Command New-MigrationBatch).ParameterSets |
Select-Object Name, @{Name='ParameterCount';Expression={$_.Parameters.Count}}
(Get-Command New-MigrationBatch).ParameterSets |
Where-Object Name -like '*IMAP*' |
Select-Object -ExpandProperty Parameters |
Select-Object Name, IsMandatory, ParameterType
The right response to a parameter-set error is not trial and error.
Identify the scenario, find the matching parameter set, remove incompatible parameters, and re-read the examples.
A useful mental model is:
Identity formats and stable targeting
The -Identity parameter looks simple, but it is frequently the difference between a safe script and a risky one.
Exchange objects can often be identified by name, alias, distinguished name, GUID, email address, UPN, or other identity formats.
| Object type | Common identity examples | Automation recommendation |
|---|---|---|
| Mailbox | `alex@contoso.com`; `Alex Wilber`; GUID | Prefer primary SMTP address, UPN, external directory object ID where supported, or GUID |
| Mailbox folder | `alex@contoso.com:Calendar` | Use SMTP/UPN plus folder path; validate localized folder names |
| Distribution group | `DL-Sales`; `sales@contoso.com`; GUID | Prefer SMTP address or GUID for scripts |
| Database copy | `DB01EX01` | Use exact database-copy identity |
| Public folder | `FinanceInvoices` | Use explicit public-folder path and confirm hierarchy |
| Transport rule | `Block External Auto Forwarding` | Prefer exact name; export rule details before modifying |
Avoid display names in automation. They are human-friendly, but they are not guaranteed to be unique and may change.
For repeatable scripts, resolve the object once, capture a stable identifier, and use the resolved identity for the write operation.
$Mailbox = Get-EXOMailbox `
-Identity alex@contoso.com `
-Properties ExternalDirectoryObjectId
$Mailbox |
Select-Object DisplayName, PrimarySmtpAddress, ExternalDirectoryObjectId
Set-Mailbox `
-Identity $Mailbox.PrimarySmtpAddress `
-Office 'London' `
-WhatIf
Objects, properties, and the pipeline
Exchange cmdlets return objects.
This is the foundation of reporting, filtering, and automation. If you think the output is text, you will write fragile scripts. If you understand the output as objects with properties, the pipeline becomes predictable.
$m = Get-EXOMailbox -Identity alex@contoso.com
$m | Get-Member
$m.DisplayName
$m.PrimarySmtpAddress
The pipeline passes objects from one command to the next. Some cmdlets accept pipeline input by value, some by property name, and some not at all.
When a pipeline fails, inspect the input type, output type, and parameter-binding behavior instead of assuming the command is unavailable.
# One mailbox to one statistics object
Get-EXOMailbox -Identity alex@contoso.com |
Get-EXOMailboxStatistics
# Many mailboxes to many statistics objects
Get-EXOMailbox -ResultSize 50 |
Get-EXOMailboxStatistics
# Select properties for reporting
Get-EXOMailbox -ResultSize 50 |
Select-Object DisplayName, PrimarySmtpAddress, RecipientTypeDetails |
Export-Csv .\MailboxInventory.csv -NoTypeInformation
Filtering: Identity, Filter, RecipientFilter, and Where-Object
Filtering is not just syntax. It is scalability.
A small tenant can hide inefficient habits. A large tenant exposes them quickly.
| Method | Example | Best use |
|---|---|---|
| Identity lookup | `Get-Mailbox -Identity alex@contoso.com` | Known single object; clear and targeted |
| Server/service-side filter | `Get-Mailbox -Filter "Department -eq 'Sales'"` | Large directory queries where the service can evaluate the filter |
| `RecipientFilter` | `New-DynamicDistributionGroup -RecipientFilter {...}` | Persistent recipient conditions for dynamic groups, address lists, and policies |
| Client-side `Where-Object` | `Get-Mailbox | Where-Object Department -eq Sales` | Local filtering after retrieval when server-side filtering is unavailable or unsuitable |
Traditional Exchange guidance often favors server-side filtering to reduce the data returned to the client. Modern Exchange Online retrieval adds an important nuance: optimized Get-EXO* cmdlets return a minimum property set by default, and additional properties or property sets can be requested.
For example:
# Server/service-side style
Get-Mailbox -Filter "Department -eq 'Sales'" -ResultSize Unlimited |
Select-Object DisplayName, PrimarySmtpAddress, Department
# EXO optimized retrieval style with explicit properties
Get-EXOMailbox -ResultSize Unlimited -Properties Department,Office |
Where-Object { $_.Department -eq 'Sales' } |
Select-Object DisplayName, PrimarySmtpAddress, Department, Office
EXO property sets and minimal retrieval
EXO-prefixed commands such as Get-EXOMailbox are designed for modern Exchange Online retrieval.
The performance mindset is simple:
Retrieve the smallest useful dataset.
# Default property set
Get-EXOMailbox -ResultSize 10
# Request only what the report requires
Get-EXOMailbox `
-ResultSize Unlimited `
-Properties Department, Office, CustomAttribute1 |
Select-Object DisplayName, PrimarySmtpAddress, Department, Office, CustomAttribute1
# Use a property set when it matches the scenario
Get-EXOMailbox `
-Identity alex@contoso.com `
-PropertySets Archive
Safe execution: WhatIf, Confirm, Verbose, and ErrorAction
# Preview a supported write operation
Set-Mailbox `
-Identity alex@contoso.com `
-Office 'London' `
-WhatIf
# Ask for detailed execution information
Set-Mailbox `
-Identity alex@contoso.com `
-Office 'London' `
-Verbose
# Make errors catchable in scripts
Set-Mailbox `
-Identity alex@contoso.com `
-Office 'London' `
-ErrorAction Stop
| Control | Purpose | Best practice |
|---|---|---|
| `-WhatIf` | Shows the intended action without applying it where supported | Use before bulk changes and destructive operations |
| `-Confirm` | Prompts for confirmation | Useful when testing risky commands |
| `-Confirm:$false` | Suppresses confirmation prompts | Use only in controlled scripts after validation and logging |
| `-Verbose` | Shows additional operational detail | Useful during testing and troubleshooting |
| `-ErrorAction Stop` | Turns non-terminating errors into terminating errors | Use inside `try/catch` blocks |
| `-WarningAction` | Controls warning behavior | Do not hide warnings until you understand them |
| `-ErrorVariable` | Captures errors for reporting | Useful when bulk operations continue after individual failures |
RBAC: why cmdlets and parameters disappear
A useful way to think about Exchange RBAC is:
- Who receives the access.
- What management roles and role entries expose.
- Where management scopes allow the operation.
If a command works for one administrator but not another, compare roles, role assignments, scopes, and parameter visibility before assuming a module or service issue.
# Which roles include a cmdlet?
Get-ManagementRole -Cmdlet Set-Mailbox
# Which role entries include a specific cmdlet?
Get-ManagementRoleEntry '*\Set-Mailbox'
# Which role entries include a specific parameter?
Get-ManagementRoleEntry '*\*' |
Where-Object { $_.Parameters -contains 'LitigationHoldEnabled' } |
Select-Object Role, Name, Parameters
# Which assignments does a role assignee have?
Get-ManagementRoleAssignment -RoleAssignee admin@contoso.com
Interactive command guide
When you are unsure where to begin, start with the task rather than the cmdlet.
Exchange PowerShell field guide
What are you trying to do?
Start with the task rather than the cmdlet. Choose the situation that best matches what is in front of you, and use the suggested commands as a starting point for investigation.
Find the right command
You know what you want to accomplish, but you are not sure which Exchange cmdlet is the right starting point.
Commands to investigate
Get-Command *Mailbox*Get-Command *Transport*Get-Command -Verb Get -Noun *Recipient*Get-ExCommand *Mailbox*Keep in mind
- Use the verb and noun to narrow the search instead of guessing a complete cmdlet name.
- Treat discovery as the first step, not as a last resort after a command fails.
Understand a cmdlet
You found a likely cmdlet and now need to understand its syntax, parameters, examples, or supported combinations.
Commands to investigate
Get-Help Set-Mailbox -DetailedGet-Help Set-Mailbox -ExamplesGet-Help Set-Mailbox -Parameter Identity(Get-Command Set-Mailbox).ParameterSetsKeep in mind
- Parameter sets explain which combinations of parameters belong to different operations.
- When PowerShell cannot resolve a parameter set, step back and identify the operation you actually intended.
Understand the returned object
The command runs, but you need to know what properties are actually available before building the next part of the pipeline.
Commands to investigate
$Mailbox | Get-Member$Mailbox.DisplayName$Mailbox.PrimarySmtpAddressKeep in mind
- PowerShell passes objects through the pipeline rather than simply passing screen text.
- Select-Object shapes data for downstream use; Format-Table and Format-List are for presentation.
Target the right object
You are ready to work with a specific recipient or mailbox and want to avoid relying on an ambiguous display name.
Commands to investigate
Get-EXOMailbox -Identity user@contoso.comGet-EXOMailbox -Identity user@contoso.com -Properties ExternalDirectoryObjectIdKeep in mind
- Resolve the object before changing it.
- Prefer a stable, validated identity when the operation will be repeated or automated.
Filter a population
You have many objects and need to narrow the population before reporting or making a change.
Commands to investigate
Get-Mailbox -Filter "Department -eq 'Sales'"Get-EXOMailbox -Properties Department, OfficeWhere-Object { $_.Department -eq 'Sales' }Keep in mind
- Use service-side filtering where the cmdlet and scenario support it.
- With Get-EXO* cmdlets, remember that properties not retrieved cannot be recovered later with Select-Object.
Prepare a change
You know what needs to change and want to make the operation predictable before touching the service.
Commands to investigate
Set-Mailbox -Identity user@contoso.com -Office 'London' -WhatIfSet-Mailbox -Identity user@contoso.com -Office 'London' -VerboseSet-Mailbox -Identity user@contoso.com -Office 'London' -ErrorAction StopKeep in mind
- Use WhatIf where supported to inspect the intended operation before execution.
- For broader changes, establish the target set and capture the before-state before removing the safety net.
Investigate access or a missing parameter
A command or parameter works for another administrator but is unavailable in your session.
Commands to investigate
Get-ManagementRole -Cmdlet Set-MailboxGet-ManagementRoleEntry '*\Set-Mailbox'Get-ManagementRoleAssignment -RoleAssignee admin@contoso.comKeep in mind
- Exchange RBAC can affect the commands and parameters exposed to an administrator.
- A missing parameter is not automatically a module problem.
Build structured output
You need an inventory or report that can be reviewed, retained, or processed later.
Commands to investigate
Get-EXOMailbox -ResultSize UnlimitedSelect-Object DisplayName, PrimarySmtpAddress, RecipientTypeDetailsExport-Csv .\MailboxInventory.csv -NoTypeInformationKeep in mind
- Keep reporting pipelines object-oriented until the output boundary.
- Retrieve only the properties the report actually needs.
Application RBAC, app-only authentication, and automation identities
Unattended Exchange Online automation should not depend on a human typing credentials into a scheduled task.
Certificate-based app-only authentication is an appropriate pattern for supported unattended scenarios, while managed identity can be used where the automation platform and workload support it.
Application authentication does not bypass Exchange RBAC.
A successful authentication only proves that the identity can connect. It does not prove that the identity is authorized to run every Exchange cmdlet or parameter.
# Pattern only. Use your registered app, certificate, and tenant values.
Connect-ExchangeOnline `
-AppId '00000000-0000-0000-0000-000000000000' `
-CertificateThumbprint 'THUMBPRINT' `
-Organization 'contoso.onmicrosoft.com'
# Validate assigned Exchange roles and test authorization where applicable.
Get-ManagementRoleAssignment -RoleAssignee 'AppDisplayName'
Logging, transcripts, and evidence
A good Exchange script should leave evidence:
- what it intended to change,
- what it actually changed,
- what failed,
- and how the result was verified.
A simple evidence pattern can establish a run folder and transcript:
$RunId = Get-Date -Format 'yyyyMMdd-HHmmss'
$LogRoot = Join-Path $PWD "EXO-Run-$RunId"
New-Item -ItemType Directory -Path $LogRoot -Force | Out-Null
Start-Transcript -Path (Join-Path $LogRoot 'transcript.txt')
try {
Get-EXOMailbox -ResultSize 100 |
Select-Object DisplayName, PrimarySmtpAddress, RecipientTypeDetails |
Export-Csv (Join-Path $LogRoot 'mailbox-inventory.csv') -NoTypeInformation
}
finally {
Stop-Transcript
}
Error handling and idempotence
Idempotent scripts can be run more than once without causing repeated unwanted changes.
The basic idea is straightforward: check the current state, compare it with the desired state, and change only what differs.
$DesiredOffice = 'London'
$Mailbox = Get-EXOMailbox `
-Identity alex@contoso.com `
-Properties Office
if ($Mailbox.Office -ne $DesiredOffice) {
Set-Mailbox `
-Identity $Mailbox.PrimarySmtpAddress `
-Office $DesiredOffice `
-WhatIf
}
else {
Write-Host "No change required for $($Mailbox.PrimarySmtpAddress)"
}
For bulk operations, capture a result for every object rather than allowing one failure to disappear inside a long-running pipeline.
$Results = foreach ($row in Import-Csv .\mailbox-updates.csv) {
try {
$mbx = Get-EXOMailbox `
-Identity $row.Identity `
-ErrorAction Stop
Set-Mailbox `
-Identity $mbx.PrimarySmtpAddress `
-Office $row.Office `
-ErrorAction Stop
[pscustomobject]@{
Identity = $row.Identity
Status = 'Success'
Error = $null
}
}
catch {
[pscustomobject]@{
Identity = $row.Identity
Status = 'Failed'
Error = $_.Exception.Message
}
}
}
$Results | Export-Csv .\mailbox-update-results.csv -NoTypeInformation
Reporting patterns: CSV, HTML, and reproducible output
The first rule of reporting is simple:
Export objects, not formatted screen output.
Use Select-Object to choose stable columns, Export-Csv for analysis, and ConvertTo-Html when you intentionally want a human-readable report.
# CSV report
Get-EXOMailbox `
-ResultSize Unlimited `
-Properties Department,Office |
Select-Object DisplayName,PrimarySmtpAddress,RecipientTypeDetails,Department,Office |
Export-Csv .\exo-mailbox-inventory.csv -NoTypeInformation
An HTML report can be built from the same object-oriented pipeline:
$Report = Get-EXOMailbox -ResultSize 100 |
Select-Object DisplayName,PrimarySmtpAddress,RecipientTypeDetails |
ConvertTo-Html -Title 'Mailbox Inventory'
$Report | Out-File .\mailbox-inventory.html -Encoding utf8
Production readiness checklist
| Area | Check |
|---|---|
| Access | Confirm the administrator role, RBAC scope, and whether the cmdlet belongs to EXO, S&C, or EMS |
| Targeting | Use stable identifiers and avoid ambiguous display names |
| Scope | Start with one object, then a pilot group, then a controlled batch |
| Preview | Use `-WhatIf` where supported and export planned changes |
| Logging | Use a transcript plus structured CSV/JSON result files |
| Error handling | Use `-ErrorAction Stop` for expected catch points and capture failures per object |
| Rollback | Export pre-change state and document the reverse command or recovery path |
| Performance | Limit properties and result sizes; avoid large `Format-List *` inventory runs |
| Security | Avoid hardcoded secrets; use an appropriate app-only, certificate, or managed-identity pattern for unattended automation |
| Verification | Run independent read commands after the change and export the evidence |
Once those questions become routine, Exchange PowerShell becomes much easier to reason about—even when the cmdlet itself is unfamiliar.
References
- Exchange PowerShell documentation
Microsoft Learn documentation covering Exchange Server PowerShell, Exchange Online PowerShell, Security & Compliance PowerShell, cmdlet syntax, permissions, and connection methods.
- Connect to Exchange Online PowerShell
Microsoft guidance for loading the Exchange Online PowerShell module, connecting with modern authentication, validating the connection, and disconnecting.
- Connect to Security & Compliance PowerShell
Microsoft guidance for connecting to Security & Compliance PowerShell with the Exchange Online PowerShell module.
- Get-EXOMailbox
Microsoft reference for the modern Exchange Online mailbox retrieval cmdlet, including minimum properties and additional property selection.
- Find the permissions required to run any Exchange cmdlet
Microsoft guidance for identifying the management roles, role groups, parameters, and scopes associated with Exchange cmdlet permissions.
- App-only authentication in Exchange Online PowerShell and Security & Compliance PowerShell
Microsoft guidance for certificate-based app-only authentication and unattended Exchange PowerShell automation.
- Property sets in Exchange Online PowerShell module cmdlets
Microsoft documentation describing property sets available to modern Get-EXO cmdlets and how they control returned properties.