Skip to content

Commit cd2d86a

Browse files
committed
fix: Record permission update status and adjust retry logic
Capture results from Add-CIPPApplicationPermission/Add-CIPPDelegatedPermission, detect and aggregate permission failures (excluding service principal creation failures), and log success/warn messages accordingly. Persist LastStatus and LastError to the CPV graph row so downstream logic knows whether the update succeeded. Also add an error log in the catch block. Update the orchestrator selection logic to use LastStatus when deciding retry interval: failed or missing statuses are retried after 1 day, successful tenants after 7 days. This makes retries for failing tenants more aggressive while avoiding unnecessary reprocessing of stable tenants.
1 parent 81b46f2 commit cd2d86a

2 files changed

Lines changed: 30 additions & 4 deletions

File tree

Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-UpdatePermissionsQueue.ps1

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,24 @@ function Push-UpdatePermissionsQueue {
2525
$DomainRefreshRequired = $true
2626
}
2727
Write-Information 'Updating permissions'
28-
Add-CIPPApplicationPermission -RequiredResourceAccess 'CIPPDefaults' -ApplicationId $env:ApplicationID -tenantfilter $Item.customerId
29-
Add-CIPPDelegatedPermission -RequiredResourceAccess 'CIPPDefaults' -ApplicationId $env:ApplicationID -tenantfilter $Item.customerId
30-
Write-LogMessage -tenant $Item.defaultDomainName -tenantId $Item.customerId -message "Updated permissions for $($Item.displayName)" -Sev 'Info' -API 'UpdatePermissionsQueue'
28+
$AppResults = Add-CIPPApplicationPermission -RequiredResourceAccess 'CIPPDefaults' -ApplicationId $env:ApplicationID -tenantfilter $Item.customerId
29+
$DelegatedResults = Add-CIPPDelegatedPermission -RequiredResourceAccess 'CIPPDefaults' -ApplicationId $env:ApplicationID -tenantfilter $Item.customerId
30+
31+
# Check for permission failures (excluding service principal creation failures)
32+
$AllResults = @($AppResults) + @($DelegatedResults)
33+
$PermissionFailures = $AllResults | Where-Object {
34+
$_ -like '*Failed*' -and
35+
$_ -notlike '*Failed to create service principal*'
36+
}
37+
38+
if ($PermissionFailures) {
39+
$Status = 'Failed'
40+
$FailureMessage = ($PermissionFailures -join '; ')
41+
Write-LogMessage -tenant $Item.defaultDomainName -tenantId $Item.customerId -message "Permission update completed with failures for $($Item.displayName): $FailureMessage" -Sev 'Warn' -API 'UpdatePermissionsQueue'
42+
} else {
43+
$Status = 'Success'
44+
Write-LogMessage -tenant $Item.defaultDomainName -tenantId $Item.customerId -message "Updated permissions for $($Item.displayName)" -Sev 'Info' -API 'UpdatePermissionsQueue'
45+
}
3146

3247
if ($Item.defaultDomainName -ne 'PartnerTenant') {
3348
Write-Information 'Pushing CIPP-SAM admin roles'
@@ -38,11 +53,15 @@ function Push-UpdatePermissionsQueue {
3853
$unixtime = [int64](([datetime]::UtcNow) - (Get-Date '1/1/1970')).TotalSeconds
3954
$GraphRequest = @{
4055
LastApply = "$unixtime"
56+
LastStatus = "$Status"
4157
applicationId = "$($env:ApplicationID)"
4258
Tenant = "$($Item.customerId)"
4359
PartitionKey = 'Tenant'
4460
RowKey = "$($Item.customerId)"
4561
}
62+
if ($PermissionFailures) {
63+
$GraphRequest.LastError = $FailureMessage
64+
}
4665
Add-CIPPAzDataTableEntity @Table -Entity $GraphRequest -Force
4766

4867
if ($DomainRefreshRequired) {
@@ -53,5 +72,6 @@ function Push-UpdatePermissionsQueue {
5372
}
5473
} catch {
5574
Write-Information "Error updating permissions for $($Item.displayName)"
75+
Write-LogMessage -tenant $Item.defaultDomainName -tenantId $Item.customerId -message "Error updating permissions for $($Item.displayName) - $($_.Exception.Message)" -Sev 'Error' -API 'UpdatePermissionsQueue'
5676
}
5777
}

Modules/CIPPCore/Public/Entrypoints/Orchestrator Functions/Start-UpdatePermissionsOrchestrator.ps1

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,13 @@ function Start-UpdatePermissionsOrchestrator {
4343

4444
$Tenants = $Tenants | ForEach-Object {
4545
$CPVRow = $CPVRows | Where-Object -Property Tenant -EQ $_.customerId
46-
if (!$CPVRow -or $env:ApplicationID -notin $CPVRow.applicationId -or $SAMPermissions.Timestamp -gt $CPVRow.Timestamp.DateTime -or $CPVRow.Timestamp.DateTime -le (Get-Date).AddDays(-7).ToUniversalTime() -or !$_.defaultDomainName -or ($SAMroles.Timestamp.DateTime -gt $CPVRow.Timestamp.DateTime -and ($SAMRoles.Tenants -contains $_.defaultDomainName -or $SAMRoles.Tenants.value -contains $_.defaultDomainName -or $SAMRoles.Tenants -contains 'AllTenants' -or $SAMRoles.Tenants.value -contains 'AllTenants'))) {
46+
47+
# Determine retry interval based on last status
48+
# No status or Failed status: retry after 1 day, Success: retry after 7 days
49+
$RetryDays = if (!$CPVRow.LastStatus -or $CPVRow.LastStatus -eq 'Failed') { -1 } else { -7 }
50+
$NeedsRetry = $CPVRow.Timestamp.DateTime -le (Get-Date).AddDays($RetryDays).ToUniversalTime()
51+
52+
if (!$CPVRow -or $env:ApplicationID -notin $CPVRow.applicationId -or $SAMPermissions.Timestamp -gt $CPVRow.Timestamp.DateTime -or $NeedsRetry -or !$_.defaultDomainName -or ($SAMroles.Timestamp.DateTime -gt $CPVRow.Timestamp.DateTime -and ($SAMRoles.Tenants -contains $_.defaultDomainName -or $SAMRoles.Tenants.value -contains $_.defaultDomainName -or $SAMRoles.Tenants -contains 'AllTenants' -or $SAMRoles.Tenants.value -contains 'AllTenants'))) {
4753
$_
4854
}
4955
}

0 commit comments

Comments
 (0)