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
        )]
        $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

    }

    $ConnectCommand = {
        Param($Params)
        $session = Connect-AzureAd `
        -TenantId $Params.TenantId `
        -AzureEnvironmentName $Params.AzureEnvironmentName `
        -LogLevel $Params.LogLevel `
        -LogFilePath $Params.LogPath `
        -AadAccessToken $Params.AadAccessToken `
        -MsAccessToken $Params.MsAccessToken `
        -AccountId $Params.AccountId
        return $session
    }

    # Set up runspace
    $PowerShell = [powershell]::Create()
    $PowerShell.runspace = $Global:AadSupport.Runspace.AzureAd.Instance
    $RunspaceState = $Global:AadSupport.Runspace.AzureAd.Instance.RunspaceStateInfo.State
    if($RunspaceState -eq "BeforeOpen")
    {
        $PowerShell.runspace = $Global:AadSupport.Runspace.AzureAd.Instance.Open()
    }

    # IMPORT LOGGING IN RUNSPACE
    $PowerShell.runspace.SessionStateProxy.SetVariable('GlobalParams',$Global:AadSupport)

    [void]$PowerShell.AddScript({
        $ImportLogging = "$($GlobalParams.Path)\Internals\imports\Log-AadSupportRunspace.ps1"
        . $ImportLogging 
    })
    
    $PowerShell.Invoke()
    $PowerShell.Commands.Clear()
    
    # Connect to Azure AD (Connect-AzureAd)
    [void]$PowerShell.AddScript($ErrorHandlingBegin)
    [void]$PowerShell.AddScript($ConnectCommand).AddArgument($ConnectParams)
    $RunConnectAzureAd = $PowerShell.Invoke()
    $PowerShell.Commands.Clear()
    
    # Run command
    [void]$PowerShell.AddScript($Command).AddArgument($Parameters)
    $RunCommand = $PowerShell.Invoke()
    $PowerShell.Commands.Clear()

    # Get errors in runspace
    [void]$PowerShell.AddScript($ErrorHandlingEnd)
    $ErrorInsideRunspace = $PowerShell.Invoke()
    $PowerShell.Commands.Clear()

    if($RunCommand)
    {
        $RunCommand | Log-AadSupport
        return $RunCommand
    }

    if($ErrorInsideRunspace)
    {
        $ErrorInsideRunspace | Log-AadSupport -Force
        return $ErrorInsideRunspace
    }
}