Skip to content

Commit 17f3d47

Browse files
committed
GrantSendOnBehalfTo Permissions Cache
No extra graph calls needed, not tested with a large tenant, (about 200 mailbox permissions works fine)
1 parent 67ee365 commit 17f3d47

3 files changed

Lines changed: 36 additions & 4 deletions

File tree

Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Mailbox Permissions/Push-GetMailboxPermissionsBatch.ps1

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ function Push-GetMailboxPermissionsBatch {
1313

1414
$TenantFilter = $Item.TenantFilter
1515
$Mailboxes = $Item.Mailboxes
16+
$MailboxData = @($Item.MailboxData)
1617
$BatchNumber = $Item.BatchNumber
1718
$TotalBatches = $Item.TotalBatches
1819

@@ -85,10 +86,31 @@ function Push-GetMailboxPermissionsBatch {
8586
$MailboxPermissions['Get-RecipientPermission'] = $NormalizedRecipientPerms
8687
}
8788

89+
$MailboxIdentityLookup = @{}
90+
foreach ($MappedMailbox in ($MailboxData | Where-Object { $_.Id -and $_.UPN })) {
91+
$MailboxIdentityLookup[[string]$MappedMailbox.Id] = [string]$MappedMailbox.UPN
92+
}
93+
94+
# Normalize SendOnBehalf permissions from passed mailbox metadata
95+
$NormalizedSendOnBehalfPerms = foreach ($Mailbox in ($MailboxData | Where-Object { $_.GrantSendOnBehalfTo -and ($Mailboxes -contains $_.UPN) })) {
96+
foreach ($Delegate in (@($Mailbox.GrantSendOnBehalfTo) | Where-Object { $_ -and $MailboxIdentityLookup.ContainsKey([string]$_) })) {
97+
[PSCustomObject]@{
98+
id = [guid]::NewGuid().ToString()
99+
Identity = $Mailbox.UPN
100+
User = $MailboxIdentityLookup[[string]$Delegate]
101+
AccessRights = @('SendOnBehalf')
102+
IsInherited = $false
103+
Deny = $false
104+
}
105+
}
106+
}
107+
$MailboxPermissions['Get-Mailbox'] = @($NormalizedSendOnBehalfPerms)
108+
88109
$MailboxPermCount = if ($MailboxPermissions['Get-MailboxPermission']) { $MailboxPermissions['Get-MailboxPermission'].Count } else { 0 }
89110
$RecipientPermCount = if ($MailboxPermissions['Get-RecipientPermission']) { $MailboxPermissions['Get-RecipientPermission'].Count } else { 0 }
111+
$SendOnBehalfPermCount = if ($MailboxPermissions['Get-Mailbox']) { $MailboxPermissions['Get-Mailbox'].Count } else { 0 }
90112

91-
Write-Information "Completed batch $BatchNumber of $TotalBatches - processed $($Mailboxes.Count) mailboxes: $MailboxPermCount mailbox permissions, $RecipientPermCount recipient permissions"
113+
Write-Information "Completed batch $BatchNumber of $TotalBatches - processed $($Mailboxes.Count) mailboxes: $MailboxPermCount mailbox permissions, $RecipientPermCount recipient permissions, $SendOnBehalfPermCount send-on-behalf permissions"
92114

93115
# Return results to be aggregated by post-execution function
94116
return $MailboxPermissions

Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Mailbox Permissions/Push-StoreMailboxPermissions.ps1

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ function Push-StoreMailboxPermissions {
2828
# Aggregate results by command type from all batches
2929
$AllMailboxPermissions = [System.Collections.Generic.List[object]]::new()
3030
$AllRecipientPermissions = [System.Collections.Generic.List[object]]::new()
31+
$AllSendOnBehalfPermissions = [System.Collections.Generic.List[object]]::new()
3132
$AllCalendarPermissions = [System.Collections.Generic.List[object]]::new()
3233

3334
foreach ($BatchResult in $Results) {
@@ -50,6 +51,11 @@ function Push-StoreMailboxPermissions {
5051
Write-Information "Adding $($ActualResult['Get-RecipientPermission'].Count) recipient permissions"
5152
$AllRecipientPermissions.AddRange($ActualResult['Get-RecipientPermission'])
5253
}
54+
if ($ActualResult['Get-Mailbox']) {
55+
$SendOnBehalfRows = @($ActualResult['Get-Mailbox'])
56+
Write-Information "Adding $($SendOnBehalfRows.Count) send-on-behalf permissions"
57+
$AllSendOnBehalfPermissions.AddRange($SendOnBehalfRows)
58+
}
5359
if ($ActualResult['Get-MailboxFolderPermission']) {
5460
Write-Information "Adding $($ActualResult['Get-MailboxFolderPermission'].Count) calendar permissions"
5561
$AllCalendarPermissions.AddRange($ActualResult['Get-MailboxFolderPermission'])
@@ -63,8 +69,9 @@ function Push-StoreMailboxPermissions {
6369
$AllPermissions = [System.Collections.Generic.List[object]]::new()
6470
$AllPermissions.AddRange($AllMailboxPermissions)
6571
$AllPermissions.AddRange($AllRecipientPermissions)
72+
$AllPermissions.AddRange($AllSendOnBehalfPermissions)
6673

67-
Write-Information "Aggregated $($AllPermissions.Count) total permissions ($($AllMailboxPermissions.Count) mailbox + $($AllRecipientPermissions.Count) recipient)"
74+
Write-Information "Aggregated $($AllPermissions.Count) total permissions ($($AllMailboxPermissions.Count) mailbox + $($AllRecipientPermissions.Count) recipient + $($AllSendOnBehalfPermissions.Count) send-on-behalf)"
6875
Write-Information "Aggregated $($AllCalendarPermissions.Count) calendar permissions"
6976

7077
# Store all permissions together as MailboxPermissions

Modules/CIPPCore/Public/Set-CIPPDBCacheMailboxes.ps1

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ function Set-CIPPDBCacheMailboxes {
2626
Write-LogMessage -API 'CIPPDBCache' -tenant $TenantFilter -message 'Caching mailboxes' -sev Debug
2727

2828
# Get mailboxes with select properties
29-
$Select = 'id,ExchangeGuid,ArchiveGuid,UserPrincipalName,DisplayName,PrimarySMTPAddress,RecipientType,RecipientTypeDetails,EmailAddresses,WhenSoftDeleted,IsInactiveMailbox,ForwardingSmtpAddress,DeliverToMailboxAndForward,ForwardingAddress,HiddenFromAddressListsEnabled,ExternalDirectoryObjectId,MessageCopyForSendOnBehalfEnabled,MessageCopyForSentAsEnabled'
29+
$Select = 'id,ExchangeGuid,ArchiveGuid,UserPrincipalName,DisplayName,PrimarySMTPAddress,RecipientType,RecipientTypeDetails,EmailAddresses,WhenSoftDeleted,IsInactiveMailbox,ForwardingSmtpAddress,DeliverToMailboxAndForward,ForwardingAddress,HiddenFromAddressListsEnabled,ExternalDirectoryObjectId,MessageCopyForSendOnBehalfEnabled,MessageCopyForSentAsEnabled,GrantSendOnBehalfTo'
3030
$ExoRequest = @{
3131
tenantid = $TenantFilter
3232
cmdlet = 'Get-Mailbox'
@@ -51,7 +51,8 @@ function Set-CIPPDBCacheMailboxes {
5151
HiddenFromAddressListsEnabled,
5252
ExternalDirectoryObjectId,
5353
MessageCopyForSendOnBehalfEnabled,
54-
MessageCopyForSentAsEnabled))
54+
MessageCopyForSentAsEnabled,
55+
GrantSendOnBehalfTo))
5556
}
5657

5758
$Mailboxes | Add-CIPPDbItem -TenantFilter $TenantFilter -Type 'Mailboxes' -AddCount
@@ -79,6 +80,7 @@ function Set-CIPPDBCacheMailboxes {
7980
# Separate batches for permissions and rules
8081
$PermissionBatches = [System.Collections.Generic.List[object]]::new()
8182
$RuleBatches = [System.Collections.Generic.List[object]]::new()
83+
$AllMailboxData = @($Mailboxes | Select-Object id, UPN, GrantSendOnBehalfTo)
8284

8385
for ($i = 0; $i -lt $Mailboxes.Count; $i += $BatchSize) {
8486
$BatchMailboxes = $Mailboxes[$i..[Math]::Min($i + $BatchSize - 1, $Mailboxes.Count - 1)]
@@ -92,6 +94,7 @@ function Set-CIPPDBCacheMailboxes {
9294
QueueName = "Mailbox Permissions Batch $BatchNumber/$TotalBatches - $TenantFilter"
9395
TenantFilter = $TenantFilter
9496
Mailboxes = $BatchMailboxUPNs
97+
MailboxData = $AllMailboxData
9598
BatchNumber = $BatchNumber
9699
TotalBatches = $TotalBatches
97100
})

0 commit comments

Comments
 (0)