From 93d3b6e70a5fd754a300c4c403a057335c63c60d Mon Sep 17 00:00:00 2001 From: John Duprey Date: Sat, 30 Mar 2024 12:00:21 -0400 Subject: [PATCH 01/20] Fix email address check --- .../Public/Entrypoints/Invoke-ExecMailTest.ps1 | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 b/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 index 7bc6c3f17f90..f74c44179b3b 100644 --- a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 +++ b/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 @@ -18,7 +18,7 @@ Function Invoke-ExecMailTest { 'CheckConfig' { $GraphToken = Get-GraphToken -returnRefresh $true -SkipCache $true $AccessTokenDetails = Read-JwtAccessDetails -Token $GraphToken.access_token - $Me = New-GraphGetRequest -uri 'https://graph.microsoft.com/beta/me?$select=displayName,proxyAddresses' -NoAuthCheck $true + $Me = New-GraphGetRequest -uri 'https://graph.microsoft.com/beta/me?$select=displayName,userPrincipalName,proxyAddresses' -NoAuthCheck $true if ($AccessTokenDetails.Scope -contains 'Mail.Read') { $Message = 'Mail.Read - Delegated was found in the token scope.' $HasMailRead = $true @@ -27,11 +27,17 @@ Function Invoke-ExecMailTest { $HasMailRead = $false } + if ($Me.proxyAddresses) { + $Emails = $Me.proxyAddresses | Select-Object @{n = 'Address'; exp = { ($_ -split ':')[1] } }, @{n = 'IsPrimary'; exp = { $_ -cmatch 'SMTP' } } + } else { + $Emails = @(@{ Address = $Me.userPrincipalName; IsPrimary = $true }) + } + $Body = [PSCustomObject]@{ Message = $Message HasMailRead = $HasMailRead MailUser = $Me.displayName - MailAddresses = $Me.proxyAddresses | Select-Object @{n = 'Address'; exp = { ($_ -split ':')[1] } }, @{n = 'IsPrimary'; exp = { $_ -cmatch 'SMTP' } } + MailAddresses = $Emails } } default { @@ -54,7 +60,7 @@ Function Invoke-ExecMailTest { Sender = $Message.sender.emailAddress.name From = $Message.sender.emailAddress.address Link = $Message.webLink - Headers = $Message.internetMessageHeaders + Headers = $Message.internetMessageHeaders AuthResult = $AuthResult } } From cd2559488be64f64f3b836c59bd322962c85c58a Mon Sep 17 00:00:00 2001 From: John Duprey Date: Sat, 30 Mar 2024 12:13:21 -0400 Subject: [PATCH 02/20] Update Invoke-ExecMailTest.ps1 --- Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 b/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 index f74c44179b3b..4dfaf5e732e7 100644 --- a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 +++ b/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 @@ -37,7 +37,7 @@ Function Invoke-ExecMailTest { Message = $Message HasMailRead = $HasMailRead MailUser = $Me.displayName - MailAddresses = $Emails + MailAddresses = @($Emails) } } default { From 4135bd384152ee721abd936eaa819928bf565bad Mon Sep 17 00:00:00 2001 From: John Duprey Date: Sun, 31 Mar 2024 19:22:40 -0400 Subject: [PATCH 03/20] handle empty mailbox --- .../Entrypoints/Invoke-ExecMailTest.ps1 | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 b/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 index 4dfaf5e732e7..483594d83889 100644 --- a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 +++ b/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 @@ -43,25 +43,27 @@ Function Invoke-ExecMailTest { default { $Messages = New-GraphGetRequest -uri "https://graph.microsoft.com/beta/me/mailFolders/Inbox/messages?`$select=receivedDateTime,subject,sender,internetMessageHeaders,webLink" -NoAuthCheck $true $Results = foreach ($Message in $Messages) { - $AuthResult = ($Message.internetMessageHeaders | Where-Object -Property name -EQ 'Authentication-Results').value - $AuthResult = $AuthResult -split ';\s*' - $AuthResult = $AuthResult | ForEach-Object { - if ($_ -match '^(?.+?)=\s*(?.+?)\s(?.+)$') { - [PSCustomObject]@{ - Name = $Matches.Name - Status = $Matches.Status - Info = $Matches.Info + if ($Message.receivedDateTime) { + $AuthResult = ($Message.internetMessageHeaders | Where-Object -Property name -EQ 'Authentication-Results').value + $AuthResult = $AuthResult -split ';\s*' + $AuthResult = $AuthResult | ForEach-Object { + if ($_ -match '^(?.+?)=\s*(?.+?)\s(?.+)$') { + [PSCustomObject]@{ + Name = $Matches.Name + Status = $Matches.Status + Info = $Matches.Info + } } } - } - [PSCustomObject]@{ - Received = $Message.receivedDateTime - Subject = $Message.subject - Sender = $Message.sender.emailAddress.name - From = $Message.sender.emailAddress.address - Link = $Message.webLink - Headers = $Message.internetMessageHeaders - AuthResult = $AuthResult + [PSCustomObject]@{ + Received = $Message.receivedDateTime + Subject = $Message.subject + Sender = $Message.sender.emailAddress.name + From = $Message.sender.emailAddress.address + Link = $Message.webLink + Headers = $Message.internetMessageHeaders + AuthResult = $AuthResult + } } } $Body = [PSCustomObject]@{ From a17af344fa1f9ec44e1c5cb6855602f3f7a9dcaf Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 1 Apr 2024 17:46:19 -0400 Subject: [PATCH 04/20] Tidy tenant list, optimize query --- Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 | 5 ++--- Modules/CippExtensions/Private/Get-HaloMapping.ps1 | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 b/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 index fcf350f72774..6a7eeded0bd5 100644 --- a/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 +++ b/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 @@ -38,7 +38,7 @@ function Get-Tenants { if (!$LastRefresh -or $LastRefresh -lt (Get-Date).Addhours(-24).ToUniversalTime()) { # Query for active relationships - $GDAPRelationships = New-GraphGetRequest -uri "https://graph.microsoft.com/beta/tenantRelationships/delegatedAdminRelationships?`$filter=status eq 'active'&`$select=customer,autoExtendDuration,endDateTime" + $GDAPRelationships = New-GraphGetRequest -uri "https://graph.microsoft.com/beta/tenantRelationships/delegatedAdminRelationships?`$filter=status eq 'active' and not startsWith(displayName,'MLT_')&`$select=customer,autoExtendDuration,endDateTime" # Flatten gdap relationship $GDAPList = foreach ($Relationship in $GDAPRelationships) { @@ -115,6 +115,5 @@ function Get-Tenants { Add-CIPPAzDataTableEntity @TenantsTable -Entity $IncludedTenantsCache } } - return ($IncludedTenantsCache | Where-Object -Property defaultDomainName -NE $null | Sort-Object -Property displayName) - + return ($IncludedTenantsCache | Where-Object { $null -ne $_.defaultDomainName -and ($_.defaultDomainName -notmatch 'Domain Error' -or $IncludeAll.IsPresent) } | Sort-Object -Property displayName) } diff --git a/Modules/CippExtensions/Private/Get-HaloMapping.ps1 b/Modules/CippExtensions/Private/Get-HaloMapping.ps1 index ad4fc1e88111..8391252ae065 100644 --- a/Modules/CippExtensions/Private/Get-HaloMapping.ps1 +++ b/Modules/CippExtensions/Private/Get-HaloMapping.ps1 @@ -10,7 +10,7 @@ function Get-HaloMapping { Get-CIPPAzDataTableEntity @CIPPMapping -Filter $Filter | ForEach-Object { $Mappings | Add-Member -NotePropertyName $_.RowKey -NotePropertyValue @{ label = "$($_.HaloPSAName)"; value = "$($_.HaloPSA)" } } - $Tenants = Get-Tenants -IncludeAll + $Tenants = Get-Tenants -IncludeErrors $Table = Get-CIPPTable -TableName Extensionsconfig try { $Configuration = ((Get-CIPPAzDataTableEntity @Table).config | ConvertFrom-Json -ea stop).HaloPSA @@ -30,9 +30,9 @@ function Get-HaloMapping { } else { $_.Exception.message } - + Write-LogMessage -Message "Could not get HaloPSA Clients, error: $Message " -Level Error -tenant 'CIPP' -API 'HaloMapping' - $RawHaloClients = @(@{name = "Could not get HaloPSA Clients, error: $Message" }) + $RawHaloClients = @(@{name = "Could not get HaloPSA Clients, error: $Message" }) } $HaloClients = $RawHaloClients | ForEach-Object { [PSCustomObject]@{ From 61bcc5ab72f3eb3f60cb4dc4203505c2f4ab0796 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 1 Apr 2024 18:09:34 -0400 Subject: [PATCH 05/20] Move CippQueue to CippCore --- ListCippQueue/function.json | 18 --- .../Public/CippQueue/Invoke-ListCippQueue.ps1 | 23 ++++ .../Public/CippQueue/New-CippQueueEntry.ps1 | 23 ++++ .../Public/CippQueue/Remove-CippQueue.ps1 | 18 +++ .../CippQueue/Update-CippQueueEntry.ps1 | 29 +++++ .../Entrypoints/Invoke-ListGraphRequest.ps1 | 3 + Modules/CippQueue/CippQueue.psm1 | 104 ------------------ Tools/Initialize-DevEnvironment.ps1 | 1 - 8 files changed, 96 insertions(+), 123 deletions(-) delete mode 100644 ListCippQueue/function.json create mode 100644 Modules/CIPPCore/Public/CippQueue/Invoke-ListCippQueue.ps1 create mode 100644 Modules/CIPPCore/Public/CippQueue/New-CippQueueEntry.ps1 create mode 100644 Modules/CIPPCore/Public/CippQueue/Remove-CippQueue.ps1 create mode 100644 Modules/CIPPCore/Public/CippQueue/Update-CippQueueEntry.ps1 delete mode 100644 Modules/CippQueue/CippQueue.psm1 diff --git a/ListCippQueue/function.json b/ListCippQueue/function.json deleted file mode 100644 index 9a02219bfcbd..000000000000 --- a/ListCippQueue/function.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "scriptFile": "../Modules/CippQueue/CippQueue.psm1", - "entryPoint": "Get-CippQueue", - "bindings": [ - { - "authLevel": "anonymous", - "type": "httpTrigger", - "direction": "in", - "name": "Request", - "methods": ["get", "post"] - }, - { - "type": "http", - "direction": "out", - "name": "Response" - } - ] -} diff --git a/Modules/CIPPCore/Public/CippQueue/Invoke-ListCippQueue.ps1 b/Modules/CIPPCore/Public/CippQueue/Invoke-ListCippQueue.ps1 new file mode 100644 index 000000000000..e5f7a93a5e2a --- /dev/null +++ b/Modules/CIPPCore/Public/CippQueue/Invoke-ListCippQueue.ps1 @@ -0,0 +1,23 @@ +function Invoke-ListCippQueue { + # Input bindings are passed in via param block. + param($Request = $null, $TriggerMetadata) + + if ($Request) { + $APIName = $TriggerMetadata.FunctionName + Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message 'Accessed this API' -Sev 'Debug' + + # Write to the Azure Functions log stream. + Write-Host 'PowerShell HTTP trigger function processed a request.' + } + + $CippQueue = Get-CippTable -TableName 'CippQueue' + $CippQueueData = Get-CIPPAzDataTableEntity @CippQueue | Where-Object { ($_.Timestamp.DateTime) -ge (Get-Date).ToUniversalTime().AddHours(-1) } | Sort-Object -Property Timestamp -Descending + if ($request) { + Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ + StatusCode = [HttpStatusCode]::OK + Body = @($CippQueueData) + }) + } else { + return $CippQueueData + } +} \ No newline at end of file diff --git a/Modules/CIPPCore/Public/CippQueue/New-CippQueueEntry.ps1 b/Modules/CIPPCore/Public/CippQueue/New-CippQueueEntry.ps1 new file mode 100644 index 000000000000..a64351dcfdb2 --- /dev/null +++ b/Modules/CIPPCore/Public/CippQueue/New-CippQueueEntry.ps1 @@ -0,0 +1,23 @@ +function New-CippQueueEntry { + Param( + $Name, + $Link, + $Reference + ) + + $CippQueue = Get-CippTable -TableName CippQueue + + $QueueEntry = @{ + PartitionKey = 'CippQueue' + RowKey = (New-Guid).Guid.ToString() + Name = $Name + Link = $Link + Reference = $Reference + Status = 'Queued' + } + $CippQueue.Entity = $QueueEntry + + Add-CIPPAzDataTableEntity @CippQueue + + $QueueEntry +} \ No newline at end of file diff --git a/Modules/CIPPCore/Public/CippQueue/Remove-CippQueue.ps1 b/Modules/CIPPCore/Public/CippQueue/Remove-CippQueue.ps1 new file mode 100644 index 000000000000..cce34ebaa82f --- /dev/null +++ b/Modules/CIPPCore/Public/CippQueue/Remove-CippQueue.ps1 @@ -0,0 +1,18 @@ +function Remove-CippQueue { + # Input bindings are passed in via param block. + param($Request, $TriggerMetadata) + + $APIName = $TriggerMetadata.FunctionName + Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message 'Accessed this API' -Sev 'Debug' + + # Write to the Azure Functions log stream. + Write-Host 'PowerShell HTTP trigger function processed a request.' + + $CippQueue = Get-CippTable -TableName 'CippQueue' + Clear-AzDataTable @CippQueue + + Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ + StatusCode = [HttpStatusCode]::OK + Body = @{Results = @('History cleared') } + }) +} \ No newline at end of file diff --git a/Modules/CIPPCore/Public/CippQueue/Update-CippQueueEntry.ps1 b/Modules/CIPPCore/Public/CippQueue/Update-CippQueueEntry.ps1 new file mode 100644 index 000000000000..2662d71bf750 --- /dev/null +++ b/Modules/CIPPCore/Public/CippQueue/Update-CippQueueEntry.ps1 @@ -0,0 +1,29 @@ +function Update-CippQueueEntry { + Param( + [Parameter(Mandatory = $true)] + $RowKey, + $Status, + $Name + ) + + $CippQueue = Get-CippTable -TableName CippQueue + + if ($RowKey) { + $QueueEntry = Get-CIPPAzDataTableEntity @CippQueue -Filter ("RowKey eq '{0}'" -f $RowKey) + + if ($QueueEntry) { + if ($Status) { + $QueueEntry.Status = $Status + } + if ($Name) { + $QueueEntry.Name = $Name + } + Update-AzDataTableEntity @CippQueue -Entity $QueueEntry + $QueueEntry + } else { + return $false + } + } else { + return $false + } +} \ No newline at end of file diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListGraphRequest.ps1 b/Modules/CIPPCore/Public/Entrypoints/Invoke-ListGraphRequest.ps1 index 3b14227b1907..2cd1d9cd9bac 100644 --- a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListGraphRequest.ps1 +++ b/Modules/CIPPCore/Public/Entrypoints/Invoke-ListGraphRequest.ps1 @@ -3,6 +3,9 @@ function Invoke-ListGraphRequest { <# .FUNCTIONALITY Entrypoint + + .ROLE + Core.Read #> [CmdletBinding()] param($Request, $TriggerMetadata) diff --git a/Modules/CippQueue/CippQueue.psm1 b/Modules/CippQueue/CippQueue.psm1 deleted file mode 100644 index e9b86a3bc74e..000000000000 --- a/Modules/CippQueue/CippQueue.psm1 +++ /dev/null @@ -1,104 +0,0 @@ -using namespace System.Net - -function New-CippQueueEntry { - Param( - $Name, - $Link, - $Reference - ) - - $CippQueue = Get-CippTable -TableName CippQueue - - $QueueEntry = @{ - PartitionKey = 'CippQueue' - RowKey = (New-Guid).Guid.ToString() - Name = $Name - Link = $Link - Reference = $Reference - Status = 'Queued' - } - $CippQueue.Entity = $QueueEntry - - Add-CIPPAzDataTableEntity @CippQueue - - $QueueEntry -} - -function Update-CippQueueEntry { - Param( - [Parameter(Mandatory = $true)] - $RowKey, - $Status, - $Name - ) - - $CippQueue = Get-CippTable -TableName CippQueue - - if ($RowKey) { - $QueueEntry = Get-CIPPAzDataTableEntity @CippQueue -Filter ("RowKey eq '{0}'" -f $RowKey) - - if ($QueueEntry) { - if ($Status) { - $QueueEntry.Status = $Status - } - if ($Name) { - $QueueEntry.Name = $Name - } - Update-AzDataTableEntity @CippQueue -Entity $QueueEntry - $QueueEntry - } - else { - return $false - } - } - else { - return $false - } -} - -function Get-CippQueue { - # Input bindings are passed in via param block. - param($Request = $null, $TriggerMetadata) - - if ($Request) { - $APIName = $TriggerMetadata.FunctionName - Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message 'Accessed this API' -Sev 'Debug' - - # Write to the Azure Functions log stream. - Write-Host 'PowerShell HTTP trigger function processed a request.' - } - - $CippQueue = Get-CippTable -TableName 'CippQueue' - $CippQueueData = Get-CIPPAzDataTableEntity @CippQueue | Where-Object { ($_.Timestamp.DateTime) -ge (Get-Date).ToUniversalTime().AddHours(-1) } | Sort-Object -Property Timestamp -Descending - if ($request) { - Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ - StatusCode = [HttpStatusCode]::OK - Body = @($CippQueueData) - }) - } - else { - return $CippQueueData - } -} - -function Remove-CippQueue { - # Input bindings are passed in via param block. - param($Request, $TriggerMetadata) - - $APIName = $TriggerMetadata.FunctionName - Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message 'Accessed this API' -Sev 'Debug' - - # Write to the Azure Functions log stream. - Write-Host 'PowerShell HTTP trigger function processed a request.' - - $CippQueue = Get-CippTable -TableName 'CippQueue' - Clear-AzDataTable @CippQueue - - Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ - StatusCode = [HttpStatusCode]::OK - Body = @{Results = @('History cleared') } - }) -} - - -Export-ModuleMember -Function @('New-CippQueueEntry', 'Get-CippQueue', 'Update-CippQueueEntry', 'Remove-CippQueue') diff --git a/Tools/Initialize-DevEnvironment.ps1 b/Tools/Initialize-DevEnvironment.ps1 index e8b67a373ae5..d712e396ad04 100644 --- a/Tools/Initialize-DevEnvironment.ps1 +++ b/Tools/Initialize-DevEnvironment.ps1 @@ -11,6 +11,5 @@ ForEach ($Key in $CIPPSettings.PSObject.Properties.Name) { Import-Module "$CippRoot\Modules\AzBobbyTables" Import-Module "$CippRoot\Modules\DNSHealth" -Import-Module "$CippRoot\Modules\CippQueue" Import-Module "$CippRoot\Modules\CippCore" Get-CIPPAuthentication \ No newline at end of file From 2f4d94d1f565013fe673d15e49b9f81cf251e19d Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 1 Apr 2024 19:53:01 -0400 Subject: [PATCH 06/20] Check webhook config before starting orchestrator --- Scheduler_GetWebhooks/run.ps1 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Scheduler_GetWebhooks/run.ps1 b/Scheduler_GetWebhooks/run.ps1 index a36890b001df..b262f320738b 100644 --- a/Scheduler_GetWebhooks/run.ps1 +++ b/Scheduler_GetWebhooks/run.ps1 @@ -1,6 +1,14 @@ param($Timer) try { + + $webhookTable = Get-CIPPTable -tablename webhookTable + $Webhooks = Get-CIPPAzDataTableEntity @webhookTable + if (($Webhooks | Measure-Object).Count -eq 0) { + Write-Host 'No webhook subscriptions found. Exiting.' + return + } + $InputObject = [PSCustomObject]@{ OrchestratorName = 'WebhookOrchestrator' QueueFunction = @{ From f790029bcb2620dfad1b5d4085b493df3defb593 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 1 Apr 2024 20:16:59 -0400 Subject: [PATCH 07/20] Fix import --- Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 b/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 index 6a7eeded0bd5..170af1b6af17 100644 --- a/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 +++ b/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 @@ -53,7 +53,7 @@ function Get-Tenants { # Group relationships, build object for adding to tables $ActiveRelationships = $GDAPList | Where-Object { $_.customerId -notin $SkipListCache.customerId } $TenantList = $ActiveRelationships | Group-Object -Property customerId | ForEach-Object -Parallel { - Import-Module .\Modules\CIPPCore + Import-Module CIPPCore $LatestRelationship = $_.Group | Sort-Object -Property relationshipEnd | Select-Object -Last 1 $AutoExtend = ($_.Group | Where-Object { $_.autoExtend -eq $true } | Measure-Object).Count -gt 0 From 920a52cbce1d81cf4b0f370844a39243c4811d0d Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 1 Apr 2024 20:19:33 -0400 Subject: [PATCH 08/20] Fix cippqueue query --- ListGenericAllTenants/run.ps1 | 6 +++--- .../Public/Entrypoints/Invoke-ListGenericAllTenants.ps1 | 6 +++--- .../CIPPCore/Public/GraphRequests/Get-GraphRequestList.ps1 | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ListGenericAllTenants/run.ps1 b/ListGenericAllTenants/run.ps1 index d51627ab7aea..afda8b0570d2 100644 --- a/ListGenericAllTenants/run.ps1 +++ b/ListGenericAllTenants/run.ps1 @@ -4,13 +4,13 @@ param([string]$QueueItem, $TriggerMetadata) # Write out the queue message and metadata to the information log. Write-Host "PowerShell queue trigger function processed work item: $QueueItem" $TableURLName = ($QueueItem.tolower().split('?').Split('/') | Select-Object -First 1).toString() -$QueueKey = (Get-CippQueue | Where-Object -Property Name -EQ $TableURLName | Select-Object -Last 1).RowKey +$QueueKey = (Invoke-ListCippQueue | Where-Object -Property Name -EQ $TableURLName | Select-Object -Last 1).RowKey Update-CippQueueEntry -RowKey $QueueKey -Status 'Started' $Table = Get-CIPPTable -TableName "cache$TableURLName" $fullUrl = "https://graph.microsoft.com/beta/$QueueItem" Get-CIPPAzDataTableEntity @Table | Remove-AzDataTableEntity @table -$RawGraphRequest = Get-Tenants | ForEach-Object -Parallel { +$RawGraphRequest = Get-Tenants | ForEach-Object -Parallel { $domainName = $_.defaultDomainName Import-Module CippCore try { @@ -22,7 +22,7 @@ $RawGraphRequest = Get-Tenants | ForEach-Object -Parallel { Tenant = $domainName CippStatus = "Could not connect to tenant. $($_.Exception.message)" } - } + } } Update-CippQueueEntry -RowKey $QueueKey -Status 'Processing' diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListGenericAllTenants.ps1 b/Modules/CIPPCore/Public/Entrypoints/Invoke-ListGenericAllTenants.ps1 index 00ddc0156cbb..ddb0c55b1444 100644 --- a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListGenericAllTenants.ps1 +++ b/Modules/CIPPCore/Public/Entrypoints/Invoke-ListGenericAllTenants.ps1 @@ -9,13 +9,13 @@ Function Invoke-ListGenericAllTenants { param($Request, $TriggerMetadata) $TableURLName = ($QueueItem.tolower().split('?').Split('/') | Select-Object -First 1).toString() - $QueueKey = (Get-CippQueue | Where-Object -Property Name -EQ $TableURLName | Select-Object -Last 1).RowKey + $QueueKey = (Invoke-ListCippQueue | Where-Object -Property Name -EQ $TableURLName | Select-Object -Last 1).RowKey Update-CippQueueEntry -RowKey $QueueKey -Status 'Started' $Table = Get-CIPPTable -TableName "cache$TableURLName" $fullUrl = "https://graph.microsoft.com/beta/$QueueItem" Get-CIPPAzDataTableEntity @Table | Remove-AzDataTableEntity @table - $RawGraphRequest = Get-Tenants | ForEach-Object -Parallel { + $RawGraphRequest = Get-Tenants | ForEach-Object -Parallel { $domainName = $_.defaultDomainName Import-Module '.\Modules\AzBobbyTables' Import-Module '.\Modules\CIPPCore' @@ -27,7 +27,7 @@ Function Invoke-ListGenericAllTenants { Tenant = $domainName CippStatus = "Could not connect to tenant. $($_.Exception.message)" } - } + } } Update-CippQueueEntry -RowKey $QueueKey -Status 'Processing' diff --git a/Modules/CIPPCore/Public/GraphRequests/Get-GraphRequestList.ps1 b/Modules/CIPPCore/Public/GraphRequests/Get-GraphRequestList.ps1 index 1117f95d196d..fa9490364e83 100644 --- a/Modules/CIPPCore/Public/GraphRequests/Get-GraphRequestList.ps1 +++ b/Modules/CIPPCore/Public/GraphRequests/Get-GraphRequestList.ps1 @@ -111,7 +111,7 @@ function Get-GraphRequestList { Write-Host "Cached: $(($Rows | Measure-Object).Count) rows (Type: $($Type))" $QueueReference = '{0}-{1}' -f $TenantFilter, $PartitionKey - $RunningQueue = Get-CippQueue | Where-Object { $_.Reference -eq $QueueReference -and $_.Status -ne 'Completed' -and $_.Status -ne 'Failed' } + $RunningQueue = Invoke-ListCippQueue | Where-Object { $_.Reference -eq $QueueReference -and $_.Status -ne 'Completed' -and $_.Status -ne 'Failed' } if ($TenantFilter -ne 'AllTenants' -and $Endpoint -match '%tenantid%') { $TenantId = (Get-Tenants -IncludeErrors | Where-Object { $_.defaultDomainName -eq $TenantFilter -or $_.customerId -eq $TenantFilter }).customerId From 30c78c1a31bb6603665802101dadae5a67e18769 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 1 Apr 2024 20:22:45 -0400 Subject: [PATCH 09/20] Fix cpv --- UpdatePermissions/run.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UpdatePermissions/run.ps1 b/UpdatePermissions/run.ps1 index 03d3c0e1cc41..9993ce590f1f 100644 --- a/UpdatePermissions/run.ps1 +++ b/UpdatePermissions/run.ps1 @@ -2,7 +2,7 @@ param($Timer) try { - $Tenants = Get-Tenants -IncludeErrors | Where-Object { $_.customerId -ne $env:TenantId } | ForEach-Object { $_ | Add-Member -NotePropertyName FunctionName -NotePropertyValue 'UpdatePermissionsQueue'; $_ } + $Tenants = Get-Tenants -IncludeAll | Where-Object { $_.customerId -ne $env:TenantId -and $_.Excluded -eq $false } | ForEach-Object { $_ | Add-Member -NotePropertyName FunctionName -NotePropertyValue 'UpdatePermissionsQueue'; $_ } if (($Tenants | Measure-Object).Count -gt 0) { $InputObject = [PSCustomObject]@{ From 3559fe4370f769bf746102a637de1cf3775f1acb Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 1 Apr 2024 22:05:41 -0400 Subject: [PATCH 10/20] Add skip domains option --- .../Public/GraphHelper/Get-Tenants.ps1 | 24 ++++++++++++------- UpdatePermissions/run.ps1 | 2 +- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 b/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 index 170af1b6af17..e8fcef51f21d 100644 --- a/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 +++ b/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 @@ -8,7 +8,8 @@ function Get-Tenants { [switch]$SkipList, [Parameter( ParameterSetName = 'Standard')] [switch]$IncludeAll, - [switch]$IncludeErrors + [switch]$IncludeErrors, + [switch]$SkipDomains ) $TenantsTable = Get-CippTable -tablename 'Tenants' @@ -57,14 +58,19 @@ function Get-Tenants { $LatestRelationship = $_.Group | Sort-Object -Property relationshipEnd | Select-Object -Last 1 $AutoExtend = ($_.Group | Where-Object { $_.autoExtend -eq $true } | Measure-Object).Count -gt 0 - # Query domains to get default/initial - try { - $Domains = New-GraphGetRequest -uri 'https://graph.microsoft.com/beta/domains' -tenantid $LatestRelationship.customerId -NoAuthCheck:$true -ErrorAction Stop - $defaultDomainName = ($Domains | Where-Object { $_.isDefault -eq $true }).id - $initialDomainName = ($Domains | Where-Object { $_.isInitial -eq $true }).id - } catch { - $defaultDomainName = 'Domain Error, check permissions' - $initialDomainName = 'Domain Error, check permissions' + if (-not $SkipDomains.IsPresent) { + # Query domains to get default/initial + try { + $Domains = New-GraphGetRequest -uri 'https://graph.microsoft.com/beta/domains' -tenantid $LatestRelationship.customerId -NoAuthCheck:$true -ErrorAction Stop + $defaultDomainName = ($Domains | Where-Object { $_.isDefault -eq $true }).id + $initialDomainName = ($Domains | Where-Object { $_.isInitial -eq $true }).id + } catch { + $defaultDomainName = 'Domain Error, check permissions' + $initialDomainName = 'Domain Error, check permissions' + } + } else { + $defaultDomainName = 'Domain Error, skipped' + $initialDomainName = 'Domain Error, skipped' } [PSCustomObject]@{ PartitionKey = 'Tenants' diff --git a/UpdatePermissions/run.ps1 b/UpdatePermissions/run.ps1 index 9993ce590f1f..1c6b98f6ee92 100644 --- a/UpdatePermissions/run.ps1 +++ b/UpdatePermissions/run.ps1 @@ -2,7 +2,7 @@ param($Timer) try { - $Tenants = Get-Tenants -IncludeAll | Where-Object { $_.customerId -ne $env:TenantId -and $_.Excluded -eq $false } | ForEach-Object { $_ | Add-Member -NotePropertyName FunctionName -NotePropertyValue 'UpdatePermissionsQueue'; $_ } + $Tenants = Get-Tenants -IncludeAll -SkipDomains | Where-Object { $_.customerId -ne $env:TenantId -and $_.Excluded -eq $false } | ForEach-Object { $_ | Add-Member -NotePropertyName FunctionName -NotePropertyValue 'UpdatePermissionsQueue'; $_ } if (($Tenants | Measure-Object).Count -gt 0) { $InputObject = [PSCustomObject]@{ From a7296ba427e405e0caf0c0e70771c14eea817ad2 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Tue, 2 Apr 2024 15:32:23 +0200 Subject: [PATCH 11/20] tempfix until functionized. --- .../Invoke-CIPPStandardIntuneTemplate.ps1 | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Modules/CIPPCore/Public/Standards/Invoke-CIPPStandardIntuneTemplate.ps1 b/Modules/CIPPCore/Public/Standards/Invoke-CIPPStandardIntuneTemplate.ps1 index 8ab1793fec2f..9b17f9dd3b6b 100644 --- a/Modules/CIPPCore/Public/Standards/Invoke-CIPPStandardIntuneTemplate.ps1 +++ b/Modules/CIPPCore/Public/Standards/Invoke-CIPPStandardIntuneTemplate.ps1 @@ -20,6 +20,31 @@ function Invoke-CIPPStandardIntuneTemplate { $RawJSON = $Request.body.RawJSON switch ($Request.body.Type) { + 'AppProtection' { + $TemplateType = ($RawJSON | ConvertFrom-Json).'@odata.type' -replace '#microsoft.graph.', '' + $TemplateTypeURL = "$($TemplateType)s" + $CheckExististing = New-GraphGETRequest -uri "https://graph.microsoft.com/beta/deviceAppManagement/$TemplateTypeURL" -tenantid $tenant + if ($displayname -in $CheckExististing.displayName) { + $ExistingID = $CheckExististing | Where-Object -Property displayName -EQ $PolicyName + $CreateRequest = New-GraphPOSTRequest -uri "https://graph.microsoft.com/beta/deviceAppManagement/$TemplateTypeURL/$($ExistingID.Id)" -tenantid $tenant -type PATCH -body $RawJSON + } else { + $CreateRequest = New-GraphPOSTRequest -uri "https://graph.microsoft.com/beta/deviceAppManagement/$TemplateTypeURL" -tenantid $tenant -type POST -body $RawJSON + } + } + 'deviceCompliancePolicies' { + $TemplateTypeURL = 'deviceCompliancePolicies' + $CheckExististing = New-GraphGETRequest -uri "https://graph.microsoft.com/beta/deviceManagement/$TemplateTypeURL" -tenantid $tenant + + $JSON = $RawJSON | ConvertFrom-Json | Select-Object * -ExcludeProperty id, createdDateTime, lastModifiedDateTime, version, 'scheduledActionsForRule@odata.context', '@odata.context' + $JSON.scheduledActionsForRule = @($JSON.scheduledActionsForRule | Select-Object * -ExcludeProperty 'scheduledActionConfigurations@odata.context') + $RawJSON = ConvertTo-Json -InputObject $JSON -Depth 20 -Compress + Write-Host $RawJSON + if ($displayname -in $CheckExististing.displayName) { + $ExistingID = $CheckExististing | Where-Object -Property displayName -EQ $PolicyName + $CreateRequest = New-GraphPOSTRequest -uri "https://graph.microsoft.com/beta/deviceManagement/$TemplateTypeURL/$($ExistingID.Id)" -tenantid $tenant -type PATCH -body $RawJSON + } + $CreateRequest = New-GraphPOSTRequest -uri "https://graph.microsoft.com/beta/deviceManagement/$TemplateTypeURL" -tenantid $tenant -type POST -body $RawJson + } 'Admin' { $TemplateTypeURL = 'groupPolicyConfigurations' $CreateBody = '{"description":"' + $description + '","displayName":"' + $displayname + '","roleScopeTagIds":["0"]}' From 520b0dbf5ad9d0885e7eba7bc500a8ab501b98df Mon Sep 17 00:00:00 2001 From: John Duprey Date: Tue, 2 Apr 2024 09:33:55 -0400 Subject: [PATCH 12/20] Tenant refresh durable --- .../Public/Entrypoints/Invoke-ListTenants.ps1 | 14 ++++++++++---- .../Public/Entrypoints/Push-UpdateTenants.ps1 | 18 ++++++++++++++++++ .../Public/GraphHelper/Get-Tenants.ps1 | 16 +++++++++++++++- 3 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 Modules/CIPPCore/Public/Entrypoints/Push-UpdateTenants.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListTenants.ps1 b/Modules/CIPPCore/Public/Entrypoints/Invoke-ListTenants.ps1 index 93425c195e45..0da865b0df42 100644 --- a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListTenants.ps1 +++ b/Modules/CIPPCore/Public/Entrypoints/Invoke-ListTenants.ps1 @@ -21,16 +21,22 @@ Function Invoke-ListTenants { StatusCode = [HttpStatusCode]::OK Body = $GraphRequest }) + $InputObject = [PSCustomObject]@{ + OrchestratorName = 'UpdateTenantsOrchestrator' + Batch = @(@{'FunctionName' = 'UpdateTenants' }) + } + #Write-Host ($InputObject | ConvertTo-Json) + $InstanceId = Start-NewOrchestration -FunctionName 'CIPPOrchestrator' -InputObject ($InputObject | ConvertTo-Json -Depth 5) exit } try { $tenantfilter = $Request.Query.TenantFilter - $Tenants = Get-Tenants -IncludeErrors + $Tenants = Get-Tenants -IncludeErrors -SkipDomains -TriggerRefreshIfNeeded if ($null -eq $TenantFilter -or $TenantFilter -eq 'null') { $TenantList = [system.collections.generic.list[object]]::new() - if ($Request.Query.AllTenantSelector -eq $true) { + if ($Request.Query.AllTenantSelector -eq $true) { $TenantList.Add(@{ customerId = 'AllTenants' defaultDomainName = 'AllTenants' @@ -55,7 +61,7 @@ Function Invoke-ListTenants { Write-LogMessage -user $request.headers.'x-ms-client-principal' -tenant $Tenantfilter -API $APINAME -message 'Listed Tenant Details' -Sev 'Debug' } catch { Write-LogMessage -user $request.headers.'x-ms-client-principal' -tenant $Tenantfilter -API $APINAME -message "List Tenant failed. The error is: $($_.Exception.Message)" -Sev 'Error' - $body = [pscustomobject]@{ + $body = [pscustomobject]@{ 'Results' = "Failed to retrieve tenants: $($_.Exception.Message)" defaultDomainName = '' displayName = 'Failed to retrieve tenants. Perform a permission check.' @@ -68,6 +74,6 @@ Function Invoke-ListTenants { StatusCode = [HttpStatusCode]::OK Body = @($Body) }) - + } diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-UpdateTenants.ps1 b/Modules/CIPPCore/Public/Entrypoints/Push-UpdateTenants.ps1 new file mode 100644 index 000000000000..259dc3e326d7 --- /dev/null +++ b/Modules/CIPPCore/Public/Entrypoints/Push-UpdateTenants.ps1 @@ -0,0 +1,18 @@ +function Push-UpdateTenants { + Param($Item) + $QueueReference = 'UpdateTenants' + $RunningQueue = Invoke-ListCippQueue | Where-Object { $_.Reference -eq $QueueReference -and $_.Status -ne 'Completed' -and $_.Status -ne 'Failed' } + if ($RunningQueue) { + Write-Host 'Update Tenants already running' + return + } + $Queue = New-CippQueueEntry -Name 'Update Tenants' -Reference $QueueReference + try { + Update-CippQueueEntry -RowKey $Queue.RowKey -Status 'Running' + Get-Tenants | Out-Null + Update-CippQueueEntry -RowKey $Queue.RowKey -Status 'Completed' + } catch { + Write-Host "Queue Error: $($_.Exception.Message)" + Update-CippQueueEntry -RowKey $Queue.RowKey -Status 'Failed' + } +} \ No newline at end of file diff --git a/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 b/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 index e8fcef51f21d..64395f3c3260 100644 --- a/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 +++ b/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 @@ -9,7 +9,8 @@ function Get-Tenants { [Parameter( ParameterSetName = 'Standard')] [switch]$IncludeAll, [switch]$IncludeErrors, - [switch]$SkipDomains + [switch]$SkipDomains, + [switch]$TriggerRefreshIfNeeded ) $TenantsTable = Get-CippTable -tablename 'Tenants' @@ -120,6 +121,19 @@ function Get-Tenants { $TenantsTable.Force = $true Add-CIPPAzDataTableEntity @TenantsTable -Entity $IncludedTenantsCache } + + if ($TriggerRefreshIfNeeded.IsPresent -and -not $SkipDomains.IsPresent) { + Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ + StatusCode = [HttpStatusCode]::OK + Body = $GraphRequest + }) + $InputObject = [PSCustomObject]@{ + OrchestratorName = 'UpdateTenantsOrchestrator' + Batch = @(@{'FunctionName' = 'UpdateTenants' }) + } + #Write-Host ($InputObject | ConvertTo-Json) + $InstanceId = Start-NewOrchestration -FunctionName 'CIPPOrchestrator' -InputObject ($InputObject | ConvertTo-Json -Depth 5) + } } return ($IncludedTenantsCache | Where-Object { $null -ne $_.defaultDomainName -and ($_.defaultDomainName -notmatch 'Domain Error' -or $IncludeAll.IsPresent) } | Sort-Object -Property displayName) } From 262d474b2f5b9eef612ef9b832322b710db38537 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Tue, 2 Apr 2024 11:55:59 -0400 Subject: [PATCH 13/20] Move removecippqueue function --- .../{Remove-CippQueue.ps1 => Invoke-RemoveCippQueue.ps1} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename Modules/CIPPCore/Public/CippQueue/{Remove-CippQueue.ps1 => Invoke-RemoveCippQueue.ps1} (95%) diff --git a/Modules/CIPPCore/Public/CippQueue/Remove-CippQueue.ps1 b/Modules/CIPPCore/Public/CippQueue/Invoke-RemoveCippQueue.ps1 similarity index 95% rename from Modules/CIPPCore/Public/CippQueue/Remove-CippQueue.ps1 rename to Modules/CIPPCore/Public/CippQueue/Invoke-RemoveCippQueue.ps1 index cce34ebaa82f..92212db7f6f8 100644 --- a/Modules/CIPPCore/Public/CippQueue/Remove-CippQueue.ps1 +++ b/Modules/CIPPCore/Public/CippQueue/Invoke-RemoveCippQueue.ps1 @@ -1,4 +1,4 @@ -function Remove-CippQueue { +function Invoke-RemoveCippQueue { # Input bindings are passed in via param block. param($Request, $TriggerMetadata) From 46e41ac1db804d7e240d8d1e599882cf8edd3996 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Tue, 2 Apr 2024 14:58:44 -0400 Subject: [PATCH 14/20] CPV logging --- Modules/CIPPCore/Public/Add-CIPPApplicationPermission.ps1 | 2 +- Modules/CIPPCore/Public/Set-CIPPCPVConsent.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/CIPPCore/Public/Add-CIPPApplicationPermission.ps1 b/Modules/CIPPCore/Public/Add-CIPPApplicationPermission.ps1 index 52e790757b9b..f0f4c6badf6d 100644 --- a/Modules/CIPPCore/Public/Add-CIPPApplicationPermission.ps1 +++ b/Modules/CIPPCore/Public/Add-CIPPApplicationPermission.ps1 @@ -41,7 +41,7 @@ function Add-CIPPApplicationPermission { foreach ($Grant in $Grants) { try { $SettingsRequest = New-GraphPOSTRequest -body ($Grant | ConvertTo-Json) -uri "https://graph.microsoft.com/beta/servicePrincipals/$($ourSVCPrincipal.id)/appRoleAssignedTo" -tenantid $Tenantfilter -type POST - $counter ++ + $counter++ } catch { $Results.add("Failed to grant $($Grant.appRoleId) to $($Grant.resourceId): $($_.Exception.Message)") | Out-Null } diff --git a/Modules/CIPPCore/Public/Set-CIPPCPVConsent.ps1 b/Modules/CIPPCore/Public/Set-CIPPCPVConsent.ps1 index d508471a08a4..fafaf83a482a 100644 --- a/Modules/CIPPCore/Public/Set-CIPPCPVConsent.ps1 +++ b/Modules/CIPPCore/Public/Set-CIPPCPVConsent.ps1 @@ -53,7 +53,7 @@ function Set-CIPPCPVConsent { } Add-CIPPAzDataTableEntity @Table -Entity $GraphRequest -Force $Results.add("Successfully added CPV Application to tenant $($TenantName)") | Out-Null - Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message "Added our Service Principal to $($TenantName): $($_.Exception.message)" -Sev 'Info' -tenant $Tenant.defaultDomainName -tenantId $TenantFilter + Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message "Added our Service Principal to $($TenantName)" -Sev 'Info' -tenant $Tenant.defaultDomainName -tenantId $TenantFilter } catch { $ErrorMessage = Get-NormalizedError -message $_.Exception.Message From 693eb03c5793eaa514908d7b77cbb01efae39e41 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Tue, 2 Apr 2024 15:50:07 -0400 Subject: [PATCH 15/20] fix terminate relationship endpoint --- .../Invoke-ExecDeleteGDAPRelationship.ps1 | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDeleteGDAPRelationship.ps1 b/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDeleteGDAPRelationship.ps1 index b51a86b0098d..bdfe01455cd4 100644 --- a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDeleteGDAPRelationship.ps1 +++ b/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDeleteGDAPRelationship.ps1 @@ -1,31 +1,31 @@ using namespace System.Net Function Invoke-ExecDeleteGDAPRelationship { - <# + <# .FUNCTIONALITY Entrypoint #> - [CmdletBinding()] - param($Request, $TriggerMetadata) + [CmdletBinding()] + param($Request, $TriggerMetadata) - $APIName = $TriggerMetadata.FunctionName - Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message 'Accessed this API' -Sev 'Debug' + $APIName = $TriggerMetadata.FunctionName + Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message 'Accessed this API' -Sev 'Debug' - # Interact with query parameters or the body of the request. - $GDAPID = $request.query.GDAPId - try { - $DELETE = New-GraphPostRequest -NoAuthCheck $True -uri "https://traf-pcsvcadmin-prod.trafficmanager.net/CustomerServiceAdminApi/Web/v1/delegatedAdminRelationships/$($GDAPID)/requests" -type POST -body '{"action":"terminate"}' -tenantid $env:TenantID -scope 'https://api.partnercustomeradministration.microsoft.com/.default' - $Results = [pscustomobject]@{'Results' = "Success. GDAP relationship for $($GDAPID) been revoked" } - Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message "Success. GDAP relationship for $($GDAPID) been revoked" -Sev 'Info' + # Interact with query parameters or the body of the request. + $GDAPID = $request.query.GDAPId + try { + $DELETE = New-GraphPostRequest -NoAuthCheck $True -uri "https://graph.microsoft.com/beta/tenantRelationships/delegatedAdminRelationships/$($GDAPID)/requests" -type POST -body '{"action":"terminate"}' -tenantid $env:TenantID + $Results = [pscustomobject]@{'Results' = "Success. GDAP relationship for $($GDAPID) been revoked" } + Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message "Success. GDAP relationship for $($GDAPID) been revoked" -Sev 'Info' - } catch { - $Results = [pscustomobject]@{'Results' = "Failed. $($_.Exception.Message)" } - } + } catch { + $Results = [pscustomobject]@{'Results' = "Failed. $($_.Exception.Message)" } + } - # Associate values to output bindings by calling 'Push-OutputBinding'. - Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ - StatusCode = [HttpStatusCode]::OK - Body = $Results - }) + # Associate values to output bindings by calling 'Push-OutputBinding'. + Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ + StatusCode = [HttpStatusCode]::OK + Body = $Results + }) } From f5aa7433c8139aff8518f24a507c52ead34266a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Tue, 2 Apr 2024 21:51:58 +0200 Subject: [PATCH 16/20] Formatting and move variable up --- .../Invoke-CIPPStandardAntiPhishPolicy.ps1 | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Modules/CIPPCore/Public/Standards/Invoke-CIPPStandardAntiPhishPolicy.ps1 b/Modules/CIPPCore/Public/Standards/Invoke-CIPPStandardAntiPhishPolicy.ps1 index 1bd6e70bebf0..0373f47819d3 100644 --- a/Modules/CIPPCore/Public/Standards/Invoke-CIPPStandardAntiPhishPolicy.ps1 +++ b/Modules/CIPPCore/Public/Standards/Invoke-CIPPStandardAntiPhishPolicy.ps1 @@ -5,11 +5,11 @@ function Invoke-CIPPStandardAntiPhishPolicy { #> param($Tenant, $Settings) + $PolicyName = 'Default Anti-Phishing Policy' $AntiPhishPolicyState = New-ExoRequest -tenantid $Tenant -cmdlet 'Get-AntiPhishPolicy' | - Where-Object -Property Name -eq $PolicyName | - Select-Object Name, Enabled, PhishThresholdLevel, EnableMailboxIntelligence, EnableMailboxIntelligenceProtection, EnableSpoofIntelligence, EnableFirstContactSafetyTips, EnableSimilarUsersSafetyTips, EnableSimilarDomainsSafetyTips, EnableUnusualCharactersSafetyTips, EnableUnauthenticatedSender, EnableViaTag, MailboxIntelligenceProtectionAction, MailboxIntelligenceQuarantineTag + Where-Object -Property Name -EQ $PolicyName | + Select-Object Name, Enabled, PhishThresholdLevel, EnableMailboxIntelligence, EnableMailboxIntelligenceProtection, EnableSpoofIntelligence, EnableFirstContactSafetyTips, EnableSimilarUsersSafetyTips, EnableSimilarDomainsSafetyTips, EnableUnusualCharactersSafetyTips, EnableUnauthenticatedSender, EnableViaTag, MailboxIntelligenceProtectionAction, MailboxIntelligenceQuarantineTag - $PolicyName = "Default Anti-Phishing Policy" $StateIsCorrect = if ( ($AntiPhishPolicyState.Name -eq $PolicyName) -and ($AntiPhishPolicyState.Enabled -eq $true) -and @@ -32,28 +32,28 @@ function Invoke-CIPPStandardAntiPhishPolicy { Write-LogMessage -API 'Standards' -tenant $Tenant -message 'Anti-phishing Policy already exists.' -sev Info } else { $cmdparams = @{ - Enabled = $true - PhishThresholdLevel = $Settings.PhishThresholdLevel - EnableMailboxIntelligence = $true + Enabled = $true + PhishThresholdLevel = $Settings.PhishThresholdLevel + EnableMailboxIntelligence = $true EnableMailboxIntelligenceProtection = $true - EnableSpoofIntelligence = $true - EnableFirstContactSafetyTips = $Settings.EnableFirstContactSafetyTips - EnableSimilarUsersSafetyTips = $Settings.EnableSimilarUsersSafetyTips - EnableSimilarDomainsSafetyTips = $Settings.EnableSimilarDomainsSafetyTips - EnableUnusualCharactersSafetyTips = $Settings.EnableUnusualCharactersSafetyTips - EnableUnauthenticatedSender = $true - EnableViaTag = $true + EnableSpoofIntelligence = $true + EnableFirstContactSafetyTips = $Settings.EnableFirstContactSafetyTips + EnableSimilarUsersSafetyTips = $Settings.EnableSimilarUsersSafetyTips + EnableSimilarDomainsSafetyTips = $Settings.EnableSimilarDomainsSafetyTips + EnableUnusualCharactersSafetyTips = $Settings.EnableUnusualCharactersSafetyTips + EnableUnauthenticatedSender = $true + EnableViaTag = $true MailboxIntelligenceProtectionAction = $Settings.MailboxIntelligenceProtectionAction - MailboxIntelligenceQuarantineTag = $Settings.MailboxIntelligenceQuarantineTag + MailboxIntelligenceQuarantineTag = $Settings.MailboxIntelligenceQuarantineTag } try { if ($AntiPhishPolicyState.Name -eq $PolicyName) { - $cmdparams.Add("Identity", $PolicyName) + $cmdparams.Add('Identity', $PolicyName) New-ExoRequest -tenantid $Tenant -cmdlet 'Set-AntiPhishPolicy' -cmdparams $cmdparams Write-LogMessage -API 'Standards' -tenant $Tenant -message 'Updated Anti-phishing Policy' -sev Info } else { - $cmdparams.Add("Name", $PolicyName) + $cmdparams.Add('Name', $PolicyName) New-ExoRequest -tenantid $Tenant -cmdlet 'New-AntiPhishPolicy' -cmdparams $cmdparams Write-LogMessage -API 'Standards' -tenant $Tenant -message 'Created Anti-phishing Policy' -sev Info } From c85c6c1185244c242cbb82bd04a51fb0253a88e8 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Tue, 2 Apr 2024 19:22:41 -0400 Subject: [PATCH 17/20] Organize module files --- .../Push-AddAlertSubscription_Queue.ps1 | 0 .../Push-CIPPAlertAdminPassword.ps1 | 0 .../Push-CIPPAlertApnCertExpiry.ps1 | 0 .../Push-CIPPAlertAppSecretExpiry.ps1 | 0 .../Push-CIPPAlertDefenderMalware.ps1 | 0 .../Push-CIPPAlertDefenderStatus.ps1 | 0 .../Push-CIPPAlertDepTokenExpiry.ps1 | 0 .../Push-CIPPAlertExpiringLicenses.ps1 | 0 .../Push-CIPPAlertMFAAdmins.ps1 | 0 .../Push-CIPPAlertMFAAlertUsers.ps1 | 0 .../Push-CIPPAlertNewAppApproval.ps1 | 0 .../Push-CIPPAlertNewRole.ps1 | 0 .../Push-CIPPAlertNoCAConfig.ps1 | 0 .../Push-CIPPAlertOverusedLicenses.ps1 | 0 .../Push-CIPPAlertQuotaUsed.ps1 | 0 .../Push-CIPPAlertSecDefaultsUpsell.ps1 | 0 .../Push-CIPPAlertSharepointQuota.ps1 | 0 .../Push-CIPPAlertUnusedLicenses.ps1 | 0 .../Push-CIPPAlertVppTokenExpiry.ps1 | 0 .../Push-CIPPStandard.ps1 | 0 .../Push-ExecAddMultiTenantApp.ps1 | 0 .../Push-ExecGDAPInviteQueue.ps1 | 0 .../Push-ExecOnboardTenantQueue.ps1 | 0 .../Push-ExecScheduledCommand.ps1 | 0 .../Push-GetPendingWebhooks.ps1 | 0 .../Push-ListGraphRequestQueue.ps1 | 0 .../Push-ListLicensesQueue.ps1 | 0 .../Push-ListMFAUsersQueue.ps1 | 0 .../Push-ListMailboxRulesQueue.ps1 | 0 .../Push-PublicWebhookProcess.ps1 | 0 .../Push-SchedulerAlert.ps1 | 0 .../Push-SchedulerCIPPNotifications.ps1 | 0 .../Push-Schedulerwebhookcreation.ps1 | 0 .../Push-UpdatePermissionsQueue.ps1 | 0 .../Push-UpdateTenants.ps1 | 0 .../Push-Z_CIPPQueueTrigger.ps1 | 0 .../CIPP/Core}/Invoke-ExecEditTemplate.ps1 | 0 .../CIPP/Core}/Invoke-ExecGeoIPLookup.ps1 | 0 .../CIPP/Core}/Invoke-ExecGraphRequest.ps1 | 0 .../CIPP/Core}/Invoke-GetCippAlerts.ps1 | 0 .../CIPP/Core}/Invoke-GetVersion.ps1 | 0 .../Scheduler}/Invoke-AddScheduledItem.ps1 | 0 .../Invoke-ExecScheduledCommand.ps1 | 0 .../Settings}/Invoke-ExecAccessChecks.ps1 | 0 .../Settings}/Invoke-ExecAddTrustedIP.ps1 | 0 .../CIPP/Settings}/Invoke-ExecBackendURLs.ps1 | 0 .../Settings}/Invoke-ExecCPVPermissions.ps1 | 0 .../CIPP/Settings}/Invoke-ExecDnsConfig.ps1 | 0 .../Settings}/Invoke-ExecExcludeLicenses.ps1 | 0 .../Settings}/Invoke-ExecExcludeTenant.ps1 | 0 .../Settings}/Invoke-ExecExtensionMapping.ps1 | 0 .../Settings}/Invoke-ExecExtensionSync.ps1 | 0 .../Settings}/Invoke-ExecExtensionTest.ps1 | 0 .../Settings}/Invoke-ExecExtensionsConfig.ps1 | 0 .../Invoke-ExecMaintenanceScripts.ps1 | 0 .../Invoke-ExecNotificationConfig.ps1 | 0 .../Settings}/Invoke-ExecPasswordConfig.ps1 | 0 .../Settings}/Invoke-ExecRestoreBackup.ps1 | 0 .../CIPP/Settings}/Invoke-ExecRunBackup.ps1 | 0 .../CIPP/Setup}/Invoke-ExecSAMSetup.ps1 | 0 .../Email-Exchange}/Invoke-AddContact.ps1 | 0 .../Email-Exchange}/Invoke-AddExConnector.ps1 | 0 .../Invoke-AddExConnectorTemplate.ps1 | 0 .../Invoke-AddSharedMailbox.ps1 | 0 .../Email-Exchange}/Invoke-AddSpamFilter.ps1 | 0 .../Invoke-AddSpamFilterTemplate.ps1 | 0 .../Invoke-AddTransportRule.ps1 | 0 .../Invoke-AddTransportTemplate.ps1 | 0 .../Invoke-EditExConnector.ps1 | 0 .../Email-Exchange}/Invoke-EditSpamFilter.ps1 | 0 .../Invoke-EditTransportRule.ps1 | 0 .../Invoke-ExecConverttoSharedMailbox.ps1 | 0 .../Invoke-ExecCopyForSent.ps1 | 0 .../Invoke-ExecDisableEmailForward.ps1 | 0 .../Invoke-ExecEditCalendarPermissions.ps1 | 0 .../Invoke-ExecEditMailboxPermissions.ps1 | 0 .../Invoke-ExecEmailForward.ps1 | 0 .../Invoke-ExecEnableArchive.ps1 | 0 .../Invoke-ExecGroupsDelete.ps1 | 0 .../Invoke-ExecGroupsDeliveryManagement.ps1 | 0 .../Invoke-ExecGroupsHideFromGAL.ps1 | 0 .../Invoke-ExecHideFromGAL.ps1 | 0 .../Email-Exchange}/Invoke-ExecMailTest.ps1 | 0 .../Invoke-ExecMailboxMobileDevices.ps1 | 0 .../Invoke-ExecMailboxRestore.ps1 | 0 .../Invoke-ExecQuarantineManagement.ps1 | 0 .../Invoke-ExecSetMailboxQuota.ps1 | 0 .../Email-Exchange}/Invoke-ExecSetOoO.ps1 | 0 .../Invoke-ListMailQuarantine.ps1 | 0 .../Invoke-ListMessageTrace.ps1 | 0 .../Email-Exchange}/Invoke-ListOoO.ps1 | 0 .../Invoke-ListPhishPolicies.ps1 | 0 .../Email-Exchange}/Invoke-ListRecipients.ps1 | 0 .../Invoke-ListSpamFilterTemplates.ps1 | 0 .../Email-Exchange}/Invoke-ListSpamfilter.ps1 | 0 .../Invoke-ListTransportRules.ps1 | 0 .../Invoke-ListTransportRulesTemplates.ps1 | 0 .../Applications}/Invoke-AddChocoApp.ps1 | 0 .../Applications}/Invoke-AddMSPApp.ps1 | 0 .../Applications}/Invoke-AddOfficeApp.ps1 | 0 .../Applications}/Invoke-AddWinGetApp.ps1 | 0 .../Applications}/Invoke-ExecAssignApp.ps1 | 0 .../Invoke-ListApplicationQueue.ps1 | 0 .../Applications}/Invoke-ListApps.ps1 | 0 .../Invoke-ListAppsRepository.ps1 | 0 .../Autopilot}/Invoke-AddAPDevice.ps1 | 0 .../Autopilot}/Invoke-AddAutopilotConfig.ps1 | 0 .../Autopilot}/Invoke-AddEnrollment.ps1 | 0 .../Autopilot}/Invoke-ExecAssignAPDevice.ps1 | 0 .../Autopilot}/Invoke-ListAPDevices.ps1 | 0 .../MEM}/Invoke-AddDefenderDeployment.ps1 | 0 .../MEM}/Invoke-AddIntuneTemplate.ps1 | 0 .../Endpoint/MEM}/Invoke-AddPolicy.ps1 | 0 .../Endpoint/MEM}/Invoke-EditPolicy.ps1 | 0 .../Endpoint/MEM}/Invoke-ExecAssignPolicy.ps1 | 0 .../Endpoint/MEM}/Invoke-ExecDeviceAction.ps1 | 0 .../MEM}/Invoke-ExecGetLocalAdminPassword.ps1 | 0 .../MEM}/Invoke-ExecGetRecoveryKey.ps1 | 0 .../Endpoint/Reports}/Invoke-ListDevices.ps1 | 0 .../Devices}/Invoke-ExecDeviceDelete.ps1 | 0 .../Groups}/Invoke-AddGroup.ps1 | 0 .../Groups}/Invoke-AddGroupTemplate.ps1 | 0 .../Groups}/Invoke-EditGroup.ps1 | 0 .../Administration/Users}/Invoke-AddGuest.ps1 | 0 .../Administration/Users}/Invoke-AddUser.ps1 | 0 .../Users}/Invoke-AddUserBulk.ps1 | 0 .../Administration/Users}/Invoke-EditUser.ps1 | 0 .../Users}/Invoke-ExecBECCheck.ps1 | 0 .../Users}/Invoke-ExecBECRemediate.ps1 | 0 .../Users}/Invoke-ExecClrImmId.ps1 | 0 .../Users}/Invoke-ExecCreateTAP.ps1 | 0 .../Users}/Invoke-ExecDisableUser.ps1 | 0 .../Users}/Invoke-ExecOffboardUser.ps1 | 0 ...Invoke-ExecOffboard_Mailboxpermissions.ps1 | 0 .../Users}/Invoke-ExecOneDriveShortCut.ps1 | 0 .../Users}/Invoke-ExecResetMFA.ps1 | 0 .../Users}/Invoke-ExecResetPass.ps1 | 0 .../Users}/Invoke-ExecRevokeSessions.ps1 | 0 .../Users}/Invoke-ExecSendPush.ps1 | 0 ...voke-ListUserConditionalAccessPolicies.ps1 | 0 .../Users}/Invoke-ListUserCounts.ps1 | 0 .../Users}/Invoke-ListUserDevices.ps1 | 0 .../Users}/Invoke-ListUserGroups.ps1 | 0 .../Users}/Invoke-ListUserMailboxDetails.ps1 | 0 .../Users}/Invoke-ListUserMailboxRules.ps1 | 0 .../Users}/Invoke-ListUserPhoto.ps1 | 0 .../Users}/Invoke-ListUserSettings.ps1 | 0 .../Users}/Invoke-ListUserSigninLogs.ps1 | 0 .../Users}/Invoke-ListUsers.ps1 | 0 .../Reports}/Invoke-ListBasicAuth.ps1 | 0 .../Invoke-ListBasicAuthAllTenants.ps1 | 0 .../Invoke-Z_CIPPHttpTrigger.ps1 | 0 .../Invoke-ExecAlertsListAllTenants.ps1 | 0 .../Security}/Invoke-ExecIncidentsList.ps1 | 0 .../Invoke-ExecIncidentsListAllTenants.ps1 | 0 .../Security}/Invoke-ExecSetSecurityAlert.ps1 | 0 .../Invoke-ExecSetSecurityIncident.ps1 | 0 .../Teams-Sharepoint}/Invoke-AddTeam.ps1 | 0 .../Invoke-ExecSetSharePointMember.ps1 | 0 .../Invoke-ExecSharePointOwner.ps1 | 0 .../Invoke-ListSharepointSettings.ps1 | 0 .../Teams-Sharepoint}/Invoke-ListSites.ps1 | 0 .../Teams-Sharepoint}/Invoke-ListTeams.ps1 | 0 .../Invoke-ListTeamsActivity.ps1 | 0 .../Invoke-ListTeamsVoice.ps1 | 0 .../Alerts}/Invoke-AddAlert.ps1 | 0 .../Alerts}/Invoke-ExecAlertsList.ps1 | 0 .../Alerts}/Invoke-ListWebhookAlert.ps1 | 0 .../Alerts}/Invoke-PublicWebhooks.ps1 | 0 .../Invoke-ExecAddMultiTenantApp.ps1 | 0 .../Invoke-ExecAppApproval.ps1 | 0 .../Administration}/Invoke-ExecAddSPN.ps1 | 0 .../Invoke-ExecOffboardTenant.ps1 | 0 .../Invoke-ExecOnboardTenant.ps1 | 0 .../Invoke-ListAppConsentRequests.ps1 | 0 .../Tenant}/Invoke-EditTenant.ps1 | 0 .../Tenant}/Invoke-ListTenantDetails.ps1 | 0 .../Tenant}/Invoke-ListTenants.ps1 | 0 .../Conditional}/Invoke-AddCAPolicy.ps1 | 0 .../Conditional}/Invoke-AddCATemplate.ps1 | 0 .../Conditional}/Invoke-AddNamedLocation.ps1 | 0 .../Conditional}/Invoke-EditCAPolicy.ps1 | 0 .../Conditional}/Invoke-ExecCAExclusion.ps1 | 0 .../Conditional}/Invoke-ListCAtemplates.ps1 | 0 .../Invoke-ListConditionalAccessPolicies.ps1 | 0 ...oke-ListConditionalAccessPolicyChanges.ps1 | 0 .../Tenant/GDAP}/Invoke-ExecAddGDAPRole.ps1 | 0 .../GDAP}/Invoke-ExecAutoExtendGDAP.ps1 | 0 .../Invoke-ExecDeleteGDAPRelationship.ps1 | 0 .../Invoke-ExecDeleteGDAPRoleMapping.ps1 | 0 .../Tenant/GDAP}/Invoke-ExecGDAPInvite.ps1 | 0 .../GDAP}/Invoke-ExecGDAPInviteApproved.ps1 | 0 .../Tenant/GDAP}/Invoke-ListGDAPInvite.ps1 | 0 .../Tenant/GDAP}/Invoke-ListGDAPQueue.ps1 | 0 .../Tenant/GDAP}/Invoke-ListGDAPRoles.ps1 | 0 .../Standards}/Invoke-AddStandardsDeploy.ps1 | 0 .../Invoke-BestPracticeAnalyser_List.ps1 | 0 .../Standards}/Invoke-ExecStandardsRun.ps1 | 0 .../Tenant/Standards}/Invoke-ListBPA.ps1 | 0 .../Standards}/Invoke-ListBPATemplates.ps1 | 0 .../Standards}/Invoke-ListDomainAnalyser.ps1 | 0 .../Standards}/Invoke-ListDomainHealth.ps1 | 0 .../Standards}/invoke-DomainAnalyser_List.ps1 | 0 .../Tools}/Invoke-ExecGraphExplorerPreset.ps1 | 0 ...nvoke-AddChocoApp_OrchestrationStarter.ps1 | 26 ----- .../Invoke-ExecGDAPInviteQueue.ps1 | 42 -------- .../Entrypoints/Invoke-ExecGDAPMigration.ps1 | 33 ------- .../Invoke-ExecGDAPMigrationQueue.ps1 | 99 ------------------- Modules/CippEntrypoints/CippEntrypoints.psm1 | 2 +- 209 files changed, 1 insertion(+), 201 deletions(-) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-AddAlertSubscription_Queue.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertAdminPassword.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertApnCertExpiry.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertAppSecretExpiry.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertDefenderMalware.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertDefenderStatus.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertDepTokenExpiry.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertExpiringLicenses.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertMFAAdmins.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertMFAAlertUsers.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertNewAppApproval.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertNewRole.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertNoCAConfig.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertOverusedLicenses.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertQuotaUsed.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertSecDefaultsUpsell.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertSharepointQuota.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertUnusedLicenses.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPAlertVppTokenExpiry.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-CIPPStandard.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-ExecAddMultiTenantApp.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-ExecGDAPInviteQueue.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-ExecOnboardTenantQueue.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-ExecScheduledCommand.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-GetPendingWebhooks.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-ListGraphRequestQueue.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-ListLicensesQueue.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-ListMFAUsersQueue.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-ListMailboxRulesQueue.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-PublicWebhookProcess.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-SchedulerAlert.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-SchedulerCIPPNotifications.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-Schedulerwebhookcreation.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-UpdatePermissionsQueue.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-UpdateTenants.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => Activity Triggers}/Push-Z_CIPPQueueTrigger.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Core}/Invoke-ExecEditTemplate.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Core}/Invoke-ExecGeoIPLookup.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Core}/Invoke-ExecGraphRequest.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Core}/Invoke-GetCippAlerts.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Core}/Invoke-GetVersion.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Scheduler}/Invoke-AddScheduledItem.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Scheduler}/Invoke-ExecScheduledCommand.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecAccessChecks.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecAddTrustedIP.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecBackendURLs.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecCPVPermissions.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecDnsConfig.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecExcludeLicenses.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecExcludeTenant.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecExtensionMapping.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecExtensionSync.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecExtensionTest.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecExtensionsConfig.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecMaintenanceScripts.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecNotificationConfig.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecPasswordConfig.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecRestoreBackup.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Settings}/Invoke-ExecRunBackup.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/CIPP/Setup}/Invoke-ExecSAMSetup.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-AddContact.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-AddExConnector.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-AddExConnectorTemplate.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-AddSharedMailbox.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-AddSpamFilter.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-AddSpamFilterTemplate.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-AddTransportRule.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-AddTransportTemplate.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-EditExConnector.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-EditSpamFilter.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-EditTransportRule.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecConverttoSharedMailbox.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecCopyForSent.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecDisableEmailForward.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecEditCalendarPermissions.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecEditMailboxPermissions.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecEmailForward.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecEnableArchive.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecGroupsDelete.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecGroupsDeliveryManagement.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecGroupsHideFromGAL.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecHideFromGAL.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecMailTest.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecMailboxMobileDevices.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecMailboxRestore.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecQuarantineManagement.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecSetMailboxQuota.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ExecSetOoO.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ListMailQuarantine.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ListMessageTrace.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ListOoO.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ListPhishPolicies.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ListRecipients.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ListSpamFilterTemplates.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ListSpamfilter.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ListTransportRules.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Email-Exchange}/Invoke-ListTransportRulesTemplates.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/Applications}/Invoke-AddChocoApp.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/Applications}/Invoke-AddMSPApp.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/Applications}/Invoke-AddOfficeApp.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/Applications}/Invoke-AddWinGetApp.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/Applications}/Invoke-ExecAssignApp.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/Applications}/Invoke-ListApplicationQueue.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/Applications}/Invoke-ListApps.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/Applications}/Invoke-ListAppsRepository.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/Autopilot}/Invoke-AddAPDevice.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/Autopilot}/Invoke-AddAutopilotConfig.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/Autopilot}/Invoke-AddEnrollment.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/Autopilot}/Invoke-ExecAssignAPDevice.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/Autopilot}/Invoke-ListAPDevices.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/MEM}/Invoke-AddDefenderDeployment.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/MEM}/Invoke-AddIntuneTemplate.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/MEM}/Invoke-AddPolicy.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/MEM}/Invoke-EditPolicy.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/MEM}/Invoke-ExecAssignPolicy.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/MEM}/Invoke-ExecDeviceAction.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/MEM}/Invoke-ExecGetLocalAdminPassword.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/MEM}/Invoke-ExecGetRecoveryKey.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Endpoint/Reports}/Invoke-ListDevices.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Devices}/Invoke-ExecDeviceDelete.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Groups}/Invoke-AddGroup.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Groups}/Invoke-AddGroupTemplate.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Groups}/Invoke-EditGroup.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-AddGuest.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-AddUser.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-AddUserBulk.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-EditUser.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ExecBECCheck.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ExecBECRemediate.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ExecClrImmId.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ExecCreateTAP.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ExecDisableUser.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ExecOffboardUser.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ExecOffboard_Mailboxpermissions.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ExecOneDriveShortCut.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ExecResetMFA.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ExecResetPass.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ExecRevokeSessions.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ExecSendPush.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ListUserConditionalAccessPolicies.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ListUserCounts.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ListUserDevices.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ListUserGroups.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ListUserMailboxDetails.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ListUserMailboxRules.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ListUserPhoto.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ListUserSettings.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ListUserSigninLogs.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Administration/Users}/Invoke-ListUsers.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Reports}/Invoke-ListBasicAuth.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Identity/Reports}/Invoke-ListBasicAuthAllTenants.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions}/Invoke-Z_CIPPHttpTrigger.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Security}/Invoke-ExecAlertsListAllTenants.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Security}/Invoke-ExecIncidentsList.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Security}/Invoke-ExecIncidentsListAllTenants.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Security}/Invoke-ExecSetSecurityAlert.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Security}/Invoke-ExecSetSecurityIncident.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Teams-Sharepoint}/Invoke-AddTeam.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Teams-Sharepoint}/Invoke-ExecSetSharePointMember.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Teams-Sharepoint}/Invoke-ExecSharePointOwner.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Teams-Sharepoint}/Invoke-ListSharepointSettings.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Teams-Sharepoint}/Invoke-ListSites.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Teams-Sharepoint}/Invoke-ListTeams.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Teams-Sharepoint}/Invoke-ListTeamsActivity.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Teams-Sharepoint}/Invoke-ListTeamsVoice.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Administration/Alerts}/Invoke-AddAlert.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Administration/Alerts}/Invoke-ExecAlertsList.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Administration/Alerts}/Invoke-ListWebhookAlert.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Administration/Alerts}/Invoke-PublicWebhooks.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Administration/Application Approval}/Invoke-ExecAddMultiTenantApp.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Administration/Application Approval}/Invoke-ExecAppApproval.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Administration}/Invoke-ExecAddSPN.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Administration}/Invoke-ExecOffboardTenant.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Administration}/Invoke-ExecOnboardTenant.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Administration}/Invoke-ListAppConsentRequests.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Administration/Tenant}/Invoke-EditTenant.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Administration/Tenant}/Invoke-ListTenantDetails.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Administration/Tenant}/Invoke-ListTenants.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Conditional}/Invoke-AddCAPolicy.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Conditional}/Invoke-AddCATemplate.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Conditional}/Invoke-AddNamedLocation.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Conditional}/Invoke-EditCAPolicy.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Conditional}/Invoke-ExecCAExclusion.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Conditional}/Invoke-ListCAtemplates.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Conditional}/Invoke-ListConditionalAccessPolicies.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Conditional}/Invoke-ListConditionalAccessPolicyChanges.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/GDAP}/Invoke-ExecAddGDAPRole.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/GDAP}/Invoke-ExecAutoExtendGDAP.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/GDAP}/Invoke-ExecDeleteGDAPRelationship.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/GDAP}/Invoke-ExecDeleteGDAPRoleMapping.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/GDAP}/Invoke-ExecGDAPInvite.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/GDAP}/Invoke-ExecGDAPInviteApproved.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/GDAP}/Invoke-ListGDAPInvite.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/GDAP}/Invoke-ListGDAPQueue.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/GDAP}/Invoke-ListGDAPRoles.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Standards}/Invoke-AddStandardsDeploy.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Standards}/Invoke-BestPracticeAnalyser_List.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Standards}/Invoke-ExecStandardsRun.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Standards}/Invoke-ListBPA.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Standards}/Invoke-ListBPATemplates.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Standards}/Invoke-ListDomainAnalyser.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Standards}/Invoke-ListDomainHealth.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Standards}/invoke-DomainAnalyser_List.ps1 (100%) rename Modules/CIPPCore/Public/Entrypoints/{ => HTTP Functions/Tenant/Tools}/Invoke-ExecGraphExplorerPreset.ps1 (100%) delete mode 100644 Modules/CIPPCore/Public/Entrypoints/Invoke-AddChocoApp_OrchestrationStarter.ps1 delete mode 100644 Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPInviteQueue.ps1 delete mode 100644 Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPMigration.ps1 delete mode 100644 Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPMigrationQueue.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-AddAlertSubscription_Queue.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-AddAlertSubscription_Queue.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-AddAlertSubscription_Queue.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-AddAlertSubscription_Queue.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertAdminPassword.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertAdminPassword.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertAdminPassword.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertAdminPassword.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertApnCertExpiry.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertApnCertExpiry.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertApnCertExpiry.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertApnCertExpiry.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertAppSecretExpiry.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertAppSecretExpiry.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertAppSecretExpiry.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertAppSecretExpiry.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertDefenderMalware.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertDefenderMalware.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertDefenderMalware.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertDefenderMalware.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertDefenderStatus.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertDefenderStatus.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertDefenderStatus.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertDefenderStatus.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertDepTokenExpiry.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertDepTokenExpiry.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertDepTokenExpiry.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertDepTokenExpiry.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertExpiringLicenses.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertExpiringLicenses.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertExpiringLicenses.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertExpiringLicenses.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertMFAAdmins.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertMFAAdmins.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertMFAAdmins.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertMFAAdmins.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertMFAAlertUsers.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertMFAAlertUsers.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertMFAAlertUsers.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertMFAAlertUsers.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertNewAppApproval.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertNewAppApproval.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertNewAppApproval.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertNewAppApproval.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertNewRole.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertNewRole.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertNewRole.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertNewRole.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertNoCAConfig.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertNoCAConfig.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertNoCAConfig.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertNoCAConfig.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertOverusedLicenses.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertOverusedLicenses.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertOverusedLicenses.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertOverusedLicenses.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertQuotaUsed.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertQuotaUsed.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertQuotaUsed.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertQuotaUsed.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertSecDefaultsUpsell.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertSecDefaultsUpsell.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertSecDefaultsUpsell.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertSecDefaultsUpsell.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertSharepointQuota.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertSharepointQuota.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertSharepointQuota.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertSharepointQuota.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertUnusedLicenses.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertUnusedLicenses.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertUnusedLicenses.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertUnusedLicenses.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertVppTokenExpiry.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertVppTokenExpiry.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPAlertVppTokenExpiry.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPAlertVppTokenExpiry.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-CIPPStandard.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPStandard.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-CIPPStandard.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-CIPPStandard.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-ExecAddMultiTenantApp.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ExecAddMultiTenantApp.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-ExecAddMultiTenantApp.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ExecAddMultiTenantApp.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-ExecGDAPInviteQueue.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ExecGDAPInviteQueue.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-ExecGDAPInviteQueue.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ExecGDAPInviteQueue.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-ExecOnboardTenantQueue.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ExecOnboardTenantQueue.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-ExecOnboardTenantQueue.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ExecOnboardTenantQueue.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-ExecScheduledCommand.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ExecScheduledCommand.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-ExecScheduledCommand.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ExecScheduledCommand.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-GetPendingWebhooks.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-GetPendingWebhooks.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-GetPendingWebhooks.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-GetPendingWebhooks.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-ListGraphRequestQueue.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ListGraphRequestQueue.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-ListGraphRequestQueue.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ListGraphRequestQueue.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-ListLicensesQueue.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ListLicensesQueue.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-ListLicensesQueue.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ListLicensesQueue.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-ListMFAUsersQueue.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ListMFAUsersQueue.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-ListMFAUsersQueue.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ListMFAUsersQueue.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-ListMailboxRulesQueue.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ListMailboxRulesQueue.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-ListMailboxRulesQueue.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ListMailboxRulesQueue.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-PublicWebhookProcess.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-PublicWebhookProcess.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-PublicWebhookProcess.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-PublicWebhookProcess.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-SchedulerAlert.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-SchedulerAlert.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-SchedulerAlert.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-SchedulerAlert.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-SchedulerCIPPNotifications.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-SchedulerCIPPNotifications.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-SchedulerCIPPNotifications.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-SchedulerCIPPNotifications.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-Schedulerwebhookcreation.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-Schedulerwebhookcreation.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-Schedulerwebhookcreation.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-Schedulerwebhookcreation.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-UpdatePermissionsQueue.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-UpdatePermissionsQueue.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-UpdatePermissionsQueue.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-UpdatePermissionsQueue.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-UpdateTenants.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-UpdateTenants.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-UpdateTenants.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-UpdateTenants.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Push-Z_CIPPQueueTrigger.ps1 b/Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-Z_CIPPQueueTrigger.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Push-Z_CIPPQueueTrigger.ps1 rename to Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-Z_CIPPQueueTrigger.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecEditTemplate.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Core/Invoke-ExecEditTemplate.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecEditTemplate.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Core/Invoke-ExecEditTemplate.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGeoIPLookup.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Core/Invoke-ExecGeoIPLookup.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGeoIPLookup.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Core/Invoke-ExecGeoIPLookup.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGraphRequest.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Core/Invoke-ExecGraphRequest.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGraphRequest.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Core/Invoke-ExecGraphRequest.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-GetCippAlerts.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Core/Invoke-GetCippAlerts.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-GetCippAlerts.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Core/Invoke-GetCippAlerts.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-GetVersion.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Core/Invoke-GetVersion.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-GetVersion.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Core/Invoke-GetVersion.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddScheduledItem.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Scheduler/Invoke-AddScheduledItem.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddScheduledItem.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Scheduler/Invoke-AddScheduledItem.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecScheduledCommand.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Scheduler/Invoke-ExecScheduledCommand.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecScheduledCommand.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Scheduler/Invoke-ExecScheduledCommand.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAccessChecks.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecAccessChecks.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAccessChecks.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecAccessChecks.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAddTrustedIP.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecAddTrustedIP.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAddTrustedIP.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecAddTrustedIP.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecBackendURLs.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecBackendURLs.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecBackendURLs.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecBackendURLs.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecCPVPermissions.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecCPVPermissions.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecCPVPermissions.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecCPVPermissions.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDnsConfig.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecDnsConfig.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDnsConfig.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecDnsConfig.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecExcludeLicenses.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecExcludeLicenses.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecExcludeLicenses.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecExcludeLicenses.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecExcludeTenant.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecExcludeTenant.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecExcludeTenant.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecExcludeTenant.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecExtensionMapping.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecExtensionMapping.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecExtensionMapping.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecExtensionMapping.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecExtensionSync.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecExtensionSync.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecExtensionSync.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecExtensionSync.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecExtensionTest.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecExtensionTest.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecExtensionTest.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecExtensionTest.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecExtensionsConfig.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecExtensionsConfig.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecExtensionsConfig.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecExtensionsConfig.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMaintenanceScripts.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecMaintenanceScripts.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMaintenanceScripts.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecMaintenanceScripts.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecNotificationConfig.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecNotificationConfig.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecNotificationConfig.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecNotificationConfig.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecPasswordConfig.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecPasswordConfig.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecPasswordConfig.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecPasswordConfig.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecRestoreBackup.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecRestoreBackup.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecRestoreBackup.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecRestoreBackup.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecRunBackup.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecRunBackup.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecRunBackup.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecRunBackup.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSAMSetup.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Setup/Invoke-ExecSAMSetup.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSAMSetup.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Setup/Invoke-ExecSAMSetup.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddContact.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddContact.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddContact.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddContact.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddExConnector.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddExConnector.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddExConnector.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddExConnector.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddExConnectorTemplate.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddExConnectorTemplate.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddExConnectorTemplate.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddExConnectorTemplate.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddSharedMailbox.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddSharedMailbox.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddSharedMailbox.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddSharedMailbox.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddSpamFilter.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddSpamFilter.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddSpamFilter.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddSpamFilter.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddSpamFilterTemplate.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddSpamFilterTemplate.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddSpamFilterTemplate.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddSpamFilterTemplate.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddTransportRule.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddTransportRule.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddTransportRule.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddTransportRule.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddTransportTemplate.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddTransportTemplate.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddTransportTemplate.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-AddTransportTemplate.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-EditExConnector.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-EditExConnector.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-EditExConnector.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-EditExConnector.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-EditSpamFilter.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-EditSpamFilter.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-EditSpamFilter.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-EditSpamFilter.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-EditTransportRule.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-EditTransportRule.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-EditTransportRule.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-EditTransportRule.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecConverttoSharedMailbox.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecConverttoSharedMailbox.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecConverttoSharedMailbox.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecConverttoSharedMailbox.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecCopyForSent.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecCopyForSent.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecCopyForSent.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecCopyForSent.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDisableEmailForward.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecDisableEmailForward.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDisableEmailForward.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecDisableEmailForward.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecEditCalendarPermissions.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecEditCalendarPermissions.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecEditCalendarPermissions.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecEditCalendarPermissions.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecEditMailboxPermissions.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecEditMailboxPermissions.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecEditMailboxPermissions.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecEditMailboxPermissions.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecEmailForward.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecEmailForward.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecEmailForward.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecEmailForward.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecEnableArchive.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecEnableArchive.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecEnableArchive.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecEnableArchive.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGroupsDelete.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecGroupsDelete.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGroupsDelete.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecGroupsDelete.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGroupsDeliveryManagement.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecGroupsDeliveryManagement.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGroupsDeliveryManagement.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecGroupsDeliveryManagement.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGroupsHideFromGAL.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecGroupsHideFromGAL.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGroupsHideFromGAL.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecGroupsHideFromGAL.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecHideFromGAL.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecHideFromGAL.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecHideFromGAL.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecHideFromGAL.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecMailTest.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailTest.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecMailTest.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailboxMobileDevices.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecMailboxMobileDevices.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailboxMobileDevices.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecMailboxMobileDevices.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailboxRestore.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecMailboxRestore.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecMailboxRestore.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecMailboxRestore.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecQuarantineManagement.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecQuarantineManagement.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecQuarantineManagement.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecQuarantineManagement.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSetMailboxQuota.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecSetMailboxQuota.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSetMailboxQuota.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecSetMailboxQuota.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSetOoO.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecSetOoO.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSetOoO.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ExecSetOoO.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListMailQuarantine.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListMailQuarantine.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListMailQuarantine.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListMailQuarantine.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListMessageTrace.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListMessageTrace.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListMessageTrace.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListMessageTrace.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListOoO.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListOoO.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListOoO.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListOoO.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListPhishPolicies.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListPhishPolicies.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListPhishPolicies.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListPhishPolicies.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListRecipients.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListRecipients.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListRecipients.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListRecipients.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListSpamFilterTemplates.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListSpamFilterTemplates.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListSpamFilterTemplates.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListSpamFilterTemplates.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListSpamfilter.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListSpamfilter.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListSpamfilter.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListSpamfilter.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListTransportRules.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListTransportRules.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListTransportRules.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListTransportRules.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListTransportRulesTemplates.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListTransportRulesTemplates.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListTransportRulesTemplates.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Invoke-ListTransportRulesTemplates.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddChocoApp.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-AddChocoApp.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddChocoApp.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-AddChocoApp.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddMSPApp.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-AddMSPApp.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddMSPApp.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-AddMSPApp.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddOfficeApp.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-AddOfficeApp.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddOfficeApp.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-AddOfficeApp.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddWinGetApp.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-AddWinGetApp.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddWinGetApp.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-AddWinGetApp.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAssignApp.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-ExecAssignApp.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAssignApp.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-ExecAssignApp.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListApplicationQueue.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-ListApplicationQueue.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListApplicationQueue.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-ListApplicationQueue.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListApps.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-ListApps.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListApps.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-ListApps.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListAppsRepository.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-ListAppsRepository.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListAppsRepository.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Applications/Invoke-ListAppsRepository.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddAPDevice.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Autopilot/Invoke-AddAPDevice.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddAPDevice.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Autopilot/Invoke-AddAPDevice.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddAutopilotConfig.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Autopilot/Invoke-AddAutopilotConfig.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddAutopilotConfig.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Autopilot/Invoke-AddAutopilotConfig.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddEnrollment.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Autopilot/Invoke-AddEnrollment.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddEnrollment.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Autopilot/Invoke-AddEnrollment.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAssignAPDevice.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Autopilot/Invoke-ExecAssignAPDevice.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAssignAPDevice.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Autopilot/Invoke-ExecAssignAPDevice.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListAPDevices.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Autopilot/Invoke-ListAPDevices.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListAPDevices.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Autopilot/Invoke-ListAPDevices.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddDefenderDeployment.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-AddDefenderDeployment.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddDefenderDeployment.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-AddDefenderDeployment.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddIntuneTemplate.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-AddIntuneTemplate.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddIntuneTemplate.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-AddIntuneTemplate.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddPolicy.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-AddPolicy.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddPolicy.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-AddPolicy.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-EditPolicy.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-EditPolicy.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-EditPolicy.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-EditPolicy.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAssignPolicy.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-ExecAssignPolicy.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAssignPolicy.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-ExecAssignPolicy.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDeviceAction.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-ExecDeviceAction.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDeviceAction.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-ExecDeviceAction.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGetLocalAdminPassword.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-ExecGetLocalAdminPassword.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGetLocalAdminPassword.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-ExecGetLocalAdminPassword.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGetRecoveryKey.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-ExecGetRecoveryKey.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGetRecoveryKey.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/MEM/Invoke-ExecGetRecoveryKey.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListDevices.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Reports/Invoke-ListDevices.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListDevices.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Endpoint/Reports/Invoke-ListDevices.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDeviceDelete.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Devices/Invoke-ExecDeviceDelete.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDeviceDelete.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Devices/Invoke-ExecDeviceDelete.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddGroup.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Groups/Invoke-AddGroup.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddGroup.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Groups/Invoke-AddGroup.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddGroupTemplate.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Groups/Invoke-AddGroupTemplate.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddGroupTemplate.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Groups/Invoke-AddGroupTemplate.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-EditGroup.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Groups/Invoke-EditGroup.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-EditGroup.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Groups/Invoke-EditGroup.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddGuest.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-AddGuest.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddGuest.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-AddGuest.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddUser.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-AddUser.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddUser.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-AddUser.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddUserBulk.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-AddUserBulk.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddUserBulk.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-AddUserBulk.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-EditUser.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-EditUser.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-EditUser.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-EditUser.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecBECCheck.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecBECCheck.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecBECCheck.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecBECCheck.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecBECRemediate.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecBECRemediate.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecBECRemediate.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecBECRemediate.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecClrImmId.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecClrImmId.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecClrImmId.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecClrImmId.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecCreateTAP.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecCreateTAP.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecCreateTAP.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecCreateTAP.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDisableUser.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecDisableUser.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDisableUser.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecDisableUser.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecOffboardUser.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecOffboardUser.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecOffboardUser.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecOffboardUser.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecOffboard_Mailboxpermissions.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecOffboard_Mailboxpermissions.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecOffboard_Mailboxpermissions.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecOffboard_Mailboxpermissions.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecOneDriveShortCut.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecOneDriveShortCut.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecOneDriveShortCut.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecOneDriveShortCut.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecResetMFA.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecResetMFA.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecResetMFA.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecResetMFA.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecResetPass.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecResetPass.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecResetPass.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecResetPass.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecRevokeSessions.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecRevokeSessions.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecRevokeSessions.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecRevokeSessions.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSendPush.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecSendPush.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSendPush.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ExecSendPush.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserConditionalAccessPolicies.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserConditionalAccessPolicies.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserConditionalAccessPolicies.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserConditionalAccessPolicies.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserCounts.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserCounts.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserCounts.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserCounts.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserDevices.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserDevices.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserDevices.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserDevices.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserGroups.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserGroups.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserGroups.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserGroups.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserMailboxDetails.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserMailboxDetails.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserMailboxDetails.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserMailboxDetails.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserMailboxRules.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserMailboxRules.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserMailboxRules.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserMailboxRules.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserPhoto.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserPhoto.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserPhoto.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserPhoto.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserSettings.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserSettings.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserSettings.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserSettings.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserSigninLogs.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserSigninLogs.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListUserSigninLogs.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUserSigninLogs.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListUsers.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUsers.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListUsers.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-ListUsers.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListBasicAuth.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Reports/Invoke-ListBasicAuth.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListBasicAuth.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Reports/Invoke-ListBasicAuth.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListBasicAuthAllTenants.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Reports/Invoke-ListBasicAuthAllTenants.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListBasicAuthAllTenants.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Reports/Invoke-ListBasicAuthAllTenants.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-Z_CIPPHttpTrigger.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Invoke-Z_CIPPHttpTrigger.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-Z_CIPPHttpTrigger.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Invoke-Z_CIPPHttpTrigger.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAlertsListAllTenants.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Security/Invoke-ExecAlertsListAllTenants.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAlertsListAllTenants.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Security/Invoke-ExecAlertsListAllTenants.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecIncidentsList.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Security/Invoke-ExecIncidentsList.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecIncidentsList.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Security/Invoke-ExecIncidentsList.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecIncidentsListAllTenants.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Security/Invoke-ExecIncidentsListAllTenants.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecIncidentsListAllTenants.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Security/Invoke-ExecIncidentsListAllTenants.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSetSecurityAlert.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Security/Invoke-ExecSetSecurityAlert.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSetSecurityAlert.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Security/Invoke-ExecSetSecurityAlert.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSetSecurityIncident.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Security/Invoke-ExecSetSecurityIncident.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSetSecurityIncident.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Security/Invoke-ExecSetSecurityIncident.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddTeam.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-AddTeam.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddTeam.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-AddTeam.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSetSharePointMember.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-ExecSetSharePointMember.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSetSharePointMember.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-ExecSetSharePointMember.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSharePointOwner.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-ExecSharePointOwner.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecSharePointOwner.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-ExecSharePointOwner.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListSharepointSettings.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-ListSharepointSettings.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListSharepointSettings.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-ListSharepointSettings.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListSites.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-ListSites.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListSites.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-ListSites.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListTeams.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-ListTeams.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListTeams.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-ListTeams.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListTeamsActivity.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-ListTeamsActivity.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListTeamsActivity.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-ListTeamsActivity.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListTeamsVoice.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-ListTeamsVoice.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListTeamsVoice.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Teams-Sharepoint/Invoke-ListTeamsVoice.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddAlert.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Alerts/Invoke-AddAlert.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddAlert.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Alerts/Invoke-AddAlert.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAlertsList.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Alerts/Invoke-ExecAlertsList.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAlertsList.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Alerts/Invoke-ExecAlertsList.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListWebhookAlert.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Alerts/Invoke-ListWebhookAlert.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListWebhookAlert.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Alerts/Invoke-ListWebhookAlert.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-PublicWebhooks.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Alerts/Invoke-PublicWebhooks.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-PublicWebhooks.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Alerts/Invoke-PublicWebhooks.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAddMultiTenantApp.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Application Approval/Invoke-ExecAddMultiTenantApp.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAddMultiTenantApp.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Application Approval/Invoke-ExecAddMultiTenantApp.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAppApproval.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Application Approval/Invoke-ExecAppApproval.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAppApproval.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Application Approval/Invoke-ExecAppApproval.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAddSPN.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Invoke-ExecAddSPN.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAddSPN.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Invoke-ExecAddSPN.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecOffboardTenant.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Invoke-ExecOffboardTenant.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecOffboardTenant.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Invoke-ExecOffboardTenant.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecOnboardTenant.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Invoke-ExecOnboardTenant.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecOnboardTenant.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Invoke-ExecOnboardTenant.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListAppConsentRequests.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Invoke-ListAppConsentRequests.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListAppConsentRequests.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Invoke-ListAppConsentRequests.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-EditTenant.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Tenant/Invoke-EditTenant.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-EditTenant.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Tenant/Invoke-EditTenant.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListTenantDetails.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Tenant/Invoke-ListTenantDetails.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListTenantDetails.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Tenant/Invoke-ListTenantDetails.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListTenants.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Tenant/Invoke-ListTenants.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListTenants.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Tenant/Invoke-ListTenants.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddCAPolicy.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-AddCAPolicy.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddCAPolicy.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-AddCAPolicy.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddCATemplate.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-AddCATemplate.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddCATemplate.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-AddCATemplate.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddNamedLocation.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-AddNamedLocation.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddNamedLocation.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-AddNamedLocation.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-EditCAPolicy.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-EditCAPolicy.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-EditCAPolicy.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-EditCAPolicy.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecCAExclusion.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-ExecCAExclusion.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecCAExclusion.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-ExecCAExclusion.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListCAtemplates.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-ListCAtemplates.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListCAtemplates.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-ListCAtemplates.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListConditionalAccessPolicies.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-ListConditionalAccessPolicies.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListConditionalAccessPolicies.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-ListConditionalAccessPolicies.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListConditionalAccessPolicyChanges.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-ListConditionalAccessPolicyChanges.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListConditionalAccessPolicyChanges.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Conditional/Invoke-ListConditionalAccessPolicyChanges.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAddGDAPRole.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ExecAddGDAPRole.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAddGDAPRole.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ExecAddGDAPRole.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAutoExtendGDAP.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ExecAutoExtendGDAP.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecAutoExtendGDAP.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ExecAutoExtendGDAP.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDeleteGDAPRelationship.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ExecDeleteGDAPRelationship.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDeleteGDAPRelationship.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ExecDeleteGDAPRelationship.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDeleteGDAPRoleMapping.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ExecDeleteGDAPRoleMapping.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecDeleteGDAPRoleMapping.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ExecDeleteGDAPRoleMapping.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPInvite.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ExecGDAPInvite.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPInvite.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ExecGDAPInvite.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPInviteApproved.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ExecGDAPInviteApproved.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPInviteApproved.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ExecGDAPInviteApproved.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListGDAPInvite.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ListGDAPInvite.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListGDAPInvite.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ListGDAPInvite.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListGDAPQueue.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ListGDAPQueue.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListGDAPQueue.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ListGDAPQueue.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListGDAPRoles.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ListGDAPRoles.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListGDAPRoles.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/GDAP/Invoke-ListGDAPRoles.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddStandardsDeploy.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/Invoke-AddStandardsDeploy.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-AddStandardsDeploy.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/Invoke-AddStandardsDeploy.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-BestPracticeAnalyser_List.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/Invoke-BestPracticeAnalyser_List.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-BestPracticeAnalyser_List.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/Invoke-BestPracticeAnalyser_List.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecStandardsRun.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/Invoke-ExecStandardsRun.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecStandardsRun.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/Invoke-ExecStandardsRun.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListBPA.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/Invoke-ListBPA.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListBPA.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/Invoke-ListBPA.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListBPATemplates.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/Invoke-ListBPATemplates.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListBPATemplates.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/Invoke-ListBPATemplates.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListDomainAnalyser.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/Invoke-ListDomainAnalyser.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListDomainAnalyser.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/Invoke-ListDomainAnalyser.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ListDomainHealth.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/Invoke-ListDomainHealth.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ListDomainHealth.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/Invoke-ListDomainHealth.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/invoke-DomainAnalyser_List.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/invoke-DomainAnalyser_List.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/invoke-DomainAnalyser_List.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Standards/invoke-DomainAnalyser_List.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGraphExplorerPreset.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Tools/Invoke-ExecGraphExplorerPreset.ps1 similarity index 100% rename from Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGraphExplorerPreset.ps1 rename to Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Tools/Invoke-ExecGraphExplorerPreset.ps1 diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddChocoApp_OrchestrationStarter.ps1 b/Modules/CIPPCore/Public/Entrypoints/Invoke-AddChocoApp_OrchestrationStarter.ps1 deleted file mode 100644 index fbbcb29a1dce..000000000000 --- a/Modules/CIPPCore/Public/Entrypoints/Invoke-AddChocoApp_OrchestrationStarter.ps1 +++ /dev/null @@ -1,26 +0,0 @@ -using namespace System.Net - -Function Invoke-AddChocoApp_OrchestrationStarter { - <# - .FUNCTIONALITY - Entrypoint - #> - [CmdletBinding()] - param($Request, $TriggerMetadata) - - Write-LogMessage -API 'ChocoApps' -message 'Attempted to start upload but an instance was already running.' -sev Info - $InstanceId = Start-NewOrchestration -FunctionName 'Applications_Orchestrator' - Write-Host "Started orchestration with ID = '$InstanceId'" - $Orchestrator = New-OrchestrationCheckStatusResponse -Request $Request -InstanceId $InstanceId - Write-LogMessage -API 'ChocoApps' -message 'Started uploading applications to tenants' -sev Info - $Results = [pscustomobject]@{'Results' = 'Started application queue' } - - Write-Host ($Orchestrator | ConvertTo-Json) - - - Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ - StatusCode = [HttpStatusCode]::OK - Body = $results - }) - -} \ No newline at end of file diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPInviteQueue.ps1 b/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPInviteQueue.ps1 deleted file mode 100644 index 60d7ddbb29d2..000000000000 --- a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPInviteQueue.ps1 +++ /dev/null @@ -1,42 +0,0 @@ -using namespace System.Net - -Function Invoke-ExecGDAPInviteQueue { - <# - .FUNCTIONALITY - Entrypoint - #> - [CmdletBinding()] - param($Request, $TriggerMetadata) - - #$TenantFilter = $env:TenantID - - $Table = Get-CIPPTable -TableName 'GDAPInvites' - $Invite = Get-CIPPAzDataTableEntity @Table -Filter "RowKey eq '$QueueItem'" - $APINAME = 'GDAPInvites' - $RoleMappings = $Invite.RoleMappings | ConvertFrom-Json - Write-Host ($Invite | ConvertTo-Json -Compress) - - foreach ($role in $RoleMappings) { - try { - $Mappingbody = ConvertTo-Json -Depth 10 -InputObject @{ - 'accessContainer' = @{ - 'accessContainerId' = "$($Role.GroupId)" - 'accessContainerType' = 'securityGroup' - } - 'accessDetails' = @{ - 'unifiedRoles' = @(@{ - 'roleDefinitionId' = "$($Role.roleDefinitionId)" - }) - } - } - New-GraphPostRequest -NoAuthCheck $True -uri "https://graph.microsoft.com/beta/tenantRelationships/delegatedAdminRelationships/$($QueueItem)/accessAssignments" -tenantid $env:TenantID -type POST -body $MappingBody -verbose - Start-Sleep -Milliseconds 100 - } catch { - Write-LogMessage -API $APINAME -message "GDAP Group mapping failed - $($role.GroupId): $($_.Exception.Message)" -Sev Error - exit 1 - } - Write-LogMessage -API $APINAME -message "Groups mapped for GDAP Relationship: $($GdapInvite.RowKey)" -Sev Info - } - Remove-AzDataTableEntity @Table -Entity $Invite - -} diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPMigration.ps1 b/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPMigration.ps1 deleted file mode 100644 index 7b5ce0a31a1d..000000000000 --- a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPMigration.ps1 +++ /dev/null @@ -1,33 +0,0 @@ -using namespace System.Net - -Function Invoke-ExecGDAPMigration { - <# - .FUNCTIONALITY - Entrypoint - #> - [CmdletBinding()] - param($Request, $TriggerMetadata) - - $APIName = $TriggerMetadata.FunctionName - Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message 'Accessed this API' -Sev 'Debug' - - $Groups = $Request.body.gdapRoles - $Tenants = $Request.body.selectedTenants - $Results = [System.Collections.ArrayList]@() - - foreach ($Tenant in $Tenants) { - $obj = [PSCustomObject]@{ - tenant = $Tenant - gdapRoles = $Groups - } - Push-OutputBinding -Name gdapqueue -Value $obj - Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message "Started GDAP Migration for $($tenant.displayName)" -Sev 'Debug' - $results.add("Started GDAP Migration for $($tenant.displayName)") | Out-Null - } - $body = @{Results = @($Results) } - Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ - StatusCode = [HttpStatusCode]::OK - Body = $body - }) - -} diff --git a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPMigrationQueue.ps1 b/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPMigrationQueue.ps1 deleted file mode 100644 index bb59a42fed9c..000000000000 --- a/Modules/CIPPCore/Public/Entrypoints/Invoke-ExecGDAPMigrationQueue.ps1 +++ /dev/null @@ -1,99 +0,0 @@ - using namespace System.Net - - Function Invoke-ExecGDAPMigrationQueue { - <# - .FUNCTIONALITY - Entrypoint - #> - [CmdletBinding()] - param($Request, $TriggerMetadata) - - #$TenantFilter = $env:TenantID -$RoleMappings = $QueueItem.gdapRoles -$tenant = $queueitem.tenant -$Table = Get-CIPPTable -TableName 'gdapmigration' -Write-Host ($QueueItem.tenant | ConvertTo-Json -Compress) -$logRequest = @{ - status = 'Started migration' - tenant = "$($tenant.displayName)" - RowKey = "$($tenant.customerId)" - PartitionKey = 'alert' - startAt = "$((Get-Date).ToString('s'))" -} - -Add-CIPPAzDataTableEntity @Table -Entity $logRequest -Force | Out-Null - -if ($RoleMappings) { - $LogRequest['status'] = 'Step 2: Roles selected, creating new GDAP relationship.' - Add-CIPPAzDataTableEntity @Table -Entity $logRequest -Force | Out-Null -} -else { - $LogRequest['status'] = 'Migration failed at Step 2: No role mappings created.' - Add-CIPPAzDataTableEntity @Table -Entity $logRequest -Force | Out-Null - exit 1 -} -try { - $JSONBody = @{ - 'displayName' = "$((New-Guid).GUID)" - 'partner' = @{ - 'tenantId' = "$env:tenantid" - } - - 'customer' = @{ - 'displayName' = "$($tenant.displayName)" - 'tenantId' = "$($tenant.customerId)" - } - 'accessDetails' = @{ - 'unifiedRoles' = @($RoleMappings | Select-Object roleDefinitionId) - } - 'duration' = 'P730D' - } | ConvertTo-Json -Depth 5 -Compress - Write-Host $JSONBody - $MigrateRequest = New-GraphPostRequest -NoAuthCheck $True -uri 'https://traf-pcsvcadmin-prod.trafficmanager.net/CustomerServiceAdminApi/Web//v1/delegatedAdminRelationships/migrate' -type POST -body $JSONBody -verbose -tenantid $env:TenantID -scope 'https://api.partnercustomeradministration.microsoft.com/.default' - Start-Sleep -Milliseconds 100 - do { - $CheckActive = New-GraphGetRequest -NoAuthCheck $True -uri "https://traf-pcsvcadmin-prod.trafficmanager.net/CustomerServiceAdminApi/Web//v1/delegatedAdminRelationships/$($MigrateRequest.id)" -tenantid $env:TenantID -scope 'https://api.partnercustomeradministration.microsoft.com/.default' - Start-Sleep -Milliseconds 200 - } until ($CheckActive.status -eq 'Active') -} -catch { - $LogRequest['status'] = "Migration Failed. Could not create relationship: $($_.Exception.Message)" - Add-CIPPAzDataTableEntity @Table -Entity $logRequest -Force | Out-Null -} - - -if ($CheckActive.status -eq 'Active') { - $LogRequest['status'] = 'Step 3: GDAP Relationship active. Mapping groups.' - Add-CIPPAzDataTableEntity @Table -Entity $logRequest -Force | Out-Null - foreach ($role in $RoleMappings) { - try { - $Mappingbody = ConvertTo-Json -Depth 10 -InputObject @{ - 'accessContainer' = @{ - 'accessContainerId' = "$($Role.GroupId)" - 'accessContainerType' = 'securityGroup' - } - 'accessDetails' = @{ - 'unifiedRoles' = @(@{ - 'roleDefinitionId' = "$($Role.roleDefinitionId)" - }) - } - } - $RoleActiveID = New-GraphPostRequest -NoAuthCheck $True -uri "https://traf-pcsvcadmin-prod.trafficmanager.net/CustomerServiceAdminApi/Web//v1/delegatedAdminRelationships/$($MigrateRequest.id)/accessAssignments" -tenantid $env:TenantID -type POST -body $MappingBody -verbose -scope 'https://api.partnercustomeradministration.microsoft.com/.default' - Start-Sleep -Milliseconds 400 - $LogRequest['status'] = "Step 3: GDAP Relationship active. Mapping group: $($Role.GroupId)" - Add-CIPPAzDataTableEntity @Table -Entity $logRequest -Force | Out-Null - } - catch { - $LogRequest['status'] = "Migration Failed. Could not create group mapping for group $($role.GroupId): $($_.Exception.Message)" - Add-CIPPAzDataTableEntity @Table -Entity $logRequest -Force | Out-Null - exit 1 - } - #$CheckActiveRole = New-GraphGetRequest -NoAuthCheck $True -uri "https://traf-pcsvcadmin-prod.trafficmanager.net/CustomerServiceAdminApi/Web//v1/delegatedAdminRelationships/$($MigrateRequest.id)/accessAssignments/$($RoleActiveID.id)" -tenantid $env:TenantId -scope 'https://api.partnercustomeradministration.microsoft.com/.default' - } - $LogRequest['status'] = 'Migration Complete' - Add-CIPPAzDataTableEntity @Table -Entity $logRequest -Force | Out-Null - -} - - - } diff --git a/Modules/CippEntrypoints/CippEntrypoints.psm1 b/Modules/CippEntrypoints/CippEntrypoints.psm1 index 837e63e18945..f0bf7fcf2d1b 100644 --- a/Modules/CippEntrypoints/CippEntrypoints.psm1 +++ b/Modules/CippEntrypoints/CippEntrypoints.psm1 @@ -19,7 +19,7 @@ function Receive-CippHttpTrigger { function Receive-CippQueueTrigger { Param($QueueItem, $TriggerMetadata) - + Set-Location (Get-Item $PSScriptRoot).Parent.Parent.FullName $Start = (Get-Date).ToUniversalTime() $APIName = $TriggerMetadata.FunctionName Write-Host "#### Running $APINAME" From d23a90654f2e43758d4ca18dab59e74fa6866f6f Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 3 Apr 2024 17:52:23 +0200 Subject: [PATCH 18/20] Fixes to get-tenant --- .../Tenant/Invoke-ListTenants.ps1 | 2 +- .../Public/GraphHelper/Get-Tenants.ps1 | 111 +++++++++--------- 2 files changed, 55 insertions(+), 58 deletions(-) diff --git a/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Tenant/Invoke-ListTenants.ps1 b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Tenant/Invoke-ListTenants.ps1 index 0da865b0df42..3d2967edb591 100644 --- a/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Tenant/Invoke-ListTenants.ps1 +++ b/Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Tenant/Invoke-ListTenants.ps1 @@ -32,7 +32,7 @@ Function Invoke-ListTenants { try { $tenantfilter = $Request.Query.TenantFilter - $Tenants = Get-Tenants -IncludeErrors -SkipDomains -TriggerRefreshIfNeeded + $Tenants = Get-Tenants -IncludeErrors -SkipDomains if ($null -eq $TenantFilter -or $TenantFilter -eq 'null') { $TenantList = [system.collections.generic.list[object]]::new() diff --git a/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 b/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 index 64395f3c3260..bcb9b94ef9cc 100644 --- a/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 +++ b/Modules/CIPPCore/Public/GraphHelper/Get-Tenants.ps1 @@ -10,7 +10,7 @@ function Get-Tenants { [switch]$IncludeAll, [switch]$IncludeErrors, [switch]$SkipDomains, - [switch]$TriggerRefreshIfNeeded + [switch]$TriggerRefresh ) $TenantsTable = Get-CippTable -tablename 'Tenants' @@ -30,19 +30,13 @@ function Get-Tenants { } $IncludedTenantsCache = Get-CIPPAzDataTableEntity @TenantsTable -Filter $Filter - if (($IncludedTenantsCache | Measure-Object).Count -gt 0) { - try { - $LastRefresh = ($IncludedTenantsCache | Where-Object { $_.customerId } | Sort-Object LastRefresh -Descending | Select-Object -First 1).LastRefresh | Get-Date -ErrorAction Stop - } catch { $LastRefresh = $false } - } else { - $LastRefresh = $false - } - if (!$LastRefresh -or $LastRefresh -lt (Get-Date).Addhours(-24).ToUniversalTime()) { + if (($IncludedTenantsCache | Measure-Object).Count -eq 0) { + $BuildRequired = $true + } - # Query for active relationships - $GDAPRelationships = New-GraphGetRequest -uri "https://graph.microsoft.com/beta/tenantRelationships/delegatedAdminRelationships?`$filter=status eq 'active' and not startsWith(displayName,'MLT_')&`$select=customer,autoExtendDuration,endDateTime" - - # Flatten gdap relationship + if ($BuildRequired -or $TriggerRefresh.IsPresent) { + #get the full list of tenants + $GDAPRelationships = New-GraphGetRequest -uri "https://graph.microsoft.com/beta/tenantRelationships/delegatedAdminRelationships?`$filter=status eq 'active' and not startsWith(displayName,'MLT_')&`$select=customer,autoExtendDuration,endDateTime" -NoAuthCheck:$true $GDAPList = foreach ($Relationship in $GDAPRelationships) { [PSCustomObject]@{ customerId = $Relationship.customer.tenantId @@ -51,49 +45,62 @@ function Get-Tenants { relationshipEnd = $Relationship.endDateTime } } - - # Group relationships, build object for adding to tables $ActiveRelationships = $GDAPList | Where-Object { $_.customerId -notin $SkipListCache.customerId } $TenantList = $ActiveRelationships | Group-Object -Property customerId | ForEach-Object -Parallel { + Write-Host "Processing $($_.Name) to add to tenant list." Import-Module CIPPCore + Import-Module AzBobbyTables + $ExistingTenantInfo = Get-CIPPAzDataTableEntity @using:TenantsTable -Filter "PartitionKey eq 'Tenants' and RowKey eq '$($_.Name)'" + if ($ExistingTenantInfo -and $ExistingInfo.RequiresRefresh -eq $false) { + Write-Host 'Existing tenant found. We already have it cached, skipping.' + $ExistingTenantInfo + continue + } $LatestRelationship = $_.Group | Sort-Object -Property relationshipEnd | Select-Object -Last 1 $AutoExtend = ($_.Group | Where-Object { $_.autoExtend -eq $true } | Measure-Object).Count -gt 0 if (-not $SkipDomains.IsPresent) { - # Query domains to get default/initial try { + Write-Host "Getting domains for $($_.Name)." $Domains = New-GraphGetRequest -uri 'https://graph.microsoft.com/beta/domains' -tenantid $LatestRelationship.customerId -NoAuthCheck:$true -ErrorAction Stop $defaultDomainName = ($Domains | Where-Object { $_.isDefault -eq $true }).id $initialDomainName = ($Domains | Where-Object { $_.isInitial -eq $true }).id } catch { - $defaultDomainName = 'Domain Error, check permissions' - $initialDomainName = 'Domain Error, check permissions' + try { + #doing alternative method to temporarily get domains. Nightly refresh will fix this as it will be marked for renew. + $Domain = (New-GraphGetRequest -uri "https://graph.microsoft.com/v1.0/tenantRelationships/findTenantInformationByTenantId(tenantId='$($LatestRelationship.customerId)')" -NoAuthCheck:$true).defaultDomainName + $defaultDomainName = $Domain + $initialDomainName = $Domain + $RequiresRefresh = $true + + } catch { + Write-LogMessage -API 'Get-Tenants' -message "Tried adding $($LatestRelationship.customerId) to tenant list but failed to get domains - $($_.Exception.Message)" -level 'Critical' + + } + } + + [PSCustomObject]@{ + PartitionKey = 'Tenants' + RowKey = $_.Name + customerId = $_.Name + displayName = $LatestRelationship.displayName + relationshipEnd = $LatestRelationship.relationshipEnd + relationshipCount = $_.Count + defaultDomainName = $defaultDomainName + initialDomainName = $initialDomainName + hasAutoExtend = $AutoExtend + delegatedPrivilegeStatus = 'granularDelegatedAdminPrivileges' + domains = '' + Excluded = $false + ExcludeUser = '' + ExcludeDate = '' + GraphErrorCount = 0 + LastGraphError = '' + RequiresRefresh = [bool]$RequiresRefresh + LastRefresh = (Get-Date).ToUniversalTime() } - } else { - $defaultDomainName = 'Domain Error, skipped' - $initialDomainName = 'Domain Error, skipped' - } - [PSCustomObject]@{ - PartitionKey = 'Tenants' - RowKey = $_.Name - customerId = $_.Name - displayName = $LatestRelationship.displayName - relationshipEnd = $LatestRelationship.relationshipEnd - relationshipCount = $_.Count - defaultDomainName = $defaultDomainName - initialDomainName = $initialDomainName - hasAutoExtend = $AutoExtend - delegatedPrivilegeStatus = 'granularDelegatedAdminPrivileges' - domains = '' - Excluded = $false - ExcludeUser = '' - ExcludeDate = '' - GraphErrorCount = 0 - LastGraphError = '' - LastRefresh = (Get-Date).ToUniversalTime() } } - $IncludedTenantsCache = [system.collections.generic.list[object]]::new() if ($env:PartnerTenantAvailable) { # Add partner tenant if env is set @@ -116,23 +123,13 @@ function Get-Tenants { if ($Tenant.defaultDomainName -eq 'Invalid' -or !$Tenant.defaultDomainName) { continue } $IncludedTenantsCache.Add($Tenant) | Out-Null } + } - if ($IncludedTenantsCache) { - $TenantsTable.Force = $true - Add-CIPPAzDataTableEntity @TenantsTable -Entity $IncludedTenantsCache - } - - if ($TriggerRefreshIfNeeded.IsPresent -and -not $SkipDomains.IsPresent) { - Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ - StatusCode = [HttpStatusCode]::OK - Body = $GraphRequest - }) - $InputObject = [PSCustomObject]@{ - OrchestratorName = 'UpdateTenantsOrchestrator' - Batch = @(@{'FunctionName' = 'UpdateTenants' }) - } - #Write-Host ($InputObject | ConvertTo-Json) - $InstanceId = Start-NewOrchestration -FunctionName 'CIPPOrchestrator' -InputObject ($InputObject | ConvertTo-Json -Depth 5) + if ($IncludedTenantsCache) { + Add-CIPPAzDataTableEntity @TenantsTable -Entity $IncludedTenantsCache -Force + $CurrentTenants = Get-CIPPAzDataTableEntity @TenantsTable -Filter "PartitionKey eq 'Tenants' and Excluded eq false" + $CurrentTenants | Where-Object { $_.customerId -notin $IncludedTenantsCache.customerId } | ForEach-Object { + Remove-AzDataTableEntity -Context $TenantsTable -Entity $_ -Force } } return ($IncludedTenantsCache | Where-Object { $null -ne $_.defaultDomainName -and ($_.defaultDomainName -notmatch 'Domain Error' -or $IncludeAll.IsPresent) } | Sort-Object -Property displayName) From 032f44b645f4e4027b38356ffcc5504d957e7b2f Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 3 Apr 2024 18:05:58 +0200 Subject: [PATCH 19/20] add trigger refresh to nightly --- UpdatePermissions/run.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UpdatePermissions/run.ps1 b/UpdatePermissions/run.ps1 index 1c6b98f6ee92..77290175242e 100644 --- a/UpdatePermissions/run.ps1 +++ b/UpdatePermissions/run.ps1 @@ -2,7 +2,7 @@ param($Timer) try { - $Tenants = Get-Tenants -IncludeAll -SkipDomains | Where-Object { $_.customerId -ne $env:TenantId -and $_.Excluded -eq $false } | ForEach-Object { $_ | Add-Member -NotePropertyName FunctionName -NotePropertyValue 'UpdatePermissionsQueue'; $_ } + $Tenants = Get-Tenants -IncludeAll -TriggerRefresh | Where-Object { $_.customerId -ne $env:TenantId -and $_.Excluded -eq $false } | ForEach-Object { $_ | Add-Member -NotePropertyName FunctionName -NotePropertyValue 'UpdatePermissionsQueue'; $_ } if (($Tenants | Measure-Object).Count -gt 0) { $InputObject = [PSCustomObject]@{ From d352ef29107b1431e91f2806109d15f933c551c4 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 3 Apr 2024 12:28:31 -0400 Subject: [PATCH 20/20] Update version_latest.txt --- version_latest.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version_latest.txt b/version_latest.txt index 8ae03c11904c..6ffbe8ba8ebd 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1 +1 @@ -5.4.2 +5.4.3