Private/Invoke-GraphAPIRequest.ps1

function Invoke-GraphAPIRequest {
  <#
      .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"
  }
}