Skip to content

Commit 137ba04

Browse files
authored
Merge pull request #869 from KelvinTegelaar/dev
[pull] dev from KelvinTegelaar:dev
2 parents af6913e + 6e216e6 commit 137ba04

7 files changed

Lines changed: 63 additions & 61 deletions

File tree

Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ExecTenantGroup.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ function Invoke-ExecTenantGroup {
112112
$Adds.Add('Added member {0}' -f $member.label)
113113
}
114114

115-
if ($CurrentMembers) {
115+
if ($CurrentMembers -and $members) {
116116
foreach ($CurrentMember in $CurrentMembers) {
117117
if ($members.value -notcontains $CurrentMember.customerId) {
118118
Remove-AzDataTableEntity @MembersTable -Entity $CurrentMember -Force

Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-AddUser.ps1

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,20 +58,24 @@ function Invoke-AddUser {
5858
} else {
5959
try {
6060
$CreationResults = New-CIPPUserTask -UserObj $UserObj -APIName $APIName -Headers $Headers
61+
$ResultsList = [System.Collections.Generic.List[object]]::new()
62+
$ResultsList.Add($CreationResults.Results[0])
63+
$ResultsList.Add(@{
64+
'resultText' = $CreationResults.Results[1]
65+
'copyField' = $CreationResults.Username
66+
'state' = 'success'
67+
})
68+
$ResultsList.Add(@{
69+
'resultText' = $CreationResults.Results[2]
70+
'copyField' = $CreationResults.password
71+
'state' = 'success'
72+
})
73+
# Append any additional results (licenses, groups, aliases, manager, etc.)
74+
foreach ($AdditionalResult in $CreationResults.Results | Select-Object -Skip 3) {
75+
$ResultsList.Add($AdditionalResult)
76+
}
6177
$body = [pscustomobject] @{
62-
'Results' = @(
63-
$CreationResults.Results[0],
64-
@{
65-
'resultText' = $CreationResults.Results[1]
66-
'copyField' = $CreationResults.Username
67-
'state' = 'success'
68-
},
69-
@{
70-
'resultText' = $CreationResults.Results[2]
71-
'copyField' = $CreationResults.password
72-
'state' = 'success'
73-
}
74-
)
78+
'Results' = $ResultsList
7579
'CopyFrom' = @{
7680
'Success' = $CreationResults.CopyFrom.Success
7781
'Error' = $CreationResults.CopyFrom.Error

Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Tenant/Administration/Tenant/Invoke-EditTenant.ps1

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,13 @@ function Invoke-EditTenant {
4545
}
4646

4747
# Update tenant groups
48+
$GroupTable = Get-CippTable -TableName 'TenantGroups'
49+
$StaticGroups = Get-CIPPAzDataTableEntity @GroupTable -Filter "PartitionKey eq 'TenantGroup' and GroupType ne 'dynamic'"
50+
$StaticGroupIds = $StaticGroups.RowKey
4851
$CurrentGroupMemberships = Get-CIPPAzDataTableEntity @GroupMembersTable -Filter "customerId eq '$customerId'"
4952
foreach ($Group in $tenantGroups) {
53+
# Only allow adding to static groups; dynamic group membership is managed by the orchestrator
54+
if ($StaticGroupIds -notcontains $Group.groupId) { continue }
5055
$GroupEntity = $CurrentGroupMemberships | Where-Object { $_.GroupId -eq $Group.groupId }
5156
if (!$GroupEntity) {
5257
$GroupEntity = @{
@@ -56,33 +61,41 @@ function Invoke-EditTenant {
5661
customerId = $customerId
5762
}
5863
Add-CIPPAzDataTableEntity @GroupMembersTable -Entity $GroupEntity -Force
64+
Write-LogMessage -headers $Headers -API $APINAME -tenant $Tenant.defaultDomainName -TenantId $Tenant.customerId -message "Added tenant to group '$($Group.groupName)'" -Sev 'Info'
5965
}
6066
}
6167

62-
# Remove any groups that are no longer selected
63-
foreach ($Group in $CurrentGroupMemberships) {
64-
if ($tenantGroups.GroupId -notcontains $Group.GroupId) {
65-
Remove-AzDataTableEntity @GroupMembersTable -Entity $Group
68+
# Remove any static groups that are no longer selected (dynamic groups are managed by the orchestrator)
69+
if ($tenantGroups) {
70+
foreach ($Group in $CurrentGroupMemberships) {
71+
if ($StaticGroupIds -contains $Group.GroupId -and $tenantGroups.GroupId -notcontains $Group.GroupId) {
72+
$GroupName = ($StaticGroups | Where-Object { $_.RowKey -eq $Group.GroupId }).Name
73+
Remove-AzDataTableEntity @GroupMembersTable -Entity $Group
74+
Write-LogMessage -headers $Headers -API $APINAME -tenant $Tenant.defaultDomainName -TenantId $Tenant.customerId -message "Removed tenant from group '$GroupName'" -Sev 'Info'
75+
}
6676
}
6777
}
6878
$DomainBasedEntries = Get-CIPPAzDataTableEntity @GroupMembersTable -Filter "customerId eq '$($Tenant.defaultDomainName)'"
69-
if ($DomainBasedEntries) {
70-
foreach ($Entry in $DomainBasedEntries) {
71-
try {
72-
# Add corrected GUID-based entry using the actual GUID
73-
$NewEntry = @{
74-
PartitionKey = 'Member'
75-
RowKey = '{0}-{1}' -f $Entry.GroupId, $Tenant.customerId
76-
GroupId = $Entry.GroupId
77-
customerId = $Tenant.customerId
78-
}
79-
Add-CIPPAzDataTableEntity @GroupMembersTable -Entity $NewEntry -Force
80-
Remove-AzDataTableEntity @GroupMembersTable -Entity $Entry
81-
} catch {
82-
Write-Host "Error migrating entry: $($_.Exception.Message)"
79+
if ($DomainBasedEntries) {
80+
foreach ($Entry in $DomainBasedEntries) {
81+
try {
82+
# Add corrected GUID-based entry using the actual GUID
83+
$NewEntry = @{
84+
PartitionKey = 'Member'
85+
RowKey = '{0}-{1}' -f $Entry.GroupId, $Tenant.customerId
86+
GroupId = $Entry.GroupId
87+
customerId = $Tenant.customerId
8388
}
89+
Add-CIPPAzDataTableEntity @GroupMembersTable -Entity $NewEntry -Force
90+
Remove-AzDataTableEntity @GroupMembersTable -Entity $Entry
91+
} catch {
92+
Write-Host "Error migrating entry: $($_.Exception.Message)"
8493
}
8594
}
95+
}
96+
97+
# Bust the TenantGroups cache so subsequent calls reflect the changes made above
98+
Get-TenantGroups -SkipCache | Out-Null
8699

87100
$response = @{
88101
state = 'success'
@@ -93,7 +106,7 @@ function Invoke-EditTenant {
93106
Body = $response
94107
})
95108
} catch {
96-
Write-LogMessage -headers $Headers -tenant $customerId -API $APINAME -message "Edit Tenant failed. The error is: $($_.Exception.Message)" -Sev 'Error'
109+
Write-LogMessage -headers $Headers -tenant $Tenant.defaultDomainName -TenantId $Tenant.customerId -API $APINAME -message "Edit Tenant failed. The error is: $($_.Exception.Message)" -Sev 'Error'
97110
$response = @{
98111
state = 'error'
99112
resultText = $_.Exception.Message

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ function Start-CIPPOrchestrator {
6868
Parameters = @{
6969
BatchId = $BatchGuid
7070
}
71-
}
71+
} -Force
7272
}
7373
try {
7474
$InstanceId = Start-NewOrchestration -FunctionName 'CIPPOrchestrator' -InputObject ($InputObject | ConvertTo-Json -Depth 10 -Compress)
@@ -131,7 +131,7 @@ function Start-CIPPOrchestrator {
131131
$InputObject.PSObject.Properties.Remove('Batch')
132132

133133
# Add queue function reference to retrieve batch items in orchestrator
134-
$InputObject.QueueFunction = @{
134+
$InputObject | Add-Member -MemberType NoteProperty -Force -Name QueueFunction -Value @{
135135
FunctionName = 'OrchestratorBatchItems'
136136
Parameters = @{
137137
BatchId = $Guid

Modules/CIPPCore/Public/New-CIPPUserTask.ps1

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,6 @@ function New-CIPPUserTask {
2020

2121
try {
2222
if ($UserObj.licenses.value) {
23-
# Filter out licenses with no available units
24-
try {
25-
$LicenseOverview = Get-CIPPLicenseOverview -TenantFilter $UserObj.tenantFilter
26-
$FilteredLicenses = @(foreach ($LicenseId in $UserObj.licenses.value) {
27-
$Sku = $LicenseOverview | Where-Object { $_.skuId -eq $LicenseId }
28-
if ($Sku -and [int]$Sku.availableUnits -le 0) {
29-
$null = $Results.Add("Skipped license $($Sku.License): no available units")
30-
Write-LogMessage -headers $Headers -API $APIName -tenant $UserObj.tenantFilter -message "Skipped license $($Sku.License) for $($CreationResults.Username): no available units" -Sev 'Warn'
31-
} else {
32-
$LicenseId
33-
}
34-
})
35-
$UserObj.licenses = [PSCustomObject]@{ value = $FilteredLicenses }
36-
} catch {
37-
Write-Warning "Failed to check available licenses: $($_.Exception.Message)"
38-
}
3923
if ($UserObj.sherwebLicense.value) {
4024
$null = Set-SherwebSubscription -Headers $Headers -TenantFilter $UserObj.tenantFilter -SKU $UserObj.sherwebLicense.value -Add 1
4125
$null = $Results.Add('Added Sherweb License, scheduling assignment')
@@ -84,17 +68,14 @@ function New-CIPPUserTask {
8468
$CopyFrom.Error | ForEach-Object { $Results.Add($_) }
8569
}
8670

87-
if ($UserObj.groupMemberships -and ($UserObj.groupMemberships | Measure-Object).Count -gt 0) {
88-
Write-Host "Adding user to $(@($UserObj.groupMemberships).Count) groups from template"
89-
foreach ($Group in $UserObj.groupMemberships) {
71+
# Add to groups
72+
if ($UserObj.AddToGroups) {
73+
$UserObj.AddToGroups | ForEach-Object {
9074
try {
91-
$GroupType = if ($Group.groupTypes -contains 'Unified') { 'Microsoft 365' }
92-
elseif ($Group.mailEnabled) { 'Distribution list' }
93-
else { 'Security' }
94-
Add-CIPPGroupMember -Headers $Headers -GroupType $GroupType -GroupId $Group.id -Member $CreationResults.Username -TenantFilter $UserObj.tenantFilter -APIName $APIName
95-
$Results.Add("Added user to group from template: $($Group.displayName)")
75+
$AddMemberResult = Add-CIPPGroupMember -Headers $Headers -GroupType $_.addedFields.groupType -GroupId $_.value -Member @($CreationResults.Username) -TenantFilter $UserObj.tenantFilter
76+
$Results.Add($AddMemberResult)
9677
} catch {
97-
$Results.Add("Failed to add to group $($Group.displayName): $($_.Exception.Message)")
78+
$Results.Add("Failed to add to group $($_.label): $_")
9879
}
9980
}
10081
}

Modules/CIPPCore/Public/TenantGroups/Get-TenantGroups.ps1

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ function Get-TenantGroups {
144144
Id = $Group.RowKey
145145
Name = $Group.Name
146146
Description = $Group.Description
147+
GroupType = $Group.GroupType ?? 'static'
147148
})
148149
}
149150
}

Modules/CIPPCore/Public/TenantGroups/Update-CIPPDynamicTenantGroups.ps1

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ function Update-CIPPDynamicTenantGroups {
143143

144144
Write-Information "Found $($MatchingTenants.Count) matching tenants for group '$($Group.Name)'"
145145

146-
$CurrentMembers = Get-CIPPAzDataTableEntity @MembersTable -Filter "PartitionKey eq 'Member' and GroupId eq '$($Group.RowKey)'"
146+
$CurrentMembers = @($AllGroupMembers | Where-Object { $_.GroupId -eq $Group.RowKey })
147147
$CurrentMemberIds = $CurrentMembers.customerId
148148
$NewMemberIds = $MatchingTenants.customerId
149149

@@ -184,6 +184,9 @@ function Update-CIPPDynamicTenantGroups {
184184

185185
Write-LogMessage -API 'TenantGroups' -message "Dynamic tenant group update completed. Groups processed: $GroupsProcessed, Members added: $TotalMembersAdded, Members removed: $TotalMembersRemoved" -sev Info
186186

187+
# Bust the TenantGroups cache so subsequent calls reflect the changes made above
188+
Get-TenantGroups -SkipCache | Out-Null
189+
187190
return @{
188191
MembersAdded = $TotalMembersAdded
189192
MembersRemoved = $TotalMembersRemoved

0 commit comments

Comments
 (0)