functions/DesktopVirtualization/SessionHosts/Register-AVDMFSessionHost.ps1

function Register-AVDMFSessionHost {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true , ValueFromPipelineByPropertyName = $true )]
        [string] $AccessLevel,
        [Parameter(Mandatory = $true , ValueFromPipelineByPropertyName = $true )]
        [string] $HostPoolType,
        [Parameter(Mandatory = $true , ValueFromPipelineByPropertyName = $true )]
        [string] $HostPoolInstance,
        [Parameter(Mandatory = $true , ValueFromPipelineByPropertyName = $true )]
        [string] $ResourceGroupName,
        [Parameter(Mandatory = $true , ValueFromPipelineByPropertyName = $true )]
        [int] $InstanceNumber,

        [Parameter(Mandatory = $true , ValueFromPipelineByPropertyName = $true )]
        [object] $VMTemplate,

        [Parameter(Mandatory = $true , ValueFromPipelineByPropertyName = $true )]
        [object] $SubnetID,

        [Parameter(Mandatory = $true , ValueFromPipelineByPropertyName = $true )]
        [ValidateSet("AAD", "ADDS")]
        [string] $SessionHostJoinType,

        [Parameter(Mandatory = $false , ValueFromPipelineByPropertyName = $true )]
        [string] $DomainName,

        [Parameter(Mandatory = $false , ValueFromPipelineByPropertyName = $true )]
        [string] $OUPath,

        [Parameter(Mandatory = $false , ValueFromPipelineByPropertyName = $true )]
        [string] $AvailabilityZone = '',

        [PSCustomObject] $Tags = [PSCustomObject]@{}

    )
    process {
        $ResourceName = New-AVDMFResourceName -ResourceType 'VirtualMachine' -AccessLevel $AccessLevel -HostPoolType $HostPoolType -HostPoolInstance $HostPoolInstance -InstanceNumber $InstanceNumber

        $script:SessionHosts[$resourceName] = [PSCustomObject]@{ # TODO: Is it a good idea to switch this to hashtable not custom object?
            ResourceGroupName     = $ResourceGroupName
            VMSize                = $VMTemplate.VMSize
            TimeZone              = $script:TimeZone
            SubnetID              = $SubnetID
            AdminUsername         = $VMTemplate.AdminUserName
            AdminPassword         = $VMTemplate.AdminPassword
            ImageReference        = $VMTemplate.ImageReference
            AcceleratedNetworking = $VMTemplate.AcceleratedNetworking
            Tags                  = $Tags
            AvailabilityZone      = $AvailabilityZone
            PreJoinRunCommand     = $VMTemplate.PreJoinRunCommand

            # Add Session Host
            WVDArtifactsURL       = $VMTemplate.WVDArtifactsURL

            SessionHostJoinType   = $SessionHostJoinType
        }
        # AAD or Domain Join
        switch ($SessionHostJoinType) {
            "AAD" {

            }
            "ADDS" {
                $script:SessionHosts[$resourceName] | Add-Member -MemberType NoteProperty -Name DomainName -Value $DomainName
                $script:SessionHosts[$resourceName] | Add-Member -MemberType NoteProperty -Name OUPath -Value $OUPath
                $script:SessionHosts[$resourceName] | Add-Member -MemberType NoteProperty -Name DomainJoinUserName -Value $script:DomainJoinUserName
                $script:SessionHosts[$resourceName] | Add-Member -MemberType NoteProperty -Name DomainJoinPassword -Value $script:DomainJoinPassword
            }
        }
    }
}