Functions/Get-RSC/Get-RSCUserRoleAssignments.ps1
################################################ # Function - Get-RSCUserRoleAssignments - Getting Users Role Assignments within RSC ################################################ Function Get-RSCUserRoleAssignments { <# .SYNOPSIS A Rubrik Security Cloud (RSC) Reporting Module Function returning a list of all user role assignments. .DESCRIPTION Makes the required GraphQL API calls to RSC via Invoke-RestMethod to get the data as described, then creates a usable array of the returned information, removing the need for the PowerShell user to understand GraphQL in order to interact with RSC. .LINK GraphQL schema reference: https://rubrikinc.github.io/rubrik-api-documentation/schema/reference .OUTPUTS Returns an array of all the available information on the GraphQL endpoint in a uniform and usable format. .EXAMPLE Get-RSCUserRoleAssignments This example returns an array of all the information returned by the GraphQL endpoint for this object type. .NOTES Author: Joshua Stenhouse Date: 05/11/2023 #> ################################################ # Importing Module & Running Required Functions ################################################ # Importing the module is it needs other modules Import-Module RSCReporting # Checking connectivity, exiting function with error if not connected Test-RSCConnection ################################################ # Querying RSC GraphQL API ################################################ # Creating array for objects $RSCList = @() # Building GraphQL query $RSCGraphQL = @{"operationName" = "usersInCurrentAndDescendantOrganization"; "variables" = @{ "first" = 1000 }; "query" = "query usersInCurrentAndDescendantOrganization(`$first: Int, `$after: String, `$before: String) { usersInCurrentAndDescendantOrganization(first: `$first, after: `$after, before: `$before) { edges { node { id isAccountOwner isHidden lastLogin lockoutState { isLocked lockMethod lockedAt unlockMethod unlockedAt } status totpStatus { isEnabled isEnforced isEnforcedUserLevel isSupported totpConfigUpdateAt } domain emailConfig { account digestId digestName eventDigestConfigJson frequency includeAudits includeEvents isImmediate recipientUserId } eulaState { isAccepted isPactsafeEnabled isPactsafeV2Enabled } groups roles { description id isOrgAdmin isReadOnly name orgId protectableClusters } unreadCount username } } pageInfo { endCursor hasNextPage hasPreviousPage startCursor } } }" } ################################################ # API Call To RSC GraphQL URI ################################################ # Querying API $RSCResponse = Invoke-RestMethod -Method POST -Uri $RSCGraphqlURL -Body $($RSCGraphQL | ConvertTo-JSON -Depth 20) -Headers $RSCSessionHeader $RSCList += $RSCResponse.data.usersInCurrentAndDescendantOrganization.edges.node # Getting all results from paginations While ($RSCResponse.data.usersInCurrentAndDescendantOrganization.pageInfo.hasNextPage) { # Getting next set $RSCGraphQL.variables.after = $RSCResponse.data.usersInCurrentAndDescendantOrganization.pageInfo.endCursor $RSCResponse = Invoke-RestMethod -Method POST -Uri $RSCGraphqlURL -Body $($RSCGraphQL | ConvertTo-JSON -Depth 20) -Headers $RSCSessionHeader $RSCList += $RSCResponse.data.usersInCurrentAndDescendantOrganization.edges.node } ################################################ # Processing List ################################################ # Creating array $RSCUserRoleAssignments = [System.Collections.ArrayList]@() # For Each Object Getting Data ForEach ($User in $RSCList) { # Setting variables $UserID = $User.id $UserName = $User.username $UserEmail = $User.email $UserLockoutState = $User.lockoutState.isLocked $UserLastLoginUNIX = $User.lastLogin $UserDomain = $User.domain $UserTOTPEnabled = $User.totpStatus.isEnabled $UserTOTPEnforced = $User.totpStatus.isEnforced $UserTOTPEnforcedOnUser = $User.totpStatus.isEnforcedUserLevel $UserTOTPSupported = $User.totpStatus.isSupported $UserTOTPConfiguredUNIX = $User.totpStatus.totpConfigUpdateAt $UserStatus = $User.status $UserRoles = $User.roles $UserRoleNames =$UserRoles.name $UserEULAAccepted = $User.eulaState.isAccepted $UserIsHidden = $User.isHidden $UserIsAccountOwner = $User.isAccountOwner # Counting roles $UserRoleCount = $UserRoles | Measure-Object | Select-Object -ExpandProperty Count # Fixing username if null IF($UserName -eq ""){$UserSplit = $UserEmail.Split("@");$UserName = $UserSplit[0]} # Converting UserLastLoginUNIX IF($UserLastLoginUNIX -ne $null){$UserLastLoginUTC = Convert-RSCUNIXTime $UserLastLoginUNIX}ELSE{$UserLastLoginUTC = $null} $UTCDateTime = [System.DateTime]::UtcNow IF($UserLastLoginUTC -ne $null){$UserLastLoginTimespan = New-TimeSpan -Start $UserLastLoginUTC -End $UTCDateTime;$UserLastLoginHoursSince = $UserLastLoginTimespan | Select-Object -ExpandProperty TotalHours;$UserLastLoginHoursSince = [Math]::Round($UserLastLoginHoursSince,1)}ELSE{$UserLastLoginHoursSince = $null} IF($UserLastLoginUTC -ne $null){$UserLastLoginMinutesSince = $UserLastLoginTimespan | Select-Object -ExpandProperty TotalMinutes;$UserLastLoginMinutesSince = [Math]::Round($UserLastLoginMinutesSince)}ELSE{$UserLastLoginMinutesSince = $null} IF($UserLastLoginUTC -ne $null){$UserLastLoginDaysSince = $UserLastLoginTimespan | Select-Object -ExpandProperty TotalDays;$UserLastLoginDaysSince = [Math]::Round($UserLastLoginDaysSince,1)}ELSE{$UserLastLoginDaysSince = $null} # Converting UserTOTPConfiguredUNIX IF($UserTOTPConfiguredUNIX -ne $null){$UserTOTPConfiguredUTC = Convert-RSCUNIXTime $UserTOTPConfiguredUNIX}ELSE{$UserTOTPConfiguredUTC = $null} $UTCDateTime = [System.DateTime]::UtcNow IF($UserTOTPConfiguredUTC -ne $null){$UserTOTPConfiguredTimespan = New-TimeSpan -Start $UserTOTPConfiguredUTC -End $UTCDateTime;$UserTOTPConfiguredHoursSince = $UserTOTPConfiguredTimespan | Select-Object -ExpandProperty TotalHours;$UserTOTPConfiguredHoursSince = [Math]::Round($UserTOTPConfiguredHoursSince,1)}ELSE{$UserTOTPConfiguredHoursSince = $null} IF($UserTOTPConfiguredUTC -ne $null){$UserTOTPConfiguredMinutesSince = $UserTOTPConfiguredTimespan | Select-Object -ExpandProperty TotalMinutes;$UserTOTPConfiguredMinutesSince = [Math]::Round($UserTOTPConfiguredMinutesSince)}ELSE{$UserTOTPConfiguredMinutesSince = $null} IF($UserTOTPConfiguredUTC -ne $null){$UserTOTPConfiguredDaysSince = $UserTOTPConfiguredTimespan | Select-Object -ExpandProperty TotalDays;$UserTOTPConfiguredDaysSince = [Math]::Round($UserTOTPConfiguredDaysSince,1)}ELSE{$UserTOTPConfiguredDaysSince = $null} # For each role ForEach($UserRole in $UserRoles) { # Checking if in default admin group IF($UserRole.id -match "00000000-0000-0000-0000-000000000000"){$IsDefaultAdminRole = $TRUE}ELSE{$IsDefaultAdminRole = $FALSE} # Adding To Array $Object = New-Object PSObject $Object | Add-Member -MemberType NoteProperty -Name "RSCInstance" -Value $RSCInstance $Object | Add-Member -MemberType NoteProperty -Name "Email" -Value $UserEmail $Object | Add-Member -MemberType NoteProperty -Name "UserName" -Value $UserName $Object | Add-Member -MemberType NoteProperty -Name "UserID" -Value $UserID $Object | Add-Member -MemberType NoteProperty -Name "Domain" -Value $UserDomain $Object | Add-Member -MemberType NoteProperty -Name "Role" -Value $UserRole.name $Object | Add-Member -MemberType NoteProperty -Name "RoleID" -Value $UserRole.id $Object | Add-Member -MemberType NoteProperty -Name "IsDefaultAdminRole" -Value $IsDefaultAdminRole $Object | Add-Member -MemberType NoteProperty -Name "OrgID" -Value $UserRole.orgId $Object | Add-Member -MemberType NoteProperty -Name "Description" -Value $UserRole.description # Adding $RSCUserRoleAssignments.Add($Object) | Out-Null } # End of for each object below } # End of for each object above # # Returning array Return $RSCUserRoleAssignments # End of function } |