functions/Graph/Connect-C365Graph.ps1

function Connect-C365Graph
{
    <#
        .ForwardHelpTargetName Microsoft.Graph.Authentication\Connect-Graph
        .ForwardHelpCategory Cmdlet
    #>

    [CmdletBinding(DefaultParameterSetName = 'UserParameterSet')]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = 'UserParameterSet', Position = 1)]
        [string[]]
        $Scopes,
        
        [Parameter(Mandatory = $true, ParameterSetName = 'UserPresetParameterSet')]
        [string[]]
        $Workflow,
        
        [Parameter(ParameterSetName = 'AppParameterSet', Mandatory = $true, Position = 1)]
        [string]
        $ClientId,
        
        [Parameter(ParameterSetName = 'AppParameterSet', Position = 2)]
        [string]
        $CertificateName,
        
        [Parameter(ParameterSetName = 'AppParameterSet', Position = 3)]
        [string]
        $CertificateThumbprint,
        
        [Parameter(ParameterSetName = 'UserParameterSet')]
        [Parameter(ParameterSetName = 'UserPresetParameterSet')]
        [Parameter(Mandatory = $true, ParameterSetName = 'AppParameterSet')]
        [string]
        $TenantId
    )
    
    begin
    {
        try
        {
            $parameters = $PSBoundParameters | ConvertTo-PSFHashtable -Exclude Workflow
            $parameters['ForceRefresh'] = $true
            if ($ClientId -and -not ($CertificateName -or $CertificateThumbprint)) { throw 'Must specify either certificate thumbprint or name to authenticate as application!' }
            if ($CertificateName -and -not $CertificateThumbprint) { $parameters['CertificateThumbprint'] = 'XXX' }
            if ($CertificateThumbprint -and -not $CertificateName) { $parameters['CertificateName'] = 'XXX' }
            if ($Workflow) { $parameters['Scopes'] = $script:workflow_definitions[$Workflow].Scopes }
            elseif (-not $parameters.ClientID) { $parameters['Scopes'] = $Scopes }
            
            $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.Graph.Authentication\Connect-Graph', [System.Management.Automation.CommandTypes]::Cmdlet)
            $scriptCmd = { & $wrappedCmd @parameters }
            $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
            $steppablePipeline.Begin($false)
        }
        catch
        {
            throw
        }
    }
    
    process
    {
        try { $steppablePipeline.Process($_) }
        catch { throw }
    }
    
    end
    {
        try { $steppablePipeline.End() }
        catch { throw }
    }
}