Skip to content

Commit

Permalink
Merge pull request #38 from KelvinTegelaar/master
Browse files Browse the repository at this point in the history
[pull] master from KelvinTegelaar:master
  • Loading branch information
pull[bot] authored Jul 12, 2024
2 parents 5515e47 + c82a76a commit 26eb9d5
Show file tree
Hide file tree
Showing 14 changed files with 95 additions and 64 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ function Push-GetTenantDomains {
Param($Item)
$DomainTable = Get-CippTable -tablename 'Domains'
$Filter = "PartitionKey eq 'TenantDomains' and TenantGUID eq '{0}'" -f $Item.TenantGUID
$Domains = Get-CIPPAzDataTableEntity @DomainTable -Filter $Filter -Property RowKey | Select-Object RowKey, @{n = 'FunctionName'; exp = { 'DomainAnalyserDomain' } }
$Domains = Get-CIPPAzDataTableEntity @DomainTable -Filter $Filter -Property PartitionKey, RowKey | Select-Object RowKey, @{n = 'FunctionName'; exp = { 'DomainAnalyserDomain' } }
return @($Domains)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ function Push-GetPendingWebhooks {
#>
Param($Item)
$Table = Get-CIPPTable -TableName WebhookIncoming
$Webhooks = Get-CIPPAzDataTableEntity @Table -Property RowKey, FunctionName -First 10000
$Webhooks = Get-CIPPAzDataTableEntity @Table -Property PartitionKey, RowKey, FunctionName -First 10000
$WebhookCount = ($Webhooks | Measure-Object).Count
$Message = 'Processing {0} webhooks' -f $WebhookCount
Write-LogMessage -API 'Webhooks' -message $Message -sev Info
return $Webhooks
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ function Invoke-ExecDurableFunctions {
if ($Request.Query.PartitionKey) {
$HistoryTable = Get-CippTable -TableName ('{0}History' -f $FunctionName)
$Filter = "PartitionKey eq '{0}'" -f $Request.Query.PartitionKey
$History = Get-CippAzDataTableEntity @HistoryTable -Filter $Filter -Property RowKey, Timestamp, EventType, Name, IsPlayed, OrchestrationStatus | Select-Object * -ExcludeProperty ETag
$History = Get-CippAzDataTableEntity @HistoryTable -Filter $Filter -Property PartitionKey, RowKey, Timestamp, EventType, Name, IsPlayed, OrchestrationStatus | Select-Object * -ExcludeProperty ETag

$Body = [PSCustomObject]@{
Results = @($History)
Expand Down Expand Up @@ -173,4 +173,4 @@ function Invoke-ExecDurableFunctions {
StatusCode = [HttpStatusCode]::OK
Body = $Body
})
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ Function Invoke-ExecExtensionsConfig {
}
}
if ($Request.Body.$APIKey.PSObject.Properties -notcontains 'APIKey') {
$Request.Body.$APIKey | Add-Member -MemberType NoteProperty -Name APIKey -Value 'SentToKeyVault' -PassThru
$Request.Body.$APIKey | Add-Member -MemberType NoteProperty -Name APIKey -Value 'SentToKeyVault'
} else {
$Request.Body.$APIKey.APIKey = 'SentToKeyVault'
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ Function Invoke-AddGroupTemplate {
#>
[CmdletBinding()]
param($Request, $TriggerMetadata)

$APIName = $TriggerMetadata.FunctionName
Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message 'Accessed this API' -Sev 'Debug'

Expand All @@ -36,8 +35,7 @@ Function Invoke-AddGroupTemplate {
Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message "Created Group template named $($Request.body.displayname) with GUID $GUID" -Sev 'Debug'

$body = [pscustomobject]@{'Results' = 'Successfully added template' }
}
catch {
} catch {
Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message "Group Template Creation failed: $($_.Exception.Message)" -Sev 'Error'
$body = [pscustomobject]@{'Results' = "Group Template Creation failed: $($_.Exception.Message)" }
}
Expand Down
54 changes: 31 additions & 23 deletions Modules/CIPPCore/Public/Get-CIPPAzDatatableEntity.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -17,47 +17,55 @@ function Get-CIPPAzDataTableEntity {
foreach ($entity in $Results) {
if ($entity.OriginalEntityId) {
$entityId = $entity.OriginalEntityId
if (-not $mergedResults.ContainsKey($entityId)) {
$mergedResults[$entityId] = @{
$partitionKey = $entity.PartitionKey
if (-not $mergedResults.ContainsKey($partitionKey)) {
$mergedResults[$partitionKey] = @{}
}
if (-not $mergedResults[$partitionKey].ContainsKey($entityId)) {
$mergedResults[$partitionKey][$entityId] = @{
Parts = New-Object 'System.Collections.ArrayList'
}
}
$mergedResults[$entityId]['Parts'].Add($entity) > $null
$mergedResults[$partitionKey][$entityId]['Parts'].Add($entity) > $null
} else {
$mergedResults[$entity.RowKey] = @{
$partitionKey = $entity.PartitionKey
if (-not $mergedResults.ContainsKey($partitionKey)) {
$mergedResults[$partitionKey] = @{}
}
$mergedResults[$partitionKey][$entity.RowKey] = @{
Entity = $entity
Parts = New-Object 'System.Collections.ArrayList'
}
}
}

# Second pass: Reassemble entities from parts
$finalResults = @()
foreach ($entityId in $mergedResults.Keys) {
$entityData = $mergedResults[$entityId]
if ($entityData.Parts.Count -gt 0) {
$fullEntity = [PSCustomObject]@{}
$parts = $entityData.Parts | Sort-Object PartIndex
foreach ($part in $parts) {
foreach ($key in $part.PSObject.Properties.Name) {
if ($key -notin @('OriginalEntityId', 'PartIndex', 'PartitionKey', 'RowKey', 'Timestamp')) {
if ($fullEntity.PSObject.Properties[$key]) {
$fullEntity | Add-Member -MemberType NoteProperty -Name $key -Value ($fullEntity.$key + $part.$key) -Force
} else {
$fullEntity | Add-Member -MemberType NoteProperty -Name $key -Value $part.$key
foreach ($partitionKey in $mergedResults.Keys) {
foreach ($entityId in $mergedResults[$partitionKey].Keys) {
$entityData = $mergedResults[$partitionKey][$entityId]
if ($entityData.Parts.Count -gt 0) {
$fullEntity = [PSCustomObject]@{}
$parts = $entityData.Parts | Sort-Object PartIndex
foreach ($part in $parts) {
foreach ($key in $part.PSObject.Properties.Name) {
if ($key -notin @('OriginalEntityId', 'PartIndex', 'PartitionKey', 'RowKey', 'Timestamp')) {
if ($fullEntity.PSObject.Properties[$key]) {
$fullEntity | Add-Member -MemberType NoteProperty -Name $key -Value ($fullEntity.$key + $part.$key) -Force
} else {
$fullEntity | Add-Member -MemberType NoteProperty -Name $key -Value $part.$key
}
}
}
}
$fullEntity | Add-Member -MemberType NoteProperty -Name 'PartitionKey' -Value $parts[0].PartitionKey -Force
$fullEntity | Add-Member -MemberType NoteProperty -Name 'RowKey' -Value $entityId -Force
$finalResults = $finalResults + @($fullEntity)
} else {
$finalResults = $finalResults + @($entityData.Entity)
}
$fullEntity | Add-Member -MemberType NoteProperty -Name 'PartitionKey' -Value $parts[0].PartitionKey -Force
$fullEntity | Add-Member -MemberType NoteProperty -Name 'RowKey' -Value $entityId -Force
$finalResults = $finalResults + @($fullEntity)
} else {
$finalResults = $finalResults + @($entityData.Entity)
}
}

# Third pass: Process split properties and remerge them
foreach ($entity in $finalResults) {
if ($entity.SplitOverProps) {
$splitInfoList = $entity.SplitOverProps | ConvertFrom-Json
Expand Down
3 changes: 2 additions & 1 deletion Modules/CIPPCore/Public/GraphHelper/New-ExoRequest.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,15 @@ function New-ExoRequest ($tenantid, $cmdlet, $cmdParams, $useSystemMailbox, $Anc
if ($cmdparams.anr) { $Anchor = $cmdparams.anr }
if ($cmdparams.User) { $Anchor = $cmdparams.User }
if ($cmdparams.mailbox) { $Anchor = $cmdparams.mailbox }
if ($cmdlet -in 'Set-AdminAuditLogConfig', 'Get-AdminAuditLogConfig', 'Enable-OrganizationCustomization', 'Get-OrganizationConfig') { $anchor = "UPN:SystemMailbox{8cc370d3-822a-4ab8-a926-bb94bd0641a9}@$($OnMicrosoft)" }
if (!$Anchor -or $useSystemMailbox) {
if (!$Tenant.initialDomainName -or $Tenant.initialDomainName -notlike '*onmicrosoft.com*') {
$OnMicrosoft = (New-GraphGetRequest -uri 'https://graph.microsoft.com/beta/domains?$top=999' -tenantid $tenantid -NoAuthCheck $NoAuthCheck | Where-Object -Property isInitial -EQ $true).id
} else {
$OnMicrosoft = $Tenant.initialDomainName
}
$anchor = "UPN:SystemMailbox{bb558c35-97f1-4cb9-8ff7-d53741dc928c}@$($OnMicrosoft)"
if ($cmdlet -in 'Set-AdminAuditLogConfig', 'Get-AdminAuditLogConfig', 'Enable-OrganizationCustomization', 'Get-OrganizationConfig') { $anchor = "UPN:SystemMailbox{8cc370d3-822a-4ab8-a926-bb94bd0641a9}@$($OnMicrosoft)" }

}
#if the anchor is a GUID, try looking up the user.
if ($Anchor -match '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$') {
Expand Down
22 changes: 18 additions & 4 deletions Modules/CIPPCore/Public/GraphHelper/Write-CippFunctionStats.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,23 @@ function Write-CippFunctionStats {
[string]$ErrorMsg = ''
)
try {
$Start = Get-Date $Start
$End = Get-Date $End

$Table = Get-CIPPTable -tablename CippFunctionStats
$RowKey = [string](New-Guid).Guid
$TimeSpan = New-TimeSpan -Start $Start -End $End
$Duration = [int]$TimeSpan.TotalSeconds
$DurationMS = [int]$TimeSpan.TotalMilliseconds

# if datetime is local, convert to UTC
if ($Start.Kind -eq 'Local') {
$Start = $Start.ToUniversalTime()
}
if ($End.Kind -eq 'Local') {
$End = $End.ToUniversalTime()
}

$StatEntity = @{}
# Flatten data to json string
$StatEntity.PartitionKey = $FunctionType
Expand All @@ -28,13 +39,16 @@ function Write-CippFunctionStats {
$StatEntity.ErrorMsg = $ErrorMsg
$Entity = [PSCustomObject]$Entity
foreach ($Property in $Entity.PSObject.Properties.Name) {
if ($Entity.$Property.GetType().Name -in ('Hashtable', 'PSCustomObject', 'OrderedHashtable')) {
$StatEntity.$Property = [string]($Entity.$Property | ConvertTo-Json -Compress)
} elseif ($Property -notin ('ETag', 'RowKey', 'PartitionKey', 'Timestamp', 'LastRefresh')) {
$StatEntity.$Property = $Entity.$Property
if ($Entity.$Property) {
if ($Entity.$Property.GetType().Name -in ('Hashtable', 'PSCustomObject', 'OrderedHashtable')) {
$StatEntity.$Property = [string]($Entity.$Property | ConvertTo-Json -Compress)
} elseif ($Property -notin ('ETag', 'RowKey', 'PartitionKey', 'Timestamp', 'LastRefresh')) {
$StatEntity.$Property = $Entity.$Property
}
}
}
$StatEntity = [PSCustomObject]$StatEntity

Add-CIPPAzDataTableEntity @Table -Entity $StatEntity -Force
} catch {
Write-Host "Exception logging stats $($_.Exception.Message)"
Expand Down
39 changes: 21 additions & 18 deletions Modules/CIPPCore/Public/Set-CIPPUserJITAdminProperties.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,28 @@ function Set-CIPPUserJITAdminProperties {
$Expiration,
[switch]$Clear
)

$Schema = Get-CIPPSchemaExtensions | Where-Object { $_.id -match '_cippUser' }
if ($Clear.IsPresent) {
$Body = [PSCustomObject]@{
"$($Schema.id)" = @{
jitAdminEnabled = $null
jitAdminExpiration = $null
try {
$Schema = Get-CIPPSchemaExtensions | Where-Object { $_.id -match '_cippUser' }
if ($Clear.IsPresent) {
$Body = [PSCustomObject]@{
"$($Schema.id)" = @{
jitAdminEnabled = $null
jitAdminExpiration = $null
}
}
}
} else {
$Body = [PSCustomObject]@{
"$($Schema.id)" = @{
jitAdminEnabled = $Enabled.IsPresent
jitAdminExpiration = $Expiration.ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')
} else {
$Body = [PSCustomObject]@{
"$($Schema.id)" = @{
jitAdminEnabled = $Enabled.IsPresent
jitAdminExpiration = $Expiration.ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')
}
}
}
}

$Json = ConvertTo-Json -Depth 5 -InputObject $Body
Write-Information $Json
New-GraphPOSTRequest -type PATCH -Uri "https://graph.microsoft.com/beta/users/$UserId" -Body $Json -tenantid $TenantFilter | Out-Null
}
$Json = ConvertTo-Json -Depth 5 -InputObject $Body
Write-Information $Json
New-GraphPOSTRequest -type PATCH -Uri "https://graph.microsoft.com/beta/users/$UserId" -Body $Json -tenantid $TenantFilter | Out-Null
} catch {
Write-Information "Error setting JIT Admin properties: $($_.Exception.Message) - $($_.InvocationInfo.PositionMessage)"
}
}
10 changes: 6 additions & 4 deletions Modules/CippEntrypoints/CippEntrypoints.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@ function Receive-CippHttpTrigger {
$Request,
$TriggerMetadata
)

# Convert the request to a PSCustomObject because the httpContext is case sensitive since 7.3
$Request = $Request | ConvertTo-Json -Depth 100 | ConvertFrom-Json
Set-Location (Get-Item $PSScriptRoot).Parent.Parent.FullName
$FunctionName = 'Invoke-{0}' -f $Request.Params.CIPPEndpoint
Write-Host "Function: $($Request.Params.CIPPEndpoint)"

$HttpTrigger = @{
Request = $Request
Request = [pscustomobject]($Request)
TriggerMetadata = $TriggerMetadata
}

Expand Down Expand Up @@ -43,6 +44,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
Expand Down Expand Up @@ -144,7 +146,7 @@ function Receive-CippOrchestrationTrigger {
function Receive-CippActivityTrigger {
Param($Item)
try {
$Start = (Get-Date).ToUniversalTime()
$Start = Get-Date
Set-Location (Get-Item $PSScriptRoot).Parent.Parent.FullName

if ($Item.QueueId) {
Expand Down Expand Up @@ -188,7 +190,7 @@ function Receive-CippActivityTrigger {
}
}

$End = (Get-Date).ToUniversalTime()
$End = Get-Date

try {
$Stats = @{
Expand Down
2 changes: 1 addition & 1 deletion Scheduler_GetWebhooks/run.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ param($Timer)
try {

$webhookTable = Get-CIPPTable -tablename webhookTable
$Webhooks = Get-CIPPAzDataTableEntity @webhookTable -Property RowKey
$Webhooks = Get-CIPPAzDataTableEntity @webhookTable -Property PartitionKey, RowKey
if (($Webhooks | Measure-Object).Count -eq 0) {
Write-Host 'No webhook subscriptions found. Exiting.'
return
Expand Down
2 changes: 1 addition & 1 deletion Scheduler_UserTasks/function.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"bindings": [
{
"name": "Timer",
"schedule": "0 */5 * * * *",
"schedule": "0 */15 * * * *",
"direction": "in",
"type": "timerTrigger"
},
Expand Down
7 changes: 6 additions & 1 deletion Scheduler_UserTasks/run.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@ foreach ($task in $tasks) {
}
}
if (($Batch | Measure-Object).Count -gt 0) {
# Create queue entry
$Queue = New-CippQueueEntry -Name 'Scheduled Tasks' -TotalTasks ($Batch | Measure-Object).Count
$QueueId = $Queue.RowKey
$Batch = $Batch | Select-Object *, @{Name = 'QueueId'; Expression = { $QueueId } }, @{Name = 'QueueName'; Expression = { '{0} - {1}' -f $_.TaskInfo.Name, ($_.TaskInfo.Tenant -ne 'AllTenants' ? $_.TaskInfo.Tenant : $_.Parameters.TenantFilter) } }

$InputObject = [PSCustomObject]@{
OrchestratorName = 'UserTaskOrchestrator'
Batch = @($Batch)
Expand All @@ -66,4 +71,4 @@ if (($Batch | Measure-Object).Count -gt 0) {
$InstanceId = Start-NewOrchestration -FunctionName 'CIPPOrchestrator' -InputObject ($InputObject | ConvertTo-Json -Depth 10 -Compress)

Write-Host "Started orchestration with ID = '$InstanceId'"
}
}
2 changes: 1 addition & 1 deletion version_latest.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
6.0.2
6.0.3

0 comments on commit 26eb9d5

Please sign in to comment.