Public/Enable-AvdSessionHost.ps1

function Enable-AvdSessionHost {
    <#
    .SYNOPSIS
    Enable login for sessionhosts.
    .DESCRIPTION
    The function gets a session host out of drainmode, which means that users are able to login to that host.
    .PARAMETER HostpoolName
    Enter the source AVD Hostpool name
    .PARAMETER ResourceGroupName
    Enter the source Hostpool resourcegroup name
    .PARAMETER Name
    Enter the sessionhosts name avd-host-1.avd.domain
    .PARAMETER Id
    Enter the session host's resource ID
    .PARAMETER Force
    Use the -Force switch to disable session hosts without interaction
    .EXAMPLE
    Enable-AvdSessionHost -HostpoolName avd-hostpool -ResourceGroupName rg-avd-01 -Nameavd-host-1.avd.domain
    .EXAMPLE
    Enable-AvdSessionHost -HostpoolName avd-hostpool -ResourceGroupName rg-avd-01 -Force
    #>

    [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 = 'Hostname')]
        [ValidateNotNullOrEmpty()]
        [string]$Name,

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

        [parameter(ParameterSetName = 'All')]
        [ValidateNotNullOrEmpty()]
        [switch]$Force
    )
    Begin {
        Write-Verbose "Enabling session hosts"
        AuthenticationCheck
        $token = GetAuthToken -resource $Script:AzureApiUrl
        $apiVersion = "?api-version=2022-02-10-preview"
        $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
                }
            }
        }
        try {
            $sessionHosts = Get-AvdSessionHost @sessionHostParameters
        }
        catch {
            Throw "No sessionhosts ($name) found in $HostpoolName ($ResourceGroupName), $_"
        }
        try {
            $sessionHosts | ForEach-Object {
                Write-Verbose "Found $($_.Count) host(s)"
                Write-Verbose "Enable login for $($_.name)"
                $body = @{
                    properties = @{
                        AllowNewSession = $true
                    }
                }
                $enableParameters = @{
                    uri     = "{0}{1}{2}" -f $Script:AzureApiUrl, $_.id, $apiVersion
                    Method  = "PATCH"
                    Headers = $token
                    Body    = $body | ConvertTo-Json
                }
                Invoke-RestMethod @enableParameters
                Write-Information -MessageData "Login is enabled for $($_.name)" -InformationAction Continue
            }
        }
        catch {
            Throw "Not able to enable login for $($_.name), $_"
        }
    }
}