Public/Remove-AvdInsightsSessionHost.ps1

function Remove-AvdInsightsSessionHost {
    <#
    .SYNOPSIS
    Removes the AVD session host from AVD Insights.
    .DESCRIPTION
    The function will removed the monitoring extension from the session host.
    .PARAMETER HostpoolName
    Enter the name of the AVD hostpool's name.
    .PARAMETER ResourceGroupName
    Enter the name of the resourcegroup where the hostpool resides in.
    .PARAMETER Id
    Enter the session host's resource ID (NOT VM).
    .PARAMETER Name
    Enter the name of the session host.
    .PARAMETER Force
    Use this switch to force delete ALL session hosts from AVD Insights
    .EXAMPLE
    Remove-AvdInsightsSessionHost -HostPoolName avd-hostpool-001 -ResourceGroupName rg-avd-001 -Force
    .EXAMPLE
    Remove-AvdInsightsSessionHost -HostPoolName avd-hostpool-001 -ResourceGroupName rg-avd-001 -Name avd-0
    .EXAMPLE
    Remove-AvdInsightsSessionHost -Id /subscriptions/../sessionhosts/avd-0
    #>

    [CmdletBinding(DefaultParameterSetName = 'HostName')]
    param
    (
        [parameter(Mandatory, ParameterSetName = 'All')]
        [parameter(Mandatory, ParameterSetName = 'Hostname')]
        [ValidateNotNullOrEmpty()]
        [string]$HostpoolName,
    
        [parameter(Mandatory, ParameterSetName = 'All')]
        [parameter(Mandatory, ParameterSetName = 'Hostname')]
        [ValidateNotNullOrEmpty()]
        [string]$ResourceGroupName,
    
        [parameter(Mandatory, ParameterSetName = 'Hostname')]
        [ValidateNotNullOrEmpty()]
        [string]$Name,

        [parameter(Mandatory, ParameterSetName = 'Resource', ValueFromPipelineByPropertyName)]
        [ValidateNotNullOrEmpty()]
        [string]$Id,

        [parameter(ParameterSetName = 'All')]
        [ValidateNotNullOrEmpty()]
        [switch]$Force
    )
    Begin {
        Write-Verbose "[Remove-AvdInsightsSessionHost] - Start removing sessionhosts from insights"
        AuthenticationCheck
        $token = GetAuthToken -resource $Script:AzureApiUrl
        $sessionHostParameters = @{
            hostpoolName      = $HostpoolName
            resourceGroupName = $ResourceGroupName
        }
    }
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            All {
                CheckForce -Force:$force -Task $MyInvocation.MyCommand
            }
            Hostname {
                $Name = ConcatSessionHostName -name $Name
                $sessionHostParameters.Add("Name", $Name)
            }
            Resource {
                Write-Verbose "Got a resource object, looking for $Id"
                $sessionHostParameters = @{
                    Id = $Id
                }
            }
            default {
                Throw "Please provide proper parameters, at lease a hostpool and resourcegroup name"
            }
        }
        try {
            $sessionHosts = Get-AvdSessionHostResources @sessionHostParameters
        }
        catch {
            Throw "No sessionhosts ($name) found in $HostpoolName ($ResourceGroupName), $_"
        }
        try {
            Write-Information "[Remove-AvdInsightsSessionHost] - Sessionhosts found, removing from AVD Insights" -InformationAction Continue
            $sessionHosts | ForEach-Object {
                $vmObject = $_
                $vmPowerState = Get-AvdSessionHostPowerState -Id $vmObject.id
                if ($vmPowerState.powerstate -ne 'running') {
                    Write-Warning "[Remove-AvdInsightsSessionHost] - Sessionhost $($_.name) not running, starting machine from $($vmPowerState.powerstate) state"
                    Start-AvdSessionHost -Id $vmObject.id
                }
                $requestParameters = @{
                    uri     = "{0}{1}/extensions/{2}?api-version={3}" -f $Script:AzureApiUrl, $_.vmResources.id, "OMSExtenstion", "2022-08-01"
                    Method  = "DELETE"
                    Headers = $token
                }
                Invoke-RestMethod @requestParameters
                switch ($vmPowerState.powerstate) {
                    stopped {
                        Write-Information "[Remove-AvdInsightsSessionHost] - Sessionhost was $($vmPowerState.powerstate), bringing back to initial state" -InformationAction Continue
                        Stop-AvdSessionHost -Id $vmObject.id
                    }
                    deallocated {
                        Write-Information "[Remove-AvdInsightsSessionHost] - Sessionhost was $($vmPowerState.powerstate), bringing back to initial state" -InformationAction Continue
                        Stop-AvdSessionHost -Id $vmObject.id -Deallocate
                    }
                    default {
                        Write-Information "[Remove-AvdInsightsSessionHost] - Sessionhost was $($vmPowerState.powerstate), taking no further action" -InformationAction Continue
                    }
                }
            }
        }
        catch {
            Throw "[Remove-AvdInsightsSessionHost] - $_"
        }
        
    }
}