functions/Get-AzSRRecoveryServiceVaultProtectedItemRecoveryPoint.ps1

<#
.SYNOPSIS
    Get all Recovery Points for a given Protected Item
 
.DESCRIPTION
    Get all Recovery Points for a given Protected Item
 
.PARAMETER ProtectedItemId
    Azure Resource id of the protected item
 
.EXAMPLE
    Get-AzSRSubscription | Get-AzSRRecoveryServiceVault | Get-AzSRRecoveryServiceVaultProtectedItem | Get-AzSRRecoveryServiceVaultProtectedItemRecoveryPoint
 
.EXAMPLE
    Get-AzSRVMByName -SubscriptionId nnnnnnnn -VMName "vmname" | Get-AzSRVMProtectionStatus | Get-AzSRRecoveryServiceVaultProtectedItemRecoveryPoint
 
.NOTES
    Copyright: (c) 2018 Fabian Bader
    License: MIT https://opensource.org/licenses/MIT
#>

function Get-AzSRRecoveryServiceVaultProtectedItemRecoveryPoint {
    [CmdletBinding()]
    param (
        [Alias('Id')]
        [Parameter(Mandatory = $true,
            ParameterSetName = 'ResourceIdBased',
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true)]
        [ValidateScript(
            {
                if ($_ -match "subscriptions\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\/resourcegroups\/[\w\d-\.]+\/providers\/microsoft\.RecoveryServices\/vaults\/[\w|()-;\/]+\/backupFabrics\/[\w|()-\/;]+\/protectedItems\/[\w|()-\/;]+$" ) {
                    $true
                } else {
                    throw "Not a valid 'microsoft.RecoveryServices/vaults' URI"
                }
            }
        )]
        [string]$ProtectedItemId,

        [Parameter(Mandatory = $true,
            ParameterSetName = 'ValueBased',
            ValueFromPipelineByPropertyName = $true)]
        [string]$protectedItemName,

        [Parameter(Mandatory = $true,
            ParameterSetName = 'ValueBased',
            ValueFromPipelineByPropertyName = $true)]
        [string]$fabricName,

        [Parameter(Mandatory = $true,
            ParameterSetName = 'ValueBased',
            ValueFromPipelineByPropertyName = $true)]
        [string]$containerName,

        [Parameter(Mandatory = $true,
            ParameterSetName = 'ValueBased',
            ValueFromPipelineByPropertyName = $true)]
        [string]$vaultId
    )
    # Query Recovery Points for protected Items
    # https://docs.microsoft.com/en-us/rest/api/backup/recoverypoints/list

    Begin {
        #region Get AccessToken
        try {
            $AccessToken = Get-AzureRmCachedAccessToken
            $LoginHeader = @{
                'authorization' = "Bearer $AccessToken"
            }
        } catch {
            throw $($_.Exception.Message)
        }
        #endregion

        #region uri definition
        $baseURI = "https://management.azure.com"
        $suffixURI = "/recoveryPoints?api-version=2017-07-01&`$filter=restorePointQueryType eq 'rpTypeAll'"
        #endregion
    }

    Process {
        if ($PSCmdlet.ParameterSetName -eq "ValueBased") {
            $ProtectedItemId = $vaultId + "/backupFabrics/" + $fabricName + "/protectionContainers/" +  $containerName  + "/protectedItems/" + $protectedItemName
        }
        $uri = $baseURI + $ProtectedItemId + $suffixURI

        Write-Verbose $uri

        $params = @{
            ContentType = 'application/x-www-form-urlencoded'
            Headers     = $LoginHeader
            Method      = 'Get'
            URI         = $uri
            Verbose     = $false
        }
        try {
            $Response = Invoke-RestMethod @params
            $Response.value | ForEach-Object {
                $vmResourceGroup = $ProtectedItemId -replace '.*protectedItems/VM;(.*);(.*);(.*)', '$2'
                $vmName = $ProtectedItemId -replace '.*protectedItems/VM;(.*);(.*);(.*)', '$3'
                New-Object psobject -Property @{
                    'id'                           = $_.id
                    'vmResourceGroup'              = $vmResourceGroup
                    'vmName'                       = $vmName
                    'objectType'                   = $_.properties.objectType
                    'recoveryPointType'            = $_.properties.recoveryPointType
                    'recoveryPointTime'            = $_.properties.recoveryPointTime
                    'sourceVMStorageType'          = $_.properties.sourceVMStorageType
                    'isSourceVMEncrypted'          = $_.properties.isSourceVMEncrypted
                    'isManagedVirtualMachine'      = $_.properties.isManagedVirtualMachine
                    'virtualMachineSize'           = $_.properties.virtualMachineSize
                    'originalStorageAccountOption' = $_.properties.originalStorageAccountOption
                    'osType'                       = $_.properties.osType
                }
            }
        } catch {
            if ($_.ErrorDetails) {
                Write-Warning "$(($_.ErrorDetails.Message | ConvertFrom-Json).error.message)"
            } else {
                Write-Warning "$($_.Exception.Message)"

            }
        }
    }
}