Skip to content

Commit e0fcf7c

Browse files
Fix group based removal #5673
1 parent 941e521 commit e0fcf7c

2 files changed

Lines changed: 29 additions & 9 deletions

File tree

Modules/CIPPCore/Public/Remove-CIPPGroups.ps1

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ function Remove-CIPPGroups {
6767
$IsDynamic = -not [string]::IsNullOrWhiteSpace($GroupInfo.membershipRule)
6868

6969
if ($IsLicensed) {
70-
$Results.Add("Could not remove $Username from group '$GroupName' because it has assigned licenses. These groups are removed during the license removal step.")
71-
Write-LogMessage -headers $Headers -API $APIName -message "Could not remove $Username from group '$GroupName' because it has assigned licenses. These groups are removed during the license removal step." -sev 'Warn' -tenant $TenantFilter
70+
$Results.Add("Skipping removal of $Username from group '$GroupName' because it has assigned licenses. This group will be handled during the license removal step.")
71+
Write-LogMessage -headers $Headers -API $APIName -message "Skipping removal of $Username from group '$GroupName' because it has assigned licenses. This group will be handled during the license removal step." -sev 'Info' -tenant $TenantFilter
7272
} elseif ($IsDynamic) {
7373
$Results.Add("Error: Could not remove $Username from group '$GroupName' because it is a Dynamic Group.")
7474
Write-LogMessage -headers $Headers -API $APIName -message "Could not remove $Username from group '$GroupName' because it is a Dynamic Group." -sev 'Warn' -tenant $TenantFilter

Modules/CIPPCore/Public/Remove-CIPPLicense.ps1

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ function Remove-CIPPLicense {
5252
Write-Information 'Removing user from groups with licenses'
5353
$RemoveResults = New-GraphBulkRequest -tenantid $tenantFilter -requests @($RemoveRequests)
5454
Write-Information ($RemoveResults | ConvertTo-Json -Depth 5)
55-
$RemoveResults | ForEach-Object {
56-
$Group = $GroupMemberships | Where-Object { $_.id -eq $_.id }
57-
$GroupName = $Group | Select-Object -ExpandProperty displayName
55+
foreach ($Result in $RemoveResults) {
56+
$Group = $LicenseGroups | Where-Object { $_.id -eq $Result.id }
57+
$GroupName = $Group.displayName
5858

59-
if ($_.status -eq 204) {
59+
if ($Result.status -eq 204) {
6060
Write-LogMessage -headers $Headers -API $APIName -message "Removed $($User.displayName) from license group $GroupName" -Sev 'Info' -tenant $TenantFilter
6161
"Removed $($User.displayName) from license group $GroupName"
6262
} else {
@@ -67,7 +67,20 @@ function Remove-CIPPLicense {
6767
}
6868

6969
if (!$username) { $username = $User.userPrincipalName }
70-
$CurrentLicenses = $User.assignedlicenses.skuid
70+
71+
# Re-fetch user to get current license state after group removals
72+
$User = New-GraphGetRequest -uri "https://graph.microsoft.com/beta/users/$($userid)?`$select=id,displayName,userPrincipalName,assignedLicenses,licenseAssignmentStates" -tenantid $tenantFilter
73+
74+
# Separate directly-assigned vs group-inherited licenses
75+
$DirectLicenseSkuIds = @(($User.licenseAssignmentStates | Where-Object { $null -eq $_.assignedByGroup -and $_.state -eq 'Active' }).skuId | Select-Object -Unique)
76+
$GroupLicenseSkuIds = @(($User.licenseAssignmentStates | Where-Object { $null -ne $_.assignedByGroup -and $_.state -eq 'Active' }).skuId | Select-Object -Unique)
77+
78+
if ($GroupLicenseSkuIds) {
79+
$GroupLicenseNames = $(($ConvertTable | Where-Object { $_.guid -in $GroupLicenseSkuIds }).'Product_Display_Name' | Sort-Object -Unique) -join ', '
80+
Write-LogMessage -headers $Headers -API $APIName -message "Licenses inherited from groups for $($username) will be removed when group membership changes are processed: $GroupLicenseNames" -Sev 'Info' -tenant $TenantFilter
81+
}
82+
83+
$CurrentLicenses = $DirectLicenseSkuIds
7184
$ConvertedLicense = $(($ConvertTable | Where-Object { $_.guid -in $CurrentLicenses }).'Product_Display_Name' | Sort-Object -Unique) -join ', '
7285
if ($CurrentLicenses) {
7386
$LicensePayload = [PSCustomObject]@{
@@ -76,10 +89,17 @@ function Remove-CIPPLicense {
7689
}
7790
if ($PSCmdlet.ShouldProcess($userid, "Remove licenses: $ConvertedLicense")) {
7891
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/users/$($userid)/assignlicense" -tenantid $tenantFilter -type POST -body (ConvertTo-Json -InputObject $LicensePayload -Compress -Depth 5) -verbose
79-
Write-LogMessage -headers $Headers -API $APIName -message "Removed licenses for $($username): $ConvertedLicense" -Sev 'Info' -tenant $TenantFilter
92+
Write-LogMessage -headers $Headers -API $APIName -message "Removed directly assigned licenses for $($username): $ConvertedLicense" -Sev 'Info' -tenant $TenantFilter
93+
}
94+
$ResultMessage = "Removed directly assigned licenses for $($Username): $ConvertedLicense"
95+
if ($GroupLicenseSkuIds) {
96+
$ResultMessage = '{0}. Group-inherited licenses ({1}) will be removed automatically when group membership changes are processed.' -f $ResultMessage, $GroupLicenseNames
8097
}
81-
return "Removed licenses for $($Username): $ConvertedLicense"
98+
return $ResultMessage
8299
} else {
100+
if ($GroupLicenseSkuIds) {
101+
return "No directly assigned licenses to remove for $username. Group-inherited licenses ($GroupLicenseNames) will be removed automatically when group membership changes are processed."
102+
}
83103
Write-LogMessage -headers $Headers -API $APIName -message "No licenses to remove for $username" -Sev 'Info' -tenant $TenantFilter
84104
return "No licenses to remove for $username"
85105
}

0 commit comments

Comments
 (0)