Skip to content

Commit ffbf9a4

Browse files
committed
Optimize group and role member caching with bulk requests
Refactored Set-CIPPDBCacheGroups and Set-CIPPDBCacheRoles to use Microsoft Graph bulk requests for fetching group and role members, improving performance and efficiency. Updated logic to attach member data to each group and role object before caching.
1 parent d870bd7 commit ffbf9a4

File tree

2 files changed

+60
-24
lines changed

2 files changed

+60
-24
lines changed

Modules/CIPPCore/Public/Set-CIPPDBCacheGroups.ps1

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,40 @@ function Set-CIPPDBCacheGroups {
1616
Write-LogMessage -API 'CIPPDBCache' -tenant $TenantFilter -message 'Caching groups' -sev Info
1717

1818
$Groups = New-GraphGetRequest -uri 'https://graph.microsoft.com/beta/groups?$top=999&$select=id,displayName,groupTypes,mail,mailEnabled,securityEnabled,membershipRule,onPremisesSyncEnabled' -tenantid $TenantFilter
19-
Add-CIPPDbItem -TenantFilter $TenantFilter -Type 'Groups' -Data $Groups
20-
Add-CIPPDbItem -TenantFilter $TenantFilter -Type 'Groups' -Data $Groups -Count
21-
$Groups = $null
2219

23-
Write-LogMessage -API 'CIPPDBCache' -tenant $TenantFilter -message 'Cached groups successfully' -sev Info
20+
# Build bulk request for group members
21+
$MemberRequests = $Groups | ForEach-Object {
22+
if ($_.id) {
23+
[PSCustomObject]@{
24+
id = $_.id
25+
method = 'GET'
26+
url = "/groups/$($_.id)/members?`$select=id,displayName,userPrincipalName"
27+
}
28+
}
29+
}
30+
31+
if ($MemberRequests) {
32+
Write-LogMessage -API 'CIPPDBCache' -tenant $TenantFilter -message 'Fetching group members' -sev Info
33+
$MemberResults = New-GraphBulkRequest -Requests @($MemberRequests) -tenantid $TenantFilter
34+
35+
# Add members to each group object
36+
$GroupsWithMembers = foreach ($Group in $Groups) {
37+
$Members = ($MemberResults | Where-Object { $_.id -eq $Group.id }).body.value
38+
$Group | Add-Member -NotePropertyName 'members' -NotePropertyValue $Members -Force
39+
$Group
40+
}
41+
42+
Add-CIPPDbItem -TenantFilter $TenantFilter -Type 'Groups' -Data $GroupsWithMembers
43+
Add-CIPPDbItem -TenantFilter $TenantFilter -Type 'Groups' -Data $GroupsWithMembers -Count
44+
$Groups = $null
45+
$GroupsWithMembers = $null
46+
} else {
47+
Add-CIPPDbItem -TenantFilter $TenantFilter -Type 'Groups' -Data $Groups
48+
Add-CIPPDbItem -TenantFilter $TenantFilter -Type 'Groups' -Data $Groups -Count
49+
$Groups = $null
50+
}
51+
52+
Write-LogMessage -API 'CIPPDBCache' -tenant $TenantFilter -message 'Cached groups with members successfully' -sev Info
2453

2554
} catch {
2655
Write-LogMessage -API 'CIPPDBCache' -tenant $TenantFilter `

Modules/CIPPCore/Public/Set-CIPPDBCacheRoles.ps1

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,36 +17,43 @@ function Set-CIPPDBCacheRoles {
1717

1818
$Roles = New-GraphGetRequest -uri 'https://graph.microsoft.com/beta/directoryRoles' -tenantid $TenantFilter
1919

20-
$RolesWithMembers = foreach ($Role in $Roles) {
21-
try {
22-
$Members = New-GraphGetRequest -uri "https://graph.microsoft.com/beta/directoryRoles/$($Role.id)/members?&`$select=id,displayName,userPrincipalName" -tenantid $TenantFilter
20+
# Build bulk request for role members
21+
$MemberRequests = $Roles | ForEach-Object {
22+
if ($_.id) {
2323
[PSCustomObject]@{
24-
id = $Role.id
25-
displayName = $Role.displayName
26-
description = $Role.description
27-
roleTemplateId = $Role.roleTemplateId
28-
members = $Members
29-
memberCount = $Members.Count
24+
id = $_.id
25+
method = 'GET'
26+
url = "/directoryRoles/$($_.id)/members?`$select=id,displayName,userPrincipalName"
3027
}
31-
} catch {
32-
Write-LogMessage -API 'CIPPDBCache' -tenant $TenantFilter -message "Failed to get members for role $($Role.displayName): $($_.Exception.Message)" -sev Warning
28+
}
29+
}
30+
31+
if ($MemberRequests) {
32+
Write-LogMessage -API 'CIPPDBCache' -tenant $TenantFilter -message 'Fetching role members' -sev Info
33+
$MemberResults = New-GraphBulkRequest -Requests @($MemberRequests) -tenantid $TenantFilter
34+
35+
# Add members to each role object
36+
$RolesWithMembers = foreach ($Role in $Roles) {
37+
$Members = ($MemberResults | Where-Object { $_.id -eq $Role.id }).body.value
3338
[PSCustomObject]@{
3439
id = $Role.id
3540
displayName = $Role.displayName
3641
description = $Role.description
3742
roleTemplateId = $Role.roleTemplateId
38-
members = @()
39-
memberCount = 0
43+
members = $Members
44+
memberCount = ($Members | Measure-Object).Count
4045
}
4146
}
42-
}
4347

44-
Add-CIPPDbItem -TenantFilter $TenantFilter -Type 'Roles' -Data $RolesWithMembers
45-
46-
Add-CIPPDbItem -TenantFilter $TenantFilter -Type 'Roles' -Data $RolesWithMembers -Count
47-
48-
$Roles = $null
49-
$RolesWithMembers = $null
48+
Add-CIPPDbItem -TenantFilter $TenantFilter -Type 'Roles' -Data $RolesWithMembers
49+
Add-CIPPDbItem -TenantFilter $TenantFilter -Type 'Roles' -Data $RolesWithMembers -Count
50+
$Roles = $null
51+
$RolesWithMembers = $null
52+
} else {
53+
Add-CIPPDbItem -TenantFilter $TenantFilter -Type 'Roles' -Data $Roles
54+
Add-CIPPDbItem -TenantFilter $TenantFilter -Type 'Roles' -Data $Roles -Count
55+
$Roles = $null
56+
}
5057

5158
Write-LogMessage -API 'CIPPDBCache' -tenant $TenantFilter -message 'Cached directory roles successfully' -sev Info
5259

0 commit comments

Comments
 (0)