If you’ve ever needed to replicate mailbox permissions from one user to another in Microsoft 365, you know it’s not a simple copy/paste operation. Mailbox delegation permissions are configured individually for each mailbox, and they come in three distinct flavors: Full Access, Send As, and Send on Behalf.
Each type uses its own permission model and requires different PowerShell CmdLets to manage, which means there’s no one-size-fits-all approach. In this blog, we’ll walk through how to copy mailbox delegation permissions from one user to another in Microsoft 365.
What are the Mailbox Permission Types in Microsoft 365
Before we dive into the how-to, let’s clarify what each permission type does:
- Full Access: Allows a delegate to open another user’s mailbox and read, create, modify, and delete items. The delegate can’t send email as that user unless they also have Send As or Send on Behalf permissions.
- Send As: Lets a delegate send email that appears to come directly from the mailbox owner. Recipients see the owner’s name in the “From” field, not the delegate’s.
- Send on Behalf: Similar to Send As, but recipients can see that the email was sent by the delegate on behalf of the mailbox owner (it shows as “Delegate on behalf of Owner”).
Each of these permissions is managed separately in Microsoft 365’s backend, which is why copying them requires different commands.
How to Copy Mailbox Permissions Using Exchange Admin Center
Most admins who handle this task through the Exchange Admin Center follow a painful, click-intensive process:
- Sign in to the Exchange admin center.
- Go to Recipients > Mailboxes.
- Select the source mailbox and click Delegation in the properties pane to see all assigned permissions.
From there, they document each assigned permission, navigate back to the mailbox list, open the target mailbox, and manually re-add every delegate one by one, repeating the process for each permission type. This constant back-and-forth navigation involves dozens of clicks, increases the risk of errors, and can easily become a time-consuming process when multiple delegates are involved.
Copy Mailbox Permission From One User to Another Using PowerShell
PowerShell offers a way to automate this, but you need to understand which cmdlets handle which permissions. Here’s a complete example that extracts all three delegation types from a source mailbox and applies them to a target mailbox.
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[string]$SourceMailbox,
[Parameter(Mandatory=$true)]
[string]$TargetMailbox
)
# Function to write colored output
function Write-ColorOutput {
param(
[string]$Message,
[string]$Color = "White"
)
Write-Host $Message -ForegroundColor $Color
}
# Check if Exchange Online module is installed
if (-not (Get-Module -ListAvailable -Name ExchangeOnlineManagement)) {
Write-ColorOutput "Exchange Online PowerShell module is not installed." "Red"
Write-ColorOutput "Please install it using: Install-Module -Name ExchangeOnlineManagement" "Yellow"
exit
}
# Connect to Exchange Online
Write-ColorOutput "`nConnecting to Exchange Online..." "Cyan"
try {
Connect-ExchangeOnline -ShowBanner:$false
Write-ColorOutput "Successfully connected to Exchange Online.`n" "Green"
} catch {
Write-ColorOutput "Failed to connect to Exchange Online: $_" "Red"
exit
}
# Verify source mailbox exists
Write-ColorOutput "Verifying source mailbox: $SourceMailbox" "Cyan"
try {
$SourceMbxObj = Get-Mailbox -Identity $SourceMailbox -ErrorAction Stop
Write-ColorOutput "Source mailbox found.`n" "Green"
} catch {
Write-ColorOutput "Source mailbox not found: $_" "Red"
exit
}
# Verify target mailbox exists
Write-ColorOutput "Verifying target mailbox: $TargetMailbox" "Cyan"
try {
$TargetMbxObj = Get-Mailbox -Identity $TargetMailbox -ErrorAction Stop
Write-ColorOutput "Target mailbox found.`n" "Green"
} catch {
Write-ColorOutput "Target mailbox not found: $_" "Red"
exit
}
# Initialize counters
$FullAccessCount = 0
$SendAsCount = 0
$SendOnBehalfCount = 0
# Copy Full Access permissions
Write-ColorOutput "=" * 60 "Cyan"
Write-ColorOutput "COPYING FULL ACCESS PERMISSIONS" "Cyan"
Write-ColorOutput "=" * 60 "Cyan"
try {
$FullAccessPerms = Get-MailboxPermission -Identity $SourceMailbox |
Where-Object {
$_.User -notlike "NT AUTHORITY\*" -and
$_.User -notlike "S-1-5-*" -and
$_.IsInherited -eq $false -and
$_.AccessRights -contains "FullAccess"
}
if ($FullAccessPerms) {
foreach ($Perm in $FullAccessPerms) {
try {
Add-MailboxPermission -Identity $TargetMailbox -User $Perm.User -AccessRights FullAccess -InheritanceType All -ErrorAction Stop | Out-Null
Write-ColorOutput "✓ Added Full Access for: $($Perm.User)" "Green"
$FullAccessCount++
} catch {
Write-ColorOutput "✗ Failed to add Full Access for $($Perm.User): $_" "Red"
}
}
} else {
Write-ColorOutput "No Full Access permissions found on source mailbox." "Yellow"
}
} catch {
Write-ColorOutput "Error retrieving Full Access permissions: $_" "Red"
}
Write-ColorOutput ""
# Copy Send As permissions
Write-ColorOutput "=" * 60 "Cyan"
Write-ColorOutput "COPYING SEND AS PERMISSIONS" "Cyan"
Write-ColorOutput "=" * 60 "Cyan"
try {
$SendAsPerms = Get-RecipientPermission -Identity $SourceMailbox |
Where-Object {
$_.Trustee -notlike "NT AUTHORITY\*" -and
$_.Trustee -notlike "S-1-5-*" -and
$_.AccessRights -contains "SendAs"
}
if ($SendAsPerms) {
foreach ($Perm in $SendAsPerms) {
try {
Add-RecipientPermission -Identity $TargetMailbox -Trustee $Perm.Trustee -AccessRights SendAs -Confirm:$false -ErrorAction Stop | Out-Null
Write-ColorOutput "✓ Added Send As for: $($Perm.Trustee)" "Green"
$SendAsCount++
} catch {
Write-ColorOutput "✗ Failed to add Send As for $($Perm.Trustee): $_" "Red"
}
}
} else {
Write-ColorOutput "No Send As permissions found on source mailbox." "Yellow"
}
} catch {
Write-ColorOutput "Error retrieving Send As permissions: $_" "Red"
}
Write-ColorOutput ""
# Copy Send on Behalf permissions
Write-ColorOutput "=" * 60 "Cyan"
Write-ColorOutput "COPYING SEND ON BEHALF PERMISSIONS" "Cyan"
Write-ColorOutput "=" * 60 "Cyan"
try {
$SendOnBehalfPerms = $SourceMbxObj.GrantSendOnBehalfTo
if ($SendOnBehalfPerms -and $SendOnBehalfPerms.Count -gt 0) {
try {
Set-Mailbox -Identity $TargetMailbox -GrantSendOnBehalfTo @{Add=$SendOnBehalfPerms} -ErrorAction Stop
foreach ($Delegate in $SendOnBehalfPerms) {
Write-ColorOutput "✓ Added Send on Behalf for: $Delegate" "Green"
$SendOnBehalfCount++
}
} catch {
Write-ColorOutput "✗ Failed to add Send on Behalf permissions: $_" "Red"
}
} else {
Write-ColorOutput "No Send on Behalf permissions found on source mailbox." "Yellow"
}
} catch {
Write-ColorOutput "Error retrieving Send on Behalf permissions: $_" "Red"
}
# Summary
Write-ColorOutput "`n" "White"
Write-ColorOutput "=" * 60 "Cyan"
Write-ColorOutput "SUMMARY" "Cyan"
Write-ColorOutput "=" * 60 "Cyan"
Write-ColorOutput "Source Mailbox: $SourceMailbox" "White"
Write-ColorOutput "Target Mailbox: $TargetMailbox" "White"
Write-ColorOutput ""
Write-ColorOutput "Permissions Copied:" "White"
Write-ColorOutput " • Full Access: $FullAccessCount" "White"
Write-ColorOutput " • Send As: $SendAsCount" "White"
Write-ColorOutput " • Send on Behalf: $SendOnBehalfCount" "White"
Write-ColorOutput ""
Write-ColorOutput "Total Permissions: $($FullAccessCount + $SendAsCount + $SendOnBehalfCount)" "Green"
Write-ColorOutput "=" * 60 "Cyan"
Write-ColorOutput "`nPermission copy complete!" "Green"
Write-ColorOutput ""
While this script works, it requires PowerShell knowledge, careful testing, and understanding of Exchange Online cmdlets. You also need to handle edge cases like inherited permissions, system accounts, and mailboxes that might already have some delegations configured.
There’s a Better Way: EasyEntra Does the Heavy Lifting
What if you could skip both the clicking marathon and the PowerShell scripting altogether?
EasyEntra is built specifically to solve frustrating Microsoft 365 admin tasks like this. Instead of choosing between tedious manual work or complex scripting, you get a streamlined, visual interface that just works.
How EasyEntra Simplifies Permission Copying:
With the Exchange Admin Center: 50+ clicks, 15-20 minutes, high error risk.
With PowerShell: Script maintenance, testing, troubleshooting, and documentation.
With EasyEntra: Select source mailbox, copy permissions with Ctrl+C, select target mailbox, paste with Ctrl+V. Done.
What You Get:
- Visual permission comparison – See exactly what’s on each mailbox at a glance.
- Standard copy/paste workflow – Use familiar Ctrl+C and Ctrl+V keyboard shortcuts to copy all three permission types correctly, every time.
- Export flexibility – Copy permissions directly to Notepad, Excel, or any text editor for documentation or bulk editing.
- Bulk operations – Paste permissions to multiple mailboxes simultaneously.
- Audit trail – Know exactly what changed and when.
- Zero scripting required – No PowerShell knowledge needed.
- Always up-to-date – No script maintenance when Microsoft updates its APIs.
Want a step-by-step walkthrough? Check out the complete guide:
How to Copy Mailbox Permissions with EasyEntra