@@ -75,7 +75,12 @@ function Get-ZtEmergencyAccessAccounts {
7575 $sql = " SELECT id, userPrincipalName, displayName FROM User WHERE LOWER(userPrincipalName) = '$escapedUpn '"
7676 }
7777 elseif ($id ) {
78- $escapedId = $id -replace " '" , " ''"
78+ $guidRef = [System.Guid ]::Empty
79+ if (-not [System.Guid ]::TryParse($id , [ref ]$guidRef )) {
80+ Write-PSFMessage " Skipping invalid user entry: Id '$id ' is not a valid GUID" - Level Warning
81+ continue
82+ }
83+ $escapedId = $guidRef.ToString ()
7984 $sql = " SELECT id, userPrincipalName, displayName FROM User WHERE id = '$escapedId '"
8085 }
8186 else {
@@ -104,27 +109,45 @@ function Get-ZtEmergencyAccessAccounts {
104109 continue
105110 }
106111
112+ $guidRef = [System.Guid ]::Empty
113+ if (-not [System.Guid ]::TryParse($id , [ref ]$guidRef )) {
114+ Write-PSFMessage " Skipping invalid group entry: Id '$id ' is not a valid GUID" - Level Warning
115+ continue
116+ }
117+
107118 # Resolve group members via Microsoft Graph API (GroupMember table not available in DB)
108119 try {
109120 Write-PSFMessage " Resolving emergency access group members via Graph API: Id=$id " - Level Verbose
110- $membersResponse = Get-ZtGroupMember - GroupId $id - ErrorAction Stop
121+ $membersResponse = Get-ZtGroupMember - GroupId $id - Recurse - ErrorAction Stop
111122 $members = @ ($membersResponse | Where-Object { $_ .' @odata.type' -eq ' #microsoft.graph.user' })
112123
113124 if ($members.Count -gt 0 ) {
114- # Batch all member ids into a single SQL lookup to avoid N+1 queries
115- $escapedIds = $members | ForEach-Object { " '" + (($_.id ) -replace " '" , " ''" ) + " '" }
116- $idList = $escapedIds -join ' ,'
117- $memberSql = " SELECT id, userPrincipalName, displayName FROM User WHERE id IN ($idList )"
118- $userDetailsList = @ (Invoke-DatabaseQuery - Database $Database - Sql $memberSql )
119-
120- foreach ($userDetails in $userDetailsList ) {
121- $emergencyAccessAccounts += [PSCustomObject ]@ {
122- Id = $userDetails.id
123- UserPrincipalName = $userDetails.userPrincipalName
124- DisplayName = $userDetails.displayName
125- Type = ' GroupMember'
125+ # Batch all member IDs into a single SQL lookup to avoid N+1 queries;
126+ # member IDs come from Graph API responses which are always valid GUIDs.
127+ $escapedIds = $members | ForEach-Object {
128+ $memberGuid = [System.Guid ]::Empty
129+ if ([System.Guid ]::TryParse($_.id , [ref ]$memberGuid )) {
130+ " '" + $memberGuid.ToString () + " '"
131+ }
132+ } | Where-Object { $_ }
133+
134+ if (-not $escapedIds ) {
135+ Write-PSFMessage " Emergency access group members had no valid GUIDs: Id=$id " - Level Warning
136+ }
137+ else {
138+ $idList = $escapedIds -join ' ,'
139+ $memberSql = " SELECT id, userPrincipalName, displayName FROM User WHERE id IN ($idList )"
140+ $userDetailsList = @ (Invoke-DatabaseQuery - Database $Database - Sql $memberSql )
141+
142+ foreach ($userDetails in $userDetailsList ) {
143+ $emergencyAccessAccounts += [PSCustomObject ]@ {
144+ Id = $userDetails.id
145+ UserPrincipalName = $userDetails.userPrincipalName
146+ DisplayName = $userDetails.displayName
147+ Type = ' GroupMember'
148+ }
149+ Write-PSFMessage " Emergency access group member found: $ ( $userDetails.userPrincipalName ) " - Level Verbose
126150 }
127- Write-PSFMessage " Emergency access group member found: $ ( $userDetails.userPrincipalName ) " - Level Verbose
128151 }
129152 }
130153 else {
0 commit comments