获取远程桌面服务部署中所有未使用的 SessionHost

Get all unused SessionHosts in a Remote Desktop Service Deployment

我正在尝试获取 RDS 部署中所有未使用的 SessionHost。

在代码的末尾,我得到了两个列表,其中包含所有 SessionHost 和所有已使用的 SessionHost,我想比较这两个列表以获取所有未使用的主机。

为了比较,我尝试了 .

# ALL SessionHosts
$RDSessionHost = (Get-RDserver -Role "RDS-RD-SERVER" -ConnectionBroker $ConnectionBrooker).Server
Write-Host "Alle SessionHosts:" -ForegroundColor Green

# All SessionCollections
$RDSessionCollections = (Get-RDSessionCollection -ConnectionBroker $ConnectionBrooker).Collectionname

# ALL used SessionHosts
foreach($p in $RDSessionCollections){
$used = (Get-RDSessionHost -CollectionName $p -ConnectionBroker $ConnectionBrooker).SessionHost
}

#ALL unused SessionHosts
$unused = ($RDSessionHost | Where {$used -NotContains $_})

结果

ALL SessionHosts:
SessionHost1
SessionHost2
SessionHost12
SessionHost11
SessionHost10
SessionHost9
SessionHost6
SessionHost8
SessionHost5
SessionHost3
SessionHost4
SessionHost7

ALL USED SessionHosts:
SessionHost1
SessionHost2
SessionHost11
SessionHost10
SessionHost9
SessionHost6
SessionHost7
SessionHost5
SessionHost4
SessionHost3

ALL UNUSED SessionHosts:
SessionHost1
SessionHost2
SessionHost12
SessionHost11
SessionHost10
SessionHost9
SessionHost6
SessionHost8
SessionHost5
SessionHost3
SessionHost4
SessionHost7

但只有两个未使用:SessionHost8 和 SessionHost12

要在一个 array 中查找那些不在另一个 array 中的项目,您应该使用 Where-Object cmdlet 和比较运算符,例如 -contains-notcontains .像这样:

$array1 = @('A','B','C','D','E','F')
$array2 = @('A','B','F')
$array1 | Where-Object {$array2 -notcontains $_ }
C
D
E

此外,在您的代码中,$used 变量将始终只包含一项,因为您在每个 foreach 循环中都覆盖了它的值。

# ALL used SessionHosts
foreach($p in $RDSessionCollections){
$used = (Get-RDSessionHost -CollectionName $p -ConnectionBroker $ConnectionBrooker).SessionHost
}

您可能希望显式创建 array variable 并将使用的主机值添加到其中。

# ALL used SessionHosts
$used = @()
foreach($p in $RDSessionCollections){
$used += (Get-RDSessionHost -CollectionName $p -ConnectionBroker $ConnectionBrooker).SessionHost
}

为了过滤未使用的 SessionHost,您可能想使用 $RDSessionCollections

$unused = ($RDSessionCollections| Where {$used -NotContains $_})

而不是$RDSessionHost

$unused = ($RDSessionHost | Where {$used -NotContains $_})