Private/Deallocate-AvdSessionHost.ps1
function DeallocateAvdSessionHost { <# .SYNOPSIS Deallocates AVD Session hosts in a specific hostpool. .DESCRIPTION It is almost the same as the Stop-AvdSessionHost command but this function also deallocates the session host in a specific Azure Virtual Desktop hostpool. Deallocated machines does not have an Azure consumption which saves money. .PARAMETER HostpoolName Enter the AVD Hostpool name .PARAMETER ResourceGroupName Enter the AVD Hostpool resourcegroup name .PARAMETER Name Enter the session hosts name .PARAMETER Id Enter the sessionhost's resource ID .PARAMETER Force Use this switch parameter to force deallocate all machine. Only needed when if you did not provide a sessionhost name. .EXAMPLE Deallocate-AvdSessionHost -HostpoolName avd-hostpool-personal -ResourceGroupName rg-avd-01 -Force .EXAMPLE Deallocate-AvdSessionHost -HostpoolName avd-hostpool-personal -ResourceGroupName rg-avd-01 -Name avd-host-1.avd.domain .EXAMPLE Get-AvdSessionHost -HostpoolName avd-hostpool-personal -ResourceGroupName rg-avd-01 -Name avd-host-1.avd.domain | Deallocate-AvdSessionHost #> [CmdletBinding(DefaultParameterSetName = 'All')] 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 = 'All')] [parameter(Mandatory, ParameterSetName = 'Hostname')] [ValidateNotNullOrEmpty()] [string]$Name, [parameter(Mandatory, ParameterSetName = 'Resource', ValueFromPipelineByPropertyName)] [ValidateNotNullOrEmpty()] [string]$Id, [parameter(ParameterSetName = 'All')] [ValidateNotNullOrEmpty()] [switch]$Force ) Begin { Write-Verbose "Deallocating session hosts" AuthenticationCheck $token = GetAuthToken -resource $Script:AzureApiUrl $sessionHostParameters = @{ hostpoolName = $HostpoolName resourceGroupName = $ResourceGroupName } $apiVersion = "?api-version=2022-03-01" } 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 { } } try { $sessionHosts = Get-AvdSessionHost @sessionHostParameters } catch { Throw "No sessionhosts ($name) found in $HostpoolName ($ResourceGroupName), $_" } $sessionHosts | ForEach-Object { try { Write-Verbose "Found $($sessionHosts.Count) host(s)" Write-Verbose "Deallocating $($_.name)" $powerOffParameters = @{ uri = "{0}{1}/deallocate{2}" -f $Script:AzureApiUrl, $_.properties.resourceId, $apiVersion Method = "POST" Headers = $token } Invoke-RestMethod @powerOffParameters Write-Information -MessageData "$($_.name) deallocated" -InformationAction Continue } catch { Throw "Not able to deallocate $($_.name), $_" } } } } |