Functions/Get-RSCM365Objects.ps1
################################################ # Function - Get-RSCM365Objects - Getting o365 Objects connected to RSC ################################################ Function Get-RSCM365Objects { <# .SYNOPSIS A Rubrik Security Cloud (RSC) Reporting Module Function returning a list of all M365 objects (I.E mailboxes, onedrive, sharepoint sites, teams). .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-RSCM365Objects 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 # Getting all RSC Objects $RSCM365ObjectsList = Get-RSCObjects | Where-Object {$_.Type -match "o365"} ################################################ # Getting All o365 Subscriptions ################################################ # Creating array for objects $o365SubscriptionList = @() # Building GraphQL query $RSCGraphQL = @{"operationName" = "o365Orgs"; "variables" = @{ "first" = 1000 }; "query" = "query o365Orgs(`$first: Int, `$after: String) { o365Orgs(first: `$first, after: `$after) { edges { node { status past1DayMailboxComplianceCount past1DayMailboxOutOfComplianceCount past1DayOnedriveComplianceCount past1DayOnedriveOutOfComplianceCount past1DaySharepointComplianceCount past1DaySharepointOutOfComplianceCount past1DayTeamsComplianceCount past1DayTeamsOutOfComplianceCount past1DaySpListComplianceCount past1DaySpListOutOfComplianceCount past1DaySpSiteCollectionComplianceCount past1DaySpSiteCollectionOutOfComplianceCount id unprotectedUsersCount name objectType slaAssignment searchDescendantConnection { edges { node { id name objectType slaAssignment effectiveSlaDomain { id name } } } } effectiveSlaDomain { id name } numWorkloadDescendants } } pageInfo { endCursor hasNextPage hasPreviousPage } } } " } ################################################ # API Call To RSC GraphQL URI ################################################ # Querying API $o365SubscriptionResponse = Invoke-RestMethod -Method POST -Uri $RSCGraphqlURL -Body $($RSCGraphQL | ConvertTo-JSON -Depth 20) -Headers $RSCSessionHeader # Setting variable $o365SubscriptionList += $o365SubscriptionResponse.data.o365Orgs.edges.node # Getting all results from paginations While ($o365SubscriptionResponse.data.o365Orgs.pageInfo.hasNextPage) { # Getting next set $RSCGraphQL.variables.after = $o365SubscriptionResponse.data.o365Orgs.pageInfo.endCursor $o365SubscriptionResponse = Invoke-RestMethod -Method POST -Uri $RSCGraphqlURL -Body $($RSCGraphQL | ConvertTo-JSON -Depth 20) -Headers $RSCSessionHeader $o365SubscriptionList += $o365SubscriptionResponse.data.o365Orgs.edges.node } ################################################ # Processing ################################################ # Creating array $o365Objects = [System.Collections.ArrayList]@() # Time for refresh since $UTCDateTime = [System.DateTime]::UtcNow # For Each Object Getting Data ForEach ($o365Sub in $o365SubscriptionList) { # Setting variables $o365SubName = $o365Sub.name $o365SubID = $o365Sub.id $o365SubUnprotectedUsers = $o365Sub.unprotectedUsersCount $o365SubStatus = $o365Sub.status $o365SubSLAAssignment = $o365Sub.slaAssignment $o365SubSLADomain = $o365Sub.effectiveSlaDomain.name $o365SubSLADomainID = $o365Sub.effectiveSlaDomain.id # Selecting oject types $O365ObjectList = $o365Sub.searchDescendantConnection.edges.node # For each object adding to array ForEach($O365Object in $O365ObjectList) { # Setting variables $o365objectName = $O365Object.name $o365objectID = $O365Object.id $o365objectType = $O365Object.objectType $o365objectSLAAssignment = $O365Object.slaAssignment $o365objectSLADomain = $O365Object.effectiveSlaDomain.name $o365objectSLADomainID = $O365Object.effectiveSlaDomain.id # Getting info from objects list $ObjectInfo = $RSCM365ObjectsList | Where-Object {$_.ObjectID -eq $o365objectID} $o365objectProtectionStatus = $ObjectInfo.ProtectionStatus $o365objectLastSnapshot = $ObjectInfo.LastSnapshot $o365objectHoursSince = $ObjectInfo.HoursSince $o365objectTotalSnapshots = $ObjectInfo.TotalSnapshots $o365objectURL = $ObjectInfo.URL # If protection status is null, must be unprotected IF($o365objectProtectionStatus -eq $null){$o365objectProtectionStatus = "NoSla"} # Adding To Array $Object = New-Object PSObject $Object | Add-Member -MemberType NoteProperty -Name "RSCInstance" -Value $RSCInstance $Object | Add-Member -MemberType NoteProperty -Name "Subscription" -Value $o365SubName $Object | Add-Member -MemberType NoteProperty -Name "SubscriptionID" -Value $o365SubID $Object | Add-Member -MemberType NoteProperty -Name "ObjectName" -Value $o365objectName $Object | Add-Member -MemberType NoteProperty -Name "ObjectID" -Value $o365objectID $Object | Add-Member -MemberType NoteProperty -Name "ObjectType" -Value $o365objectType $Object | Add-Member -MemberType NoteProperty -Name "ProtectionStatus" -Value $o365objectProtectionStatus $Object | Add-Member -MemberType NoteProperty -Name "SLAAssignment" -Value $o365objectSLAAssignment $Object | Add-Member -MemberType NoteProperty -Name "SLADomain" -Value $o365objectSLADomain $Object | Add-Member -MemberType NoteProperty -Name "SLADomainID" -Value $o365objectSLADomainID $Object | Add-Member -MemberType NoteProperty -Name "TotalSnapshots" -Value $o365objectTotalSnapshots $Object | Add-Member -MemberType NoteProperty -Name "LastSnapshot" -Value $o365objectLastSnapshot $Object | Add-Member -MemberType NoteProperty -Name "HoursSince" -Value $o365objectHoursSince $Object | Add-Member -MemberType NoteProperty -Name "URL" -Value $o365objectURL # Adding $o365Objects.Add($Object) | Out-Null # End of for each o365 object below } # End of for each o365 object above # # End of for each o365 subscription below } # End of for each o365 subscription above # Returning array Return $o365Objects # End of function } |