Public/Remove-CloudPCProvisioningPolicy.ps1

function Remove-CloudPCProvisioningPolicy {
    <#
    .SYNOPSIS
        Deletes a Windows 365 Cloud PC provisioning policy.

    .DESCRIPTION
        Deletes a Cloud PC provisioning policy by calling Microsoft Graph beta:
        DELETE /deviceManagement/virtualEndpoint/provisioningPolicies/{id}.

        Microsoft Graph cannot delete a provisioning policy that is still in use.
        This cmdlet supports -WhatIf / -Confirm and defaults to ConfirmImpact = 'High'.
        Use -Force to suppress the confirmation prompt in automation.

        Requires the CloudPC.ReadWrite.All scope; the cmdlet automatically
        reauthenticates through Connect-CloudPC if the current Graph session does
        not already have it.

    .PARAMETER Id
        The Cloud PC provisioning policy ID.

    .PARAMETER ProvisioningPolicy
        A WindowsCloudPC.ProvisioningPolicy object returned by Get-CloudPCProvisioningPolicy.

    .PARAMETER Force
        Suppress the confirmation prompt. Equivalent to -Confirm:$false.

    .PARAMETER PassThru
        Emit a WindowsCloudPC.ProvisioningPolicyRemoveResult object describing the outcome.
        By default the cmdlet is silent on success.

    .EXAMPLE
        Remove-CloudPCProvisioningPolicy -Id '96e8ec2e-949c-40ca-a345-100a0035d0d1' -WhatIf

        Previews deleting a provisioning policy by ID.

    .EXAMPLE
        Get-CloudPCProvisioningPolicy -Id '96e8ec2e-949c-40ca-a345-100a0035d0d1' |
            Remove-CloudPCProvisioningPolicy -Force -PassThru

        Deletes a provisioning policy from the pipeline and emits the delete result.
    #>

    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High', DefaultParameterSetName = 'ById')]
    [OutputType('WindowsCloudPC.ProvisioningPolicyRemoveResult')]
    param(
        [Parameter(Mandatory, ValueFromPipelineByPropertyName, ParameterSetName = 'ById')]
        [Alias('ProvisioningPolicyId')]
        [string]$Id,

        [Parameter(Mandatory, ValueFromPipeline, ParameterSetName = 'ByObject')]
        [PSTypeName('WindowsCloudPC.ProvisioningPolicy')]
        [object]$ProvisioningPolicy,

        [switch]$Force,

        [switch]$PassThru
    )

    begin {
        if ($Force -and -not $PSBoundParameters.ContainsKey('Confirm')) {
            $ConfirmPreference = 'None'
        }

        Connect-CloudPC -AdditionalScopes 'CloudPC.ReadWrite.All' | Out-Null
    }

    process {
        if ($PSCmdlet.ParameterSetName -eq 'ByObject') {
            $policyId = $ProvisioningPolicy.Id
            $policyName = if ($ProvisioningPolicy.DisplayName) { $ProvisioningPolicy.DisplayName } else { $ProvisioningPolicy.Id }
        }
        else {
            $policyId = $Id
            $policyName = $Id
        }

        if (-not $policyId) {
            Write-Error 'Remove-CloudPCProvisioningPolicy: provisioning policy Id is empty; nothing to delete.'
            return
        }

        $target = "Cloud PC provisioning policy '$policyName' ($policyId)"
        $status = 'WhatIf'
        $errorMessage = $null

        if ($PSCmdlet.ShouldProcess($target, 'Delete provisioning policy')) {
            try {
                $escapedId = [uri]::EscapeDataString($policyId)
                $uri = "https://graph.microsoft.com/beta/deviceManagement/virtualEndpoint/provisioningPolicies/$escapedId"
                Invoke-MgGraphRequest -Method DELETE -Uri $uri | Out-Null
                $status = 'Deleted'
                Write-Verbose "Remove-CloudPCProvisioningPolicy: deleted $target"
            }
            catch {
                $status = 'Failed'
                $errorMessage = if ($_.ErrorDetails -and $_.ErrorDetails.Message) {
                    $_.ErrorDetails.Message
                }
                else {
                    $_.Exception.Message
                }
                Write-Error -Message "Remove-CloudPCProvisioningPolicy: delete failed for $target. $errorMessage" -Exception $_.Exception
            }
        }

        if ($PassThru) {
            [pscustomobject]@{
                PSTypeName   = 'WindowsCloudPC.ProvisioningPolicyRemoveResult'
                Id           = $policyId
                DisplayName  = $policyName
                Status       = $status
                RequestedAt  = [datetime]::Now
                ErrorMessage = $errorMessage
            }
        }
    }

    end { }
}