diff --git a/CHANGELOG.md b/CHANGELOG.md index bd77749..09b90ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Deployments are now tested for WebAccess and SessionHosts as well - Resource can extend an existing deployment with more session hosts and web access servers - ConnectionBroker is only remaining key since the broker can only broker one deployment + - Servers can be also removed from the deployment. + - Test function now uses `Test-DscParameterState` internally. - xRDServer - Improve error handling in Set-TargetResource function for Add-RDServer cmdlet, fixes [issue #111](https://github.com/dsccommunity/xRemoteDesktopSessionHost/issues/111). diff --git a/source/DSCResources/MSFT_xRDSessionDeployment/MSFT_xRDSessionDeployment.psm1 b/source/DSCResources/MSFT_xRDSessionDeployment/MSFT_xRDSessionDeployment.psm1 index bb54e2f..805ea05 100644 --- a/source/DSCResources/MSFT_xRDSessionDeployment/MSFT_xRDSessionDeployment.psm1 +++ b/source/DSCResources/MSFT_xRDSessionDeployment/MSFT_xRDSessionDeployment.psm1 @@ -42,9 +42,9 @@ function Get-TargetResource $deployed = Get-RDServer -ConnectionBroker $ConnectionBroker -ErrorAction SilentlyContinue @{ - SessionHost = [System.String[]] ($deployed | Where-Object Roles -Contains 'RDS-RD-SERVER' | ForEach-Object Server) + SessionHost = [string[]]($deployed | Where-Object Roles -Contains 'RDS-RD-SERVER' | ForEach-Object Server) ConnectionBroker = $deployed | Where-Object Roles -Contains 'RDS-CONNECTION-BROKER' | ForEach-Object Server - WebAccessServer = $deployed | Where-Object Roles -Contains 'RDS-WEB-ACCESS' | ForEach-Object Server + WebAccessServer = [string[]]($deployed | Where-Object Roles -Contains 'RDS-WEB-ACCESS' | ForEach-Object Server) } } @@ -87,11 +87,23 @@ function Set-TargetResource Add-RDServer -Server $server -Role 'RDS-RD-SERVER' -ConnectionBroker $ConnectionBroker } + foreach ($server in ($currentStatus.SessionHost | Where-Object { $_ -notin $SessionHost })) + { + Write-Verbose "Removing server '$server' from deployment." + Remove-RDServer -Server $server -Role 'RDS-RD-SERVER' -ConnectionBroker $ConnectionBroker -Force + } + foreach ($server in ($WebAccessServer | Select-Object -Skip 1 | Where-Object { $_ -notin $currentStatus.WebAccessServer })) { - Write-Verbose "Adding server '$server' to deployment." + Write-Verbose "Adding Web Server '$server' to deployment." Add-RDServer -Server $server -Role 'RDS-WEB-ACCESS' -ConnectionBroker $ConnectionBroker } + + foreach ($server in ($currentStatus.WebAccessServer | Where-Object { $_ -notin $WebAccessServer })) + { + Write-Verbose "Removing Web Server '$server' from deployment." + Remove-RDServer -Server $server -Role 'RDS-WEB-ACCESS' -ConnectionBroker $ConnectionBroker -Force + } } ####################################################################### @@ -112,41 +124,17 @@ function Test-TargetResource ) Write-Verbose 'Checking RDSH role is deployed on this node.' - $currentStatus = Get-TargetResource @PSBoundParameters - if ($currentStatus.ConnectionBroker -ne $ConnectionBroker) - { - Write-Verbose -Message "Found connection broker '$($currentStatus.ConnectionBroker)', expected '$ConnectionBroker'" - return $false - } + $desiredState = $PSBoundParameters + $currentState = Get-TargetResource @PSBoundParameters - if ($WebAccessServer.Count -gt 0 -and $null -eq $currentStatus.WebAccessServer) - { - Write-Verbose -Message "Desired list of Web Access Servers is empty, while $($WebAccessServer.Count) Web Access Servers should have been configured." - return $false - } - - $compare = Compare-Object -ReferenceObject $WebAccessServer -DifferenceObject $currentStatus.WebAccessServer - if ($null -ne $compare) - { - Write-Verbose -Message "Desired list of Web Access Servers not equal`r`n$($compare | Out-String)" - return $false - } - - if ($SessionHost.Count -gt 0 -and $null -eq $currentStatus.SessionHost) - { - Write-Verbose -Message "Desired list of session hosts is empty, while $($SessionHost.Count) session hosts should have been configured." - return $false - } - - $compare = Compare-Object -ReferenceObject $SessionHost -DifferenceObject $currentStatus.SessionHost - if ($null -ne $compare) - { - Write-Verbose -Message "Desired list of session hosts not equal`r`n$($compare | Out-String)" - return $false - } + $result = Test-DscParameterState ` + -CurrentValues $currentState ` + -DesiredValues $desiredState ` + -SortArrayValues ` + -Verbose:$VerbosePreference - $true + return $result } Export-ModuleMember -Function *-TargetResource