通过PowerShell脚本启动Azure虚拟桌面会话主机的问题排查
解决Azure虚拟桌面会话主机的Start-AzVM调用问题
问题核心
- 最初错误使用会话主机的
Status(Unavailable)判断是否需要启动,忽略了运行中主机也可能显示该状态,正确判断条件应为VM的电源状态为Deallocated。 - 调用
Start-AzVM时触发资源找不到错误,是因为误用了会话主机的Name属性(格式为host-pool/host-name),正确的VM名称需要从会话主机的ResourceId中提取。
正确实现步骤
1. 提取正确的VM标识
AVD会话主机的ResourceId属性包含对应VM的完整ARM资源ID,通过Split-Path -Leaf可直接获取准确的VM名称:
$vmName = Split-Path -Path $sessionHost.ResourceId -Leaf
2. 提取VM电源状态
调用Get-AzVM -Status后,返回对象的Statuses数组中,索引为1的元素对应电源状态。可通过Code字段(格式固定)判断,避免语言本地化影响:
$vmStatus = Get-AzVM -Name $vmName -ResourceGroupName $resourceGroup.ResourceGroupName -Status $powerState = $vmStatus.Statuses[1].Code.Split('/')[1] # 提取deallocated/running
3. 完整可运行脚本
# 检查Az模块是否安装 try { Get-InstalledModule -Name Az -ErrorAction Stop } catch { Write-Host "脚本需要Az模块,请安装后重新运行。" exit } # 指定目标资源组 $resourceGroupName = "ESOC-AVD-GREEN" $resourceGroup = Get-AzResourceGroup -Name $resourceGroupName # 获取主机池和会话主机列表 $hostPool = Get-AzWvdHostPool -ResourceGroupName $resourceGroup.ResourceGroupName $sessionHosts = Get-AzWvdSessionHost -HostPoolName $hostPool.Name -ResourceGroupName $resourceGroup.ResourceGroupName # 遍历会话主机,启动处于Deallocated状态的VM foreach ($sessionHost in $sessionHosts) { # 从ResourceId提取VM名称 $vmName = Split-Path -Path $sessionHost.ResourceId -Leaf # 获取VM电源状态 $vmStatus = Get-AzVM -Name $vmName -ResourceGroupName $resourceGroup.ResourceGroupName -Status $powerState = $vmStatus.Statuses[1].Code.Split('/')[1] # 判断并启动VM if ($powerState -eq "deallocated") { Write-Host "正在启动VM: $vmName" Start-AzVM -Name $vmName -ResourceGroupName $resourceGroup.ResourceGroupName } }
关键说明
- 禁止用会话主机的
Status字段判断电源状态:Unavailable仅表示AVD服务无法连接到主机,可能是VM关机或其他故障,不能直接作为启动依据。 - 依赖ARM资源ID提取VM名称:彻底避免会话主机名称格式导致的资源定位错误。
- 优先使用
Code字段判断电源状态:格式固定为PowerState/状态值,比DisplayStatus更稳定,不受语言设置影响。
内容的提问来源于stack exchange,提问作者theillien
相关产品推荐
相关产品推荐

