Internals/Invoke-AadCommand.ps1


<# EXAMPLE USAGE
$MyParams = @{
    UserId = $AccountId
}
 
Invoke-AadCommand -Command {
    Param($params)
    Get-AzureADUser -ObjectId $params.UserId
} -Parameters $MyParams
#>


function Invoke-AadCommand
{
    
    [CmdletBinding()]
    Param(
        [Parameter(
            mandatory=$true,
            Position=0,
            ValueFromPipeline = $true
        )]
        [ScriptBlock]$Command,
        $Parameters
    )

    "Invoking Azure AD Runspace..." | Log-AadSupport 
    $Command | Log-AadSupport 

    if($Parameters) {
        "Params for Command..." | Log-AadSupport
        $Parameters | Log-AadSupport 
    }
    

    $Error.Clear()

    if(-not $Global:AadSupport.Session.AccountId)
    {
        Write-Host "Need to run Connect-AadSupport" -ForegroundColor Yellow
        throw "Not Authenticated Yet."
    }

    # Get Token for AAD Graph to be used for Azure AD PowerShell
    $token = Get-AadTokenUsingAdal `
      -ResourceId $Global:AadSupport.Resources.AadGraph `
      -ClientId $Global:AadSupport.Clients.AzureAdPowershell.ClientId `
      -Redirect $Global:AadSupport.Clients.AzureAdPowershell.RedirectUri `
      -Tenant $Global:AadSupport.Session.TenantId `
      -UserId $Global:AadSupport.Session.AccountId `
      -Prompt "Never" `
      -SkipServicePrincipalSearch `
      -HideOutput

    $AadAccessToken = $token.AccessToken

    $token = $null
    # Get Token for MS Graph to be used for Azure AD PowerShell
    $token = Get-AadTokenUsingAdal `
    -ResourceId $Global:AadSupport.Resources.MsGraph `
    -ClientId $Global:AadSupport.Clients.AzureAdPowershell.ClientId `
    -Redirect $Global:AadSupport.Clients.AzureAdPowershell.RedirectUri `
    -Tenant $Global:AadSupport.Session.TenantId `
    -UserId $Global:AadSupport.Session.AccountId `
    -Prompt "Never" `
    -SkipServicePrincipalSearch `
    -HideOutput
  
    $MsGraphAccessToken = $token.AccessToken

    $ErrorHandlingBegin = {
        $Error.Clear()
    }

    $ErrorHandlingEnd = {
        return $Error
    }

    $ConnectParams = @{
        TenantId = $Global:AadSupport.Session.TenantId
        AzureEnvironmentName = $Global:AadSupport.Session.AzureEnvironmentName
        LogLevel = "Info"
        LogFilePath = "c:\AadSupportLogs\"
        AadAccessToken = $AadAccessToken
        MsAccessToken = $MsGraphAccessToken
        AccountId =$Global:AadSupport.Session.AccountId

    }

    Write-Verbose "Connect Parameters..."
    Write-Verbose $ConnectParams | ConvertTo-Json -Depth 99
    
    # IMPORT LOGGING IN RUNSPACE
    $GlobalParams = $Global:AadSupport

    $Global:AadCommandResult = $null

    $ScriptBlock = {
      Param(
          $ConnectParams,
          $AadCommand,
          $AadCommandParams,
          $AadSupport
      )

      Write-Verbose "Running Connect-AzureAd"

      # Connect to AAD PowerShell Module
      $session = Connect-AzureAd `
        -TenantId $ConnectParams.TenantId `
        -AzureEnvironmentName $ConnectParams.AzureEnvironmentName `
        -LogLevel $ConnectParams.LogLevel `
        -LogFilePath $ConnectParams.LogPath `
        -AadAccessToken $ConnectParams.AadAccessToken `
        -MsAccessToken $ConnectParams.MsAccessToken `
        -AccountId $ConnectParams.AccountId

      # Run the AAD PowerShell Command
      $Command = [scriptblock]::Create($AadCommand)

      $Results = Invoke-Command -ScriptBlock $Command -ArgumentList $AadCommandParams 
      $Return = $results | ConvertTo-Json -Depth 99
      return $Return
      
    }

    $Job = Start-Job -ScriptBlock $ScriptBlock -ArgumentList $ConnectParams, $Command, $Parameters, $Global:AadSupport

    $Results = $Job | Wait-Job | Receive-Job | ConvertFrom-Json
    return $Results

}