Public/Get-ECMA2ConnectorSyncJob.ps1

function Get-ECMA2ConnectorSyncJob {
    <#
    .SYNOPSIS
        Gets Microsoft Entra cloud provisioning synchronization job details for a service principal.

    .DESCRIPTION
        Retrieves one or all synchronization jobs for the given service principal
        (enterprise application), including schedule and status - including whether
        the job's last run is still in progress, and any active quarantine/escrows.
        Use this to confirm the correct servicePrincipalId/jobId, and current state,
        before calling Restart-ECMA2ConnectorSyncJob.

        Requires a prior Connect-ECMA2Graph with Synchronization.Read.All or
        Synchronization.ReadWrite.All.

    .PARAMETER ServicePrincipalId
        The object ID of the service principal (enterprise application) the job belongs to.

    .PARAMETER JobId
        The synchronization job identifier. Omit to list all jobs for the service principal.

    .PARAMETER ApiVersion
        The Microsoft Graph API version to call. Defaults to v1.0.

    .EXAMPLE
        Get-ECMA2ConnectorSyncJob -ServicePrincipalId $spId -JobId $jobId

    .EXAMPLE
        Get-ECMA2ConnectorSyncJob -ServicePrincipalId $spId
        Lists all synchronization jobs for the service principal.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [string]$ServicePrincipalId,

        [Parameter(ValueFromPipelineByPropertyName)]
        [string]$JobId,

        [Parameter()]
        [ValidateSet('v1.0', 'beta')]
        [string]$ApiVersion = 'v1.0'
    )

    process {
        try {
            $baseUri = "https://graph.microsoft.com/$ApiVersion/servicePrincipals/$ServicePrincipalId/synchronization/jobs"
            $uri = if ($JobId) { "$baseUri/$JobId" } else { $baseUri }

            Write-Verbose "Getting synchronization job(s) from $uri"
            $response = Invoke-ECMA2GraphRequest -Method GET -Uri $uri

            $jobs = if ($JobId) { @($response) } else { $response.value }

            if (-not $jobs) {
                Write-Warning "No synchronization job(s) found for service principal '$ServicePrincipalId'"
                return
            }

            foreach ($job in $jobs) {
                [PSCustomObject]@{
                    PSTypeName         = 'ECMA2Host.SyncJob'
                    Id                 = $job.id
                    TemplateId         = $job.templateId
                    ServicePrincipalId = $ServicePrincipalId
                    ScheduleState      = $job.schedule.state
                    ScheduleInterval   = $job.schedule.interval
                    StatusCode         = $job.status.code
                    IsRunning          = ($job.status.lastExecution.state -in @('InProgress', 'Pending'))
                    LastExecutionState = $job.status.lastExecution.state
                    LastExecutionTime  = $job.status.lastExecution.timeBegan
                    Quarantine         = $job.status.quarantine
                    Escrows            = $job.status.escrows
                    ApiVersion         = $ApiVersion
                }
            }
        }
        catch {
            Write-Error "Failed to get synchronization job for service principal '$ServicePrincipalId': $_"
        }
    }
}