Functions/Private/Invoke-DCMsGraphQuery.ps1
function Invoke-DCMsGraphQuery { <# .SYNOPSIS Run a Microsoft Graph query. .DESCRIPTION This CMDlet will run a query against Microsoft Graph and return the result. It will connect using an access token generated by Connect-DCMsGraphAsDelegated or Connect-DCMsGraphAsApplication (depending on what permissions you use in Graph). Before running this CMDlet, you first need to register a new application in your Azure AD according to this article: https://danielchronlund.com/2018/11/19/fetch-data-from-microsoft-graph-with-powershell-paging-support/ .PARAMETER AccessToken An access token generated by Connect-DCMsGraphAsDelegated or Connect-DCMsGraphAsApplication (depending on what permissions you use in Graph). .PARAMETER GraphMethod The HTTP method for the Graph call, like GET, POST, PUT, PATCH, DELETE. Default is GET. .PARAMETER GraphUri The Microsoft Graph URI for the query. Example: https://graph.microsoft.com/v1.0/users/ .PARAMETER GraphBody The request body of the Graph call. This is often used with methids like POST, PUT and PATCH. It is not used with GET. .INPUTS None .OUTPUTS None .NOTES Author: Daniel Chronlund GitHub: https://github.com/DanielChronlund/DCToolbox Blog: https://danielchronlund.com/ .EXAMPLE Invoke-DCMsGraphQuery -AccessToken $AccessToken -GraphMethod 'GET' -GraphUri 'https://graph.microsoft.com/v1.0/users/' #> param ( [parameter(Mandatory = $true)] [string]$AccessToken, [parameter(Mandatory = $false)] [string]$GraphMethod = 'GET', [parameter(Mandatory = $true)] [string]$GraphUri, [parameter(Mandatory = $false)] [string]$GraphBody = '' ) # Check if authentication was successfull. if ($AccessToken) { # Format headers. $HeaderParams = @{ 'Content-Type' = "application\json" 'Authorization' = "Bearer $AccessToken" } # Create an empty array to store the result. $QueryRequest = @() $QueryResult = @() # Run the first query. if ($GraphMethod -eq 'GET') { $QueryRequest = Invoke-RestMethod -Headers $HeaderParams -Uri $GraphUri -UseBasicParsing -Method $GraphMethod -ContentType "application/json" } else { $QueryRequest = Invoke-RestMethod -Headers $HeaderParams -Uri $GraphUri -UseBasicParsing -Method $GraphMethod -ContentType "application/json" -Body $GraphBody } if ($QueryRequest.value) { $QueryResult += $QueryRequest.value } else { $QueryResult += $QueryRequest } # Invoke REST methods and fetch data until there are no pages left. if ($GraphUri -notlike "*`$top*") { while ($QueryRequest.'@odata.nextLink') { $QueryRequest = Invoke-RestMethod -Headers $HeaderParams -Uri $QueryRequest.'@odata.nextLink' -UseBasicParsing -Method $GraphMethod -ContentType "application/json" $QueryResult += $QueryRequest.value } } $QueryResult } else { Write-Error "No Access Token" } } |