Public/Get-CloudPC.ps1

function Get-CloudPC {
    <#
    .SYNOPSIS
        Returns Windows 365 Cloud PCs in the tenant.

    .DESCRIPTION
        Thin, fast wrapper over /beta/deviceManagement/virtualEndpoint/cloudPCs that returns
        normalized PSCustomObjects (PSTypeName = 'WindowsCloudPC.CloudPC') suitable for piping
        into Get-CloudPCUsage, Where-Object, Format-Table, etc. The raw Graph object is preserved
        on the .Raw property.

        The request selects connectivityResult and sends
        Prefer: include-unknown-enum-members so Graph returns evolvable enum
        values such as inUse and underServiceMaintenance.

    .PARAMETER ProvisioningPolicyId
        Filter to a single provisioning policy.

    .PARAMETER UserPrincipalName
        Filter to Cloud PCs assigned to a specific user (dedicated only — Graph cannot filter
        sharedDeviceDetail by user).

    .PARAMETER Type
        Shared, Dedicated, or All (default).

    .EXAMPLE
        Get-CloudPC | Format-Table Name,ProvisioningType,AssignedUserUpn,ConnectivityStatus

    .EXAMPLE
        Get-CloudPC -ProvisioningPolicyId 8e8a545f-6168-4472-9466-9f05520a5eb3 -Type Shared
    #>

    [CmdletBinding()]
    [OutputType('WindowsCloudPC.CloudPC')]
    param(
        [Parameter(ValueFromPipelineByPropertyName)]
        [string]$ProvisioningPolicyId,

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

        [ValidateSet('Shared','Dedicated','All')]
        [string]$Type = 'All'
    )

    begin {
        Connect-CloudPC | Out-Null
    }

    process {
        $filters = @("servicePlanType eq 'enterprise'")
        if ($ProvisioningPolicyId) { $filters += "provisioningPolicyId eq '$ProvisioningPolicyId'" }
        if ($UserPrincipalName)    { $filters += "userPrincipalName eq '$UserPrincipalName'" }
        $filter = ($filters -join ' and ')

        $select = @(
            'id','managedDeviceId','managedDeviceName','displayName','userPrincipalName',
            'status','provisioningType','provisioningPolicyId','provisioningPolicyName',
            'servicePlanName','sharedDeviceDetail','connectivityResult','lastModifiedDateTime',
            'aadDeviceId'
        ) -join ','

        $uri = 'https://graph.microsoft.com/beta/deviceManagement/virtualEndpoint/cloudPCs' +
               '?$filter=' + [uri]::EscapeDataString($filter) +
               '&$select=' + [uri]::EscapeDataString($select) +
               '&$top=50' +
               '&$orderBy=lastModifiedDateTime%20desc'

        $headers = @{
            ConsistencyLevel = 'eventual'
            Prefer           = 'include-unknown-enum-members'
        }

        Invoke-GraphPaged -Uri $uri -Headers $headers | ForEach-Object {
            $raw      = $_
            $isShared = ($raw.provisioningType -eq 'sharedByEntraGroup')

            if ($Type -eq 'Shared'    -and -not $isShared) { return }
            if ($Type -eq 'Dedicated' -and      $isShared) { return }

            [pscustomobject]@{
                PSTypeName             = 'WindowsCloudPC.CloudPC'
                Id                     = $raw.id
                Name                   = if ($raw.managedDeviceName) { $raw.managedDeviceName } else { $raw.displayName }
                ProvisioningType       = if ($isShared) { 'Shared' } else { 'Dedicated' }
                ProvisioningPolicyName = $raw.provisioningPolicyName
                ProvisioningPolicyId   = $raw.provisioningPolicyId
                ProvisioningStatus     = $raw.status
                ServicePlanName        = $raw.servicePlanName
                AssignedUserUpn        = if ($isShared) { $raw.sharedDeviceDetail.assignedToUserPrincipalName } else { $raw.userPrincipalName }
                ManagedDeviceId        = $raw.managedDeviceId
                AadDeviceId            = $raw.aadDeviceId
                LastModifiedDateTime   = if ($raw.lastModifiedDateTime) { ([datetime]$raw.lastModifiedDateTime).ToLocalTime() } else { $null }
                Raw                    = $raw
            }
        }
    }

    end { }
}